聚合爬网程序中的请求列表中的数据

时间:2016-04-08 17:57:19

标签: python-2.7 scrapy scrapy-spider

也许我错过了一些简单的东西,所以我希望这是一个简单的问题。我正在使用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

1 个答案:

答案 0 :(得分:1)

你已经关闭(推理)功能,当蜘蛛完成时会调用它。

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