2024-04-20 13:17:48 发布
网友
有没有办法刷新当前正在运行的爬网的统计信息(刮掉的页面/项目)?我正在运行一个很长的爬行,偶尔统计到目前为止,但很快就会被更多的信息推开。如果可能的话,我想定期检查这些数据-所以我大致知道它需要多长时间,或者我是否应该提前完成它。在
作为这个问题的一个子问题-有没有一种方法可以杀死蜘蛛,这样到目前为止被爬网的内容仍然会输出到指定的输出文件?(-o标志)
任何帮助都将不胜感激。在
作为@基兰·科杜鲁前面提到过,您可以将扩展与twisted的LoopingCall类一起使用,以便在给定的时间间隔内持久化统计信息。在
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)
关于第二个问题,如果您优雅地杀死蜘蛛(一个CTRL+C),它应该正确地存储文件。否则,您需要提供自己的提要导出器或扩展名,以便将项直接写入目标文件,而不是在临时文件中进行缓冲。在
作为@基兰·科杜鲁前面提到过,您可以将扩展与
twisted
的LoopingCall
类一起使用,以便在给定的时间间隔内持久化统计信息。在例如:
关于第二个问题,如果您优雅地杀死蜘蛛(一个CTRL+C),它应该正确地存储文件。否则,您需要提供自己的提要导出器或扩展名,以便将项直接写入目标文件,而不是在临时文件中进行缓冲。在
相关问题 更多 >
编程相关推荐