有没有办法让Scrapy在爬行完全完成后执行代码,以处理移动/清理数据?我确信这是微不足道的,但我的Google-fu似乎为了这个问题而离开了我。
发布于 2018-10-08 06:14:42
这完全取决于你是如何启动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()返回后检查的全局变量来跟踪成功。在我的例子中,成功的时刻不是找到“下一页”链接。但是我有一个线性刮刀,所以它很简单,你的情况可能不同。
发布于 2013-06-28 19:22:57
您可以编写一个捕获spider_closed信号的extension,它将执行您的自定义代码。
https://stackoverflow.com/questions/17363458
复制相似问题