2016-05-13 61 views
5

我正在使用scrapy。如何从无限滚动网站上刮取所有内容? 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 

回答

1
+0

我试着把深度限制在我的设置中,但仍然无法进入..它坚持获得所有这些链接:“www.example.com/blog/2016/05/13”但它没有点击链接并在里面刮.. – Michimcchicken

+0

对不起,我不明白它卡在哪里。你可以在网上查看一些例子,例如https://github.com/scrapy/dirbot/blob/master/dirbot/spiders/dmoz.py – WannaBeCoder

+0

你能查看我的最后一次编辑吗?我想知道它是否有帮助D: – Michimcchicken

1

我想你在找什么是分页逻辑一起一边你的正常逻辑

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

我会建议在Firefox中使用network monitor工具,当你向下滚动

发现任何这样的页面请求 - 线索:您将使用scrapy.FormRequestscrapy.FormRequest.from_response而这一解决方案

1

显然,该目标站点动态地上传其内容。因此有两个相应的解决方案有:

  1. 在细微之处解密jQuery的互动,尽量模拟与服务器manually

  2. 使用另一种工具适合做这份工作的数据交换。例如spynner在我看来是一个正确的选择要注意。

1

我用Selenium而不是scrapy但是你必须能够做到相当于什么,我做的是加载文件,即运行一些JavaScript代码:

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

我突出部分保持这样做直到它不再滚动。它不漂亮,不能在生产中使用,但对特定工作有效。

+0

是否使用'Scrapy'也会运行JavaScript? –

1

检查网站代码。

如果无限滚动自动触发JS行动,你可以继续使用玉衡建议如下: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 

这是不太可能的无限滚动由锚链接触发,但也许可以用一个jQuery动作来触发,不necesarry连接到的链接。对于这种情况,使用如下代码:对output.html文件

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 

然后,运行scrapy或者,如果你实现它的话,使用本地内存变量您选用存储JS行动后修改HTML 。

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

尝试渲染带有JavaScript禁用浏览器的网站,也许这样,网站在内容部分末尾提供锚链接。

还有成功实现爬虫js导航使用的方法与Scrapy一起用Selenium详述于this这样回答。

+1

谢谢你的完美答案。 ♥ –