我试图保存上次运行的蜘蛛和当前蜘蛛之间的一些信息。为了实现这一目标,我找到了由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
EDIT:如果你在Scrapinghub上运行它,你可以使用他们的集合api
您需要以某种方式(在文件或数据库中)将这些数据保存到磁盘上。
要写入数据的爬虫对象仅在执行爬虫期间存在。一旦你的蜘蛛完成任务,对象就会离开内存,你的数据就丢失了。
我建议在init中加载上次运行的统计数据。然后在解析中更新它们。然后连接scrapy spider_closed信号,以便在蜘蛛完成运行时持久化数据。
如果你需要一个spider_closed的例子,让我知道,我会更新。但是在网络上有很多现成的例子。
编辑:我给你举个例子:https://stackoverflow.com/a/12394371/2368836