Scrapy Spider - 通过Stats Collection保存数据

时间:2015-08-07 15:00:02

标签: python scrapy scrapy-spider

我正在尝试在最后运行的蜘蛛和当前蜘蛛之间保存一些信息。为了实现这一点,我找到了scrapy支持的Stats Collection。我的代码如下:

class StatsSpider(Spider):
    name = 'stats'

    def __init__(self, crawler, *args, **kwargs):
        Spider.__init__(self, *args, **kwargs)
        self.crawler = crawler
        print self.crawler.stats.get_value('last_visited_url')

    @classmethod
    def from_crawler(cls, crawler):
        return cls(crawler)

    def start_requests(self):
        return [Request(url)
                for url in ['http://www.google.com', 'http://www.yahoo.com']]

    def parse(self, response):
        self.crawler.stats.set_value('last_visited_url', response.url)
        print'URL: %s' % response.url

当我运行我的蜘蛛时,我可以通过调试看到stats变量正在使用新数据刷新,但是,当我再次(本地)运行我的蜘蛛时,stats变量开始为空。我应该如何运行我的蜘蛛以保持数据?

我在控制台上运行它:

scrapy runspider stats.py

编辑:如果您在Scrapinghub上运行它,您可以使用他们的collections api

1 个答案:

答案 0 :(得分:3)

您需要以某种方式(在文件或数据库中)将此数据保存到磁盘。

您的写入数据的爬虫对象仅在您执行爬网期间存在。蜘蛛完成后,该对象会留下内存并丢失数据。

我建议您在上次运行init时加载统计信息。然后像你一样在解析中更新它们。然后连接scrapy spider_closed信号以在蜘蛛完成运行时持久保存数据。

如果你需要一个spider_closed的例子让我知道,我会更新。但是很多例子都可以在网上找到。

编辑:我只是举个例子:https://stackoverflow.com/a/12394371/2368836