【问题标题】:Scrapy stopping pagination on condition?Scrapy在条件下停止分页?
【发布时间】:2017-11-14 13:51:54
【问题描述】:

所以我想从一个有分页的网站上抓取文章。基本上,每个页面都是一个文章链接列表,并且蜘蛛以parse_article 方法跟随页面上的链接,以及跟随连续的下一页链接。但是,有没有办法在抓取给定数量的文章后停止这种情况?例如,这就是我目前使用crawlspider

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,但我不太确定这就是我要找的东西。

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

【问题讨论】:

    标签: python pagination scrapy scrapy-spider


    【解决方案1】:

    你可以通过设置来实现:

    CLOSESPIDER_ITEMCOUNT = 150

    在您的项目设置中。

    如果您的项目中有多个蜘蛛并且只想让特定的蜘蛛受此设置影响,请将其设置在 custom_settings 类变量中:

    custom_settings = { 'CLOSESPIDER_ITEMCOUNT': 150 }
    

    【讨论】:

    • 感谢您的建议!但是,对于一个有多个蜘蛛的项目,是否可以让这个CLOSESPIDER_ITEMCOUNT 只适用于一个蜘蛛?
    • @ocean800 我已经更新了我的答案。请尝试让我知道它是否按预期工作
    【解决方案2】:

    我对我的蜘蛛采取的方法是实际上有一个 donescraping 标志,我首先在我的每个 parse_* 函数中检查它并返回一个空列表作为结果。

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

    我从未使用过 CLOSESPIDER_ITEMCOUNT,所以我不知道这是否“优雅地”关闭了蜘蛛。我希望它不会

    在每个解析函数的开头:

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

    【讨论】:

    • 在某些情况下,您可能需要return [],具体取决于解析函数。 :)
    • 感谢您的回答!只是想了解更多——蜘蛛到底是怎么关在这里的?我不明白如何在解析函数中返回None/[] 响应会阻止CrawlSpider/LinkExtractor 抓取更多链接?
    • 当蜘蛛下载队列中的东西用完时,它会自行关闭。我的解决方案是让它在处理完当前收集的物品后优雅地关闭而不是耕种更多物品,而不是立即退出。
    猜你喜欢
    • 2015-08-01
    • 2012-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-10
    • 2022-10-19
    相关资源
    最近更新 更多