Python Scrapy-在spider运行时获取或刷新统计信息
有没有办法刷新当前正在运行的爬网的统计信息(刮取的页面/项目)?我正在运行一个很长的爬网,偶尔会出现到目前为止的统计数据,但很快就会被更多的信息推离。如果可能的话,我想定期检查这些数据,这样我就知道大概需要多长时间,或者我是否应该提前完成 作为这个问题的一个子问题-有没有一种方法可以杀死蜘蛛,这样到目前为止被爬网的内容仍然会输出到指定的输出文件?(-o标志)Python Scrapy-在spider运行时获取或刷新统计信息,python,scrapy,web-crawler,scrapy-spider,Python,Scrapy,Web Crawler,Scrapy Spider,有没有办法刷新当前正在运行的爬网的统计信息(刮取的页面/项目)?我正在运行一个很长的爬网,偶尔会出现到目前为止的统计数据,但很快就会被更多的信息推离。如果可能的话,我想定期检查这些数据,这样我就知道大概需要多长时间,或者我是否应该提前完成 作为这个问题的一个子问题-有没有一种方法可以杀死蜘蛛,这样到目前为止被爬网的内容仍然会输出到指定的输出文件?(-o标志) 任何帮助都将不胜感激。如@kiran.koduru所述,您可以使用扩展名和twisted的LoopingCall类在给定的时间间隔内保持统
任何帮助都将不胜感激。如@kiran.koduru所述,您可以使用扩展名和
twisted
的LoopingCall
类在给定的时间间隔内保持统计数据
例如:
from scrapy import signals
from twisted.internet.task import LoopingCall
class PersistStats(object):
"""An extension to persist stats on a given interval.
Settings
--------
PERSIST_STATS_INTERVAL : integer (default: 60)
Interval in seconds.
"""
def __init__(self, interval):
self.interval = interval
self.tasks = {}
@classmethod
def from_crawler(cls, crawler):
obj = cls(crawler.settings.getint('PERSIST_STATS_INTERVAL', 60))
crawler.signals.connect(obj.spider_opened, signal=signals.spider_opened)
crawler.signals.connect(obj.spider_closed, signal=signals.spider_closed)
return obj
def spider_opened(self, spider):
task = self.tasks[spider.name] = LoopingCall(self.perist_stats, spider)
task.start(self.interval)
def spider_closed(self, spider):
task = self.tasks.pop(spider.name)
task.stop()
def perist_stats(self, spider):
# TODO: store stats somewhere.
data = spider.crawler.stats.get_stats()
spider.logger.info("Persisting stats:\n%s", data)
关于第二个问题,如果您优雅地杀死了spider(一个CTRL+C),它应该正确地存储文件。否则,您需要提供自己的提要导出器或扩展名,以便将项目直接写入目标文件,而不是在临时文件中进行缓冲。是否要考虑编写自己的提要导出器?你也可以看看如何获得统计数据