【发布时间】:2013-06-28 11:17:12
【问题描述】:
有没有办法让 Scrapy 在抓取完成后执行代码以处理移动/清理数据?我确信这是微不足道的,但我的 Google-fu 似乎已经因为这个问题离开了我。
【问题讨论】:
标签: python scrapy web-crawler
有没有办法让 Scrapy 在抓取完成后执行代码以处理移动/清理数据?我确信这是微不足道的,但我的 Google-fu 似乎已经因为这个问题离开了我。
【问题讨论】:
标签: python scrapy web-crawler
这完全取决于你如何启动 Scrapy。
如果使用crawl 或runspider 从命令行运行,只需等待进程完成即可。注意 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() 返回后检查的全局变量来跟踪成功。就我而言,成功的时刻是没有找到“下一页”链接。但我有一个线性刮刀,所以很简单,你的情况可能不同。
【讨论】:
您可以编写一个extension 来捕捉spider_closed 信号,它将执行您的自定义代码。
【讨论】: