【问题标题】:Running code when Scrapy spider has finished crawling当 Scrapy 蜘蛛完成爬取时运行代码
【发布时间】:2013-06-28 11:17:12
【问题描述】:

有没有办法让 Scrapy 在抓取完成后执行代码以处理移动/清理数据?我确信这是微不足道的,但我的 Google-fu 似乎已经因为这个问题离开了我。

【问题讨论】:

    标签: python scrapy web-crawler


    【解决方案1】:

    这完全取决于你如何启动 Scrapy。

    如果使用crawlrunspider 从命令行运行,只需等待进程完成即可。注意 0 退出代码 won't mean 你已经成功爬取了所有内容。

    如果是using as a library,可以在CrawlerProcess.start()调用后追加代码。

    如果您需要可靠地跟踪状态,首先您要做的是跟踪spider_closed信号并检查其reason参数。 the page开头有一个例子,它希望你修改蜘蛛的代码。

    在用作库时跟踪您添加的所有蜘蛛:

    process = CrawlerProcess({})
    process.crawl(MySpider)
    
    def spider_ended(spider, reason):
        print('Spider ended:', spider.name, reason)
    
    for crawler in process.crawlers:
        crawler.signals.connect(spider_ended, signal=scrapy.signals.spider_closed)
    
    process.start()
    

    检查reason,如果不是'finished',说明爬虫有东西中断。
    将为每个蜘蛛调用该函数,因此如果您有很多,它可能需要一些复杂的错误处理。还要记住,在收到两次键盘中断后,Scrapy 会开始非正常关机,不会调用该函数,但放在process.start() 之后的代码无论如何都会运行。

    或者,您可以使用extensions 机制连接到这些信号,而不会弄乱代码库的其余部分。 sample extension 显示如何跟踪此信号。

    但所有这一切只是为了检测由于中断而导致的故障。您还需要订阅spider_error 信号,该信号将在蜘蛛出现 Python 异常时被调用。还有网络错误处理必须完成,见this question

    最后,我放弃了跟踪失败的想法,只是使用一个在process.start() 返回后检查的全局变量来跟踪成功。就我而言,成功的时刻是没有找到“下一页”链接。但我有一个线性刮刀,所以很简单,你的情况可能不同。

    【讨论】:

      【解决方案2】:

      您可以编写一个extension 来捕捉spider_closed 信号,它将执行您的自定义代码。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-15
        相关资源
        最近更新 更多