爬网完成后运行代码

Jon*_*nno 6 scrapy

有没有办法让Scrapy在爬网完成后处理移动/清理数据时执行代码?我确定它是微不足道的,但我的谷歌似乎已经离开了我这个问题.

use*_*ser 7

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

crawl如果使用或从命令行运行runspider,只需等待该过程完成即可。请注意,0 退出代码并不意味着您已成功抓取所有内容。

如果用作库,您可以在调用后附加代码CrawlerProcess.start()

如果需要可靠地跟踪状态,首先要做的是跟踪spider_closed信号并检查其reason参数。页面开头有一个示例,它希望您修改蜘蛛的代码。

当用作库时,要跟踪您添加的所有蜘蛛:

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()
Run Code Online (Sandbox Code Playgroud)

检查reason,如果不是'finished',则说明有东西中断了爬虫。
该函数将为每个蜘蛛调用,因此如果有很多蜘蛛,可能需要一些复杂的错误处理。另请记住,在收到两次键盘中断后,Scrapy 开始不正常关闭,并且该函数不会被调用,但后面放置的代码process.start()无论如何都会运行。

或者,您可以使用扩展机制连接到这些信号,而不会干扰代码库的其余部分。示例扩展展示了如何跟踪该信号。

但这一切只是为了检测因中断而导致的故障。您还需要订阅spider_error信号,该信号将在蜘蛛中出现 Python 异常时被调用。并且还必须完成网络错误处理,请参阅此问题

最后,我放弃了跟踪失败的想法,只是使用process.start()返回后检查的全局变量来跟踪成功。就我而言,成功的时刻是没有找到“下一页”链接。但我有一个线性刮刀,所以很容易,你的情况可能会有所不同。


Bal*_*rol 5

您可以编写一个扩展来捕获Spider_Closed信号,该信号将执行您的自定义代码。