我最近正在一个网站蜘蛛工作,并且注意到它请求无限数量的页面,因为一个网站没有编码他们的分页来停止。Scrapy - 如何避免分页黑洞?
因此,尽管他们只有内容几页,它仍然会产生下一个链接和网址...?页= 400,...?页= 401等
内容没不会改变,只是网址。当内容停止更改时,有没有办法让Scrapy停止分页?或者我可以编写自定义的东西。
我最近正在一个网站蜘蛛工作,并且注意到它请求无限数量的页面,因为一个网站没有编码他们的分页来停止。Scrapy - 如何避免分页黑洞?
因此,尽管他们只有内容几页,它仍然会产生下一个链接和网址...?页= 400,...?页= 401等
内容没不会改变,只是网址。当内容停止更改时,有没有办法让Scrapy停止分页?或者我可以编写自定义的东西。
如果内容没有改变,您可以将当前页面的内容与前一页面进行比较,如果相同,则中断爬网。
例如:
def parse(self, response):
product_urls = response.xpath("//a/@href").extract()
# check last page
if response.meta.get('prev_urls') == product_urls:
logging.info('reached the last page at: {}'.format(response.url))
return # reached the last page
# crawl products
for url in product_urls:
yield Request(url, self.parse_product)
# create next page url
next_page = response.meta.get('page', 0) + 1
next_url = re.sub('page=\d+', 'page={}'.format(next_page), response.url)
# now for the next page carry some data in meta
yield Request(next_url,
meta={'prev_urls': product_urls,
'page': next_page}
将'yield'和'return'混合起来是行不通的,但限制产品链接的一般想法是非常有趣的。另外,不妨在产生产品'Request'对象之前测试'response.meta.get('prev_urls')== product_urls'。 –
@paultrmbrth谢谢,开始时移动了支票。尽管只要'return'不返回任何东西,混合返回和yield就可以在python2中正常工作,但它在这里的作用就像'break'。 – Granitosaurus
哦,对。我从来不知道:) Thx –
你需要跟踪的东西,改变,当它已经不停止,即网页标题或显示结果的标题(你可以通过一个XPath分析文本明显地查询)。 – Jan
但是,我会如何将它链接到一个URL,它即将刮掉并阻止LinkExtractor使用它?将它集成到CrawlSpider中已经超出了我的想象。 –