爬网完成后运行代码

时间:2013-06-28 11:17:12

标签: scrapy

一旦抓取完全处理移动/清理数据,是否有办法让Scrapy执行代码?我确定这是微不足道的,但我的Google-fu似乎已经离开了我这个问题。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

如果使用crawlrunspider从命令行运行,只需等待该过程完成即可。请注意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()返回后检查的全局变量来跟踪成功。以我为例,成功的时机没有找到“下一页”链接。但是我有一个线性刮刀,所以很容易,您的情况可能有所不同。