一旦抓取完全处理移动/清理数据,是否有办法让Scrapy执行代码?我确定这是微不足道的,但我的Google-fu似乎已经离开了我这个问题。
答案 0 :(得分:2)
您可以写一个extension来捕捉spider_closed信号,该信号将执行您的自定义代码。
答案 1 :(得分:1)
这完全取决于您如何启动Scrapy。
如果使用crawl
或runspider
从命令行运行,只需等待该过程完成即可。请注意0退出代码won't mean已成功抓取了所有内容。
如果为using as a library,则可以在CrawlerProcess.start()
调用后附加代码。
如果您需要可靠地跟踪状态,首先要做的是跟踪spider_closed
信号并检查其reason
参数。 the page开头有一个示例,它期望您修改Spider的代码。
在用作库时,要跟踪添加的所有蜘蛛,
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()
返回后检查的全局变量来跟踪成功。以我为例,成功的时机没有找到“下一页”链接。但是我有一个线性刮刀,所以很容易,您的情况可能有所不同。