Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何从无限卷轴网站中删除所有内容?发痒的_Python_Web Scraping_Scrapy_Web Crawler_Sitemap - Fatal编程技术网

Python 如何从无限卷轴网站中删除所有内容?发痒的

Python 如何从无限卷轴网站中删除所有内容?发痒的,python,web-scraping,scrapy,web-crawler,sitemap,Python,Web Scraping,Scrapy,Web Crawler,Sitemap,我用的是刮痧 我正在使用的网站有无限的滚动 这个网站上有很多帖子,但我只抓到了13篇 如何刮去其余的帖子 这是我的密码: class exampleSpider(scrapy.Spider): name = "example" #from_date = datetime.date.today() - datetime.timedelta(6*365/12) allowed_domains = ["example.com"] start_urls = [ "http://www.examp

我用的是刮痧

我正在使用的网站有无限的滚动

这个网站上有很多帖子,但我只抓到了13篇

如何刮去其余的帖子

这是我的密码:

class exampleSpider(scrapy.Spider):
name = "example"
#from_date = datetime.date.today() - datetime.timedelta(6*365/12)
allowed_domains = ["example.com"]
start_urls = [
    "http://www.example.com/somethinghere/"
]

def parse(self, response):
  for href in response.xpath("//*[@id='page-wrap']/div/div/div/section[2]/div/div/div/div[3]/ul/li/div/h1/a/@href"):
    url = response.urljoin(href.extract())
    yield scrapy.Request(url, callback=self.parse_dir_contents)


def parse_dir_contents(self, response):
    #scrape contents code here

我想您正在寻找类似于
深度限制的东西


我认为您需要的是一个与您的正常逻辑相同的分页逻辑

在大多数情况下,..无限滚动==paging,在这样的页面上,当您向下滚动到页面的3/4或直到页面结束时,页面触发AJAX调用并下载下一页内容,并将响应加载到当前页面

我建议在firefox中使用
networkmonitor
工具,并在向下滚动时注意任何此类页面请求


--线索:您将在使用或实施此解决方案时

显然,目标站点会动态上传其内容。因此,有两种合适的解决方案:

  • 对jQuery交互进行微妙的解密,并尝试模拟与服务器的数据交换

  • 使用另一种工具进行此特定作业。例如,在我看来,这是一个值得关注的正确选择


  • 我使用的是
    Selenium
    而不是
    scrapy
    ,但您必须能够执行相同的操作,我所做的是在加载文件时运行一些JavaScript,即:

    driver.execute_脚本(“window.scrollTo(0,document.body.scrollHeight);”)


    我不会一直这样做,直到它不再滚动。它不美观,不能用于生产,但对特定工作有效。

    查看网站代码

    如果无限滚动自动触发js动作,您可以使用Alioth方案如下:

    在Spyner之后,您可以找到可以触发jquery事件的

    查找库代码以查看可以触发哪种类型的事件

    尝试生成一个scroll to bottom事件,或在网站中可滚动内容内的任何div上创建css属性更改。下面是spynner,类似于:

    browser = spynner.Browser(debug_level=spynner.DEBUG, debug_stream=debug_stream)
    # load here your website as spynner allows
    browser.load_jquery(True)
    ret = run_debug(browser.runjs,'window.scrollTo(0, document.body.scrollHeight);console.log(''scrolling...);')
    # continue parsing ret 
    
    无限滚动不太可能是由锚链接触发的,但可能是由jquery操作触发的,而不一定是附加到链接上的。对于这种情况,请使用如下代码:

    br.load('http://pypi.python.org/pypi')
    
    anchors = br.webframe.findAllElements('#menu ul.level-two a')
    # chooses an anchor with Browse word as key
    anchor = [a for a in anchors if 'Browse' in a.toPlainText()][0]
    br.wk_click_element_link(anchor, timeout=10)
    output = br.show()
    # save output in file: output.html or 
    # plug this actions into your scrapy method and parse output var as you do 
    # with response body
    
    然后,在output.html文件上运行scrapy,或者,如果您实现了它,则使用您选择的本地内存变量在js操作后存储修改后的html

    另一种解决方案是,如果访问者浏览器未激活,您尝试解析的网站可能会有一个备用呈现版本

    尝试使用禁用javascript的浏览器呈现网站,也许这样,网站会在内容部分的末尾提供一个锚定链接


    此外,还有使用Scrapy和Selenium的方法成功实现了爬虫js导航,详细内容见so答案

    在某些情况下,您可以在源代码中找到被调用以运行“下一页”分页的元素,即使在无限滚动中也是如此。所以你只要点击这个元素,它就会显示其余的帖子。含scrapy/selenium:

    next = self.driver.find_element_by_xpath('//a[@class="nextResults"]')
    next.click()
    time.sleep(2) 
    

    我尝试在设置中设置深度限制,但仍然无法进入。。它在获取所有这些链接时遇到了困难:“www.example.com/blog/2016/05/13”,但它没有点击链接并在内部刮取。很抱歉,我不明白它在哪里被卡住了。你可以在线查看一些例子,比如深度限制是指所有的链接。假设你的页面是第一级的,如果你点击了一个链接。这将是一级,并继续。。。这是用于非无限滚动的深度限制…是否使用
    Scrapy
    也将运行JavaScript?谢谢您的完美答案。♥