【问题标题】:How to tell scrapy crawler to STOP following more links dynamically?如何告诉scrapy爬虫停止动态跟踪更多链接?
【发布时间】:2017-08-29 14:36:40
【问题描述】:

基本上我有一个以下页面的正则表达式规则

每个页面有 50 个链接

当我点击一个太旧的链接时(基于预定义的日期时间)

我想告诉 scrapy 停止关注更多页面,但不能完全停止,它必须继续抓取它已经决定抓取的链接 -> (完成所有创建的 Request 对象)。只是它不能再跟随任何链接。所以程序最终会停止(当它完成所有链接时)

有什么办法可以在蜘蛛内部做到这一点?

【问题讨论】:

    标签: python scrapy


    【解决方案1】:

    点击“太旧”页面后,抛出CloseSpider 异常。在这种情况下,Scrapy 将完成处理正在调度的链接,然后关闭。

    【讨论】:

    • “优雅”关闭是否允许scrapy 抓取其队列中的剩余链接? (必须处理所有Request 对象调用)
    • @wolfgang 根据我阅读源代码的理解,是的,这是一个“优雅的”关机 - 但是,请先测试一下。
    • 我试过了,Scrapy 似乎没有抓取它在其“队列”中的所有链接,停止点似乎是任意的(我假设在它“优雅地”清理了其他资源之后)
    【解决方案2】:

    Scrapy 的 CrawlSpider 有一个内部的 _follow_links 成员变量,它还没有被记录(目前是实验性的)

    设置self._follow_links = False 将告诉scrapy 停止关注更多链接。但继续完成它已经创建的所有Request 对象

    【讨论】:

      【解决方案3】:

      从回调中引发 CloseSpider 异常。

      def parse_page(self, response):
      if 'Bandwidth exceeded' in response.body:
          raise CloseSpider('bandwidth_exceeded')
      

      【讨论】:

        猜你喜欢
        • 2011-06-26
        • 1970-01-01
        • 1970-01-01
        • 2013-02-07
        • 2021-10-09
        • 2013-11-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多