2016-08-18 54 views
0

我最近正在一个网站蜘蛛工作,并且注意到它请求无限数量的页面,因为一个网站没有编码他们的分页来停止。Scrapy - 如何避免分页黑洞?

因此,尽管他们只有内容几页,它仍然会产生下一个链接和网址...?页= 400,...?页= 401等

内容没不会改变,只是网址。当内容停止更改时,有没有办法让Scrapy停止分页?或者我可以编写自定义的东西。

+0

你需要跟踪的东西,改变,当它已经不停止,即网页标题或显示结果的标题(你可以通过一个XPath分析文本明显地查询)。 – Jan

+0

但是,我会如何将它链接到一个URL,它即将刮掉并阻止LinkExtractor使用它?将它集成到CrawlSpider中已经超出了我的想象。 –

回答

1

如果内容没有改变,您可以将当前页面的内容与前一页面进行比较,如果相同,则中断爬网。

例如:

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} 
+0

将'yield'和'return'混合起来是行不通的,但限制产品链接的一般想法是非常有趣的。另外,不妨在产生产品'Request'对象之前测试'response.meta.get('prev_urls')== product_urls'。 –

+1

@paultrmbrth谢谢,开始时移动了支票。尽管只要'return'不返回任何东西,混合返回和yield就可以在python2中正常工作,但它在这里的作用就像'break'。 – Granitosaurus

+0

哦,对。我从来不知道:) Thx –