2017-06-13 52 views
1

所以我想刮从分页网站的文章。基本上,每个页面都是文章链接的列表,并且蜘蛛遵循parse_article方法在页面上的链接以及在下一个连续页面链接之后。但是,在给定数量的文章被刮掉后,有没有办法让这个停止?例如,这是我迄今使用crawlspiderScrapy在条件下停止分页?

rules = (

    #next page rule: 
    Rule(LinkExtractor(restrict_xpaths="//a[@class='next']"),follow=True) 

    #Extract all internal links which follows this regex: 
    Rule(LinkExtractor(allow=('REGEXHERE',),deny=()),callback='parse_article'), 
) 

def parse_article(self, response): 
    #do parsing stuff here 

我想停下来之后的下一个页面,一旦我已经解析了150篇。无论我是否超过150,我只是想在达到这个数字后停止进入下一页。有没有办法做到这一点?就像在parse_article方法中有一个计数器一样? scrapy只是新的,所以我不知道该怎么尝试....我看着depth_limit,但我不太确定这就是我正在寻找的。

任何帮助将不胜感激,谢谢!

回答

4

你可以做到这一点通过设置:

CLOSESPIDER_ITEMCOUNT = 150

在您的项目设置。

如果你已经在你的项目中多个蜘蛛,只是想一个特定于该设置的影响,在custom_settings设置类变量:

custom_settings = { 'CLOSESPIDER_ITEMCOUNT': 150 } 
+0

感谢您的建议!但是,对于一个包含多个蜘蛛的项目,是否可以让这个'CLOSESPIDER_ITEMCOUNT'只适用于一个蜘蛛? – ocean800

+1

@ ocean800我已经更新了我的答案。请尝试让我知道它是否按预期工作 –

+0

对不起,对于迟到的回复,但它的工作,谢谢:) – ocean800

1

我把我的蜘蛛的方法是实际上有一个donescraping标志,我在每个parse_ *函数中检查它的第一件事情,并返回结果的空列表。

这增加了允许已经在下载队列中的项目和URL完成发生而不获取任何MORE项目的优雅行为。

我从来没有使用CLOSESPIDER_ITEMCOUNT,所以我不知道如果“优雅地”关闭蜘蛛。我希望它不会

在每一个解析函数的开头:

#early exit if done scraping 
    if self.donescraping: 
     return None 
+1

在某些情况下,您可能需要'返回[]'取决于解析函数。 :) – RabidCicada

+0

感谢您的答案!只是试图了解更多 - 这里的蜘蛛究竟如何关闭?我不明白在解析函数中如何返回'None' /'[]'响应会阻止'CrawlSpider' /'LinkExtractor'爬取更多链接? – ocean800

+1

当蜘蛛用完下载队列中的东西时,它会自行关闭。我的解决方案是在完成处理当前收集的项目之后,让它在没有更多项目的情况下优雅地关闭,而不是立即退出。 – RabidCicada