从爬虫中的请求列表中聚合数据
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)
也许我遗漏了一些简单的问题,所以我希望这是一个简单的问题。我正在使用 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)