【问题标题】:How to scrape all contents from infinite scroll website? scrapy如何从无限滚动网站上抓取所有内容?刮擦
【发布时间】:2016-09-09 12:43:19
【问题描述】:

我正在使用scrapy。

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

该网站有很多帖子,但我只刮了 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

【问题讨论】:

    标签: python web-scraping scrapy web-crawler sitemap


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      检查网站代码。

      如果无限滚动自动触发js动作,你可以使用Alioth提案进行如下操作:spynner

      关注spynnerdocs,可以发现可以触发jquery事件。

      查看库代码以了解您可以触发哪种事件。

      尝试在网站的可滚动内容内的任何 div 上生成 滚动到底部 事件或创建 css 属性更改。关注 spynner docs,类似:

      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。

      作为另一种解决方案,您尝试解析的网站可能有一个替代渲染版本,以防访问者浏览器没有激活js。

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

      还有 成功 实现了爬虫 js 导航,它使用了带有 Scrapy 和 Selenium 的方法,在 this 中有详细说明,所以请回答。

      【讨论】:

      • 感谢您的完美回答。 ♥
      【解决方案3】:

      我使用Selenium而不是scrapy,但你必须能够做同样的事情,我所做的是在加载文件时运行一些JavaScript,即:

      driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

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

      【讨论】:

      • 使用Scrapy是否也会运行JavaScript?
      【解决方案4】:

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

      1. 解密jQuery交互并尝试模拟与服务器manually的数据交换

      2. 使用其他工具完成此特定工作。例如,spynner 在我看来是一个值得关注的正确选择。

      【讨论】:

        【解决方案5】:

        我认为您正在寻找的是与正常逻辑一起的分页逻辑

        在大多数情况下..无限滚动 == 分页,当您向下滚动到页面的 3/4 或直到页面末尾时,页面会触发 AJAX 调用并下载下一个页面内容并将响应加载到当前页面

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

        -- 线索:您将在实施此解决方案时使用scrapy.FormRequestscrapy.FormRequest.from_response

        【讨论】:

          【解决方案6】:

          【讨论】:

          • 我尝试在我的设置中设置深度限制,但仍然无法进入.. 它卡在获取所有这些链接:"www.example.com/blog/2016/05/13" 但它没有点击链接并在里面刮..
          • 抱歉,我不明白它卡在哪里了。您可以在线查看一些示例,例如 github.com/scrapy/dirbot/blob/master/dirbot/spiders/dmoz.py
          • 深度限制是去所有存在的链接。假设您所在的页面是第一级,如果您单击其上的链接。它将是 1 级并继续...这是用于不用于无限滚动的 DEPTH-LIMIT ...
          猜你喜欢
          • 2020-05-30
          • 1970-01-01
          • 2012-09-13
          • 2021-07-23
          • 1970-01-01
          • 2013-11-11
          • 2021-07-06
          • 2021-11-01
          • 1970-01-01
          相关资源
          最近更新 更多