如何从无限滚动网站刮取所有内容?scrapy

Mic*_*ken 8 python sitemap web-crawler scrapy web-scraping

我正在使用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
Run Code Online (Sandbox Code Playgroud)

Evh*_*vhz 8

检查网站代码。

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

在 spynner docs 之后,您可以发现可以触发 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 
Run Code Online (Sandbox Code Playgroud)

无限滚动不太可能由锚链接触发,但可能可以由 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
Run Code Online (Sandbox Code Playgroud)

然后,在 output.html 文件上运行 scrapy,或者,如果您实现了它,则使用您选择的本地内存变量在 js 操作之后存储修改后的 html。

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

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

此外,还使用 Scrapy 和 Selenium 的方法成功实现了爬虫 js 导航,在这个so 答案中详述。


Hen*_*ryM 6

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

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

我只是继续这样做,直到它不再滚动。它不漂亮,不能用于生产,但对特定工作有效。