从爬虫中的请求列表中聚合数据

Aggregate data from list of Requests in a crawler

也许我遗漏了一些简单的问题,所以我希望这是一个简单的问题。我正在使用 Scrapy 解析目录列表,然后拉下每个适当的网页(实际上是一个文本文件)并使用 Python.

将其解析出来

每个页面都有一组我感兴趣的数据,每次在每个页面遇到这样的项目我都会更新一个全局字典。

喜欢做的是在所有请求调用完成时简单地打印出汇总摘要,但是在yield命令之后没有任何运行。我假设是因为 yield 实际上正在返回发电机并进行救助。

如果可能的话,我想避免为每个 Request 对象编写一个文件...我宁愿将它自己包含在这个 Python 脚本中。

这是我使用的代码:

 from scrapy.spider import BaseSpider
 from scrapy.selector import Selector
 from scrapy.http import Request

 slain = {}

 class GameSpider(BaseSpider):
   name = "game"
   allowed_domains = ["example.org"]
   start_urls = [
     "http://example.org/users/deaths/"
   ]

   def parse(self, response):
     links = response.xpath('//a/@href').extract()
     for link in links:
       if 'txt' in link:
         l = self.start_urls[0] + link
         yield Request(l, callback=self.parse_following, dont_filter=True)

 # Ideally print out the aggregate after all Requests are satisfied    
 #    print "-----"
 #    for k,v in slain.iteritems():
 #      print "Slain by %s: %d" % (k,v)
 #    print "-----"

   def parse_following(self, response):
     parsed_resp = response.body.rstrip().split('\n')
     for line in parsed_resp:
       if "Slain" in line:
         broken = line.split()
         slain_by = broken[3]

         if (slain_by in slain):
           slain[slain_by] += 1
         else:
           slain[slain_by] = 1

你有 closed(reason) 函数,它会在蜘蛛结束时调用。

def closed(self, reason):
    for k,v in self.slain.iteritems():
        print "Slain by %s: %d" % (k,v)