我正在尝试在最后运行的蜘蛛和当前蜘蛛之间保存一些信息。为了实现这一点,我找到了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
答案 0 :(得分:3)
您需要以某种方式(在文件或数据库中)将此数据保存到磁盘。
您的写入数据的爬虫对象仅在您执行爬网期间存在。蜘蛛完成后,该对象会留下内存并丢失数据。
我建议您在上次运行init时加载统计信息。然后像你一样在解析中更新它们。然后连接scrapy spider_closed信号以在蜘蛛完成运行时持久保存数据。
如果你需要一个spider_closed的例子让我知道,我会更新。但是很多例子都可以在网上找到。
编辑:我只是举个例子:https://stackoverflow.com/a/12394371/2368836