当蜘蛛在运行时,刮擦或刷新数据

2024-04-20 13:17:48 发布

您现在位置:Python中文网/ 问答频道 /正文

有没有办法刷新当前正在运行的爬网的统计信息(刮掉的页面/项目)?我正在运行一个很长的爬行,偶尔统计到目前为止,但很快就会被更多的信息推开。如果可能的话,我想定期检查这些数据-所以我大致知道它需要多长时间,或者我是否应该提前完成它。在

作为这个问题的一个子问题-有没有一种方法可以杀死蜘蛛,这样到目前为止被爬网的内容仍然会输出到指定的输出文件?(-o标志)

任何帮助都将不胜感激。在


Tags: 文件数据项目方法信息内容标志页面
1条回答
网友
1楼 · 发布于 2024-04-20 13:17:48

作为@基兰·科杜鲁前面提到过,您可以将扩展与twistedLoopingCall类一起使用,以便在给定的时间间隔内持久化统计信息。在

例如:

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),它应该正确地存储文件。否则,您需要提供自己的提要导出器或扩展名,以便将项直接写入目标文件,而不是在临时文件中进行缓冲。在

相关问题 更多 >