首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Scrapy爬虫完成爬行时运行代码

在Scrapy爬虫完成爬行时运行代码
EN

Stack Overflow用户
提问于 2013-06-28 19:17:12
回答 2查看 4.6K关注 0票数 8

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

EN

回答 2

Stack Overflow用户

发布于 2018-10-08 06:14:42

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

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

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

如果需要可靠地跟踪状态,首先要做的就是跟踪spider_closed信号并检查其reason参数。在the page的开头有一个示例,它要求您修改爬行器的代码。

要跟踪您添加的所有爬行器,请在用作库时执行以下操作:

代码语言:javascript
复制
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()返回后检查的全局变量来跟踪成功。在我的例子中,成功的时刻不是找到“下一页”链接。但是我有一个线性刮刀,所以它很简单,你的情况可能不同。

票数 4
EN

Stack Overflow用户

发布于 2013-06-28 19:22:57

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17363458

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档