也许我错过了一些简单的东西,所以我希望这是一个简单的问题。我正在使用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
答案 0 :(得分:1)
你已经关闭(推理)功能,当蜘蛛完成时会调用它。
def closed(self, reason):
for k,v in self.slain.iteritems():
print "Slain by %s: %d" % (k,v)