这完全取决于您如何启动 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()返回后检查的全局变量来跟踪成功。就我而言,成功的时刻是没有找到“下一页”链接。但我有一个线性刮刀,所以很容易,你的情况可能会有所不同。