如何在Pipeline.close_spider()方法中确定Scrapy是否遇到错误?

时间:2017-10-26 23:36:53

标签: scrapy scrapy-pipeline

我有一个Scrapy spider和Pipeline设置。

My Spider从网站中提取数据,我的Pipeline的process_item()方法将提取的数据插入到临时数据库表中。

最后,在Pipeline的close_spider()方法中,我对临时数据库表运行了一些错误检查,如果事情看起来没问题,那么我将临时表永久化。

但是,如果Scrapy在调用Pipeline的close_spider()方法之前遇到异常,则可能是提取的数据不完整。

有没有办法检查Scrapy是否在Pipeline的close_spider()方法中遇到异常?如果有错误(表明提取的数据可能不完整),我不想让临时表永久存在。

我正在使用CloseSpider扩展名,CLOSESPIDER_ERRORCOUNT设置为1,以便在第一个错误时关闭Spider。但是,我还没想出如何在Pipeline的close_spider()方法中区分正常关闭和错误关闭。

1 个答案:

答案 0 :(得分:0)

我能够使用Scrapy中的信号来做到这一点。我在这里发布答案,以防其他人遇到此问题。

我注册了捕获SELECT m.ImageURI, m.ID, m.FirstName, m.LastName, ROUND(time_to_sec(timediff(NOW(), MAX(ci.Created))) / 3600, 1) as 'HoursSinceCheckIn', CheckIns FROM _checkins ci LEFT JOIN _members m ON ci.MemberID = m.ID INNER JOIN(SELECT MemberID, COUNT(DISTINCT ID) as 'CheckIns' FROM _checkins WHERE( Created BETWEEN NOW() - INTERVAL 30 DAY AND NOW() ) GROUP BY MemberID ) lci ON ci.MemberID=lci.MemberID WHERE( ci.Created BETWEEN NOW() - INTERVAL 30 DAY AND NOW() AND TIMESTAMPDIFF(HOUR, ci.Created, NOW()) < 2 AND ci.Reverted = 0 ) GROUP BY m.ID ORDER BY CheckIns ASC 信号并在蜘蛛本身中提供了一个回调处理程序。

回调在蜘蛛上设置了一个标志,表示它遇到了错误。

在管道的spider_error方法中,我检查了蜘蛛上是否设置了错误标志,以区分正常关闭和错误关闭。