我有一个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()
方法中区分正常关闭和错误关闭。
答案 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
方法中,我检查了蜘蛛上是否设置了错误标志,以区分正常关闭和错误关闭。