Scrapy爬取多站点时如何将多字典输出合并为单个字典?
解决Scrapy多页面数据合并为单个字典的问题
你的核心需求是把多个页面爬取到的同字段列表合并到一个字典里,而非每个页面输出独立字典。可以通过在爬虫类中维护全局数据容器,待所有页面爬取完成后统一输出合并结果,具体实现如下:
修改后的代码
class TransferSpider(scrapy.Spider): name = 'transfers' start_urls = [ 'https://www.transfermarkt.es/transfers/transfertagedetail/statistik/top/land_id_zu/0/land_id_ab/0/leihe//datum/2022-07-10/sort//plus/1', 'https://www.transfermarkt.es/transfers/transfertagedetail/statistik/top/land_id_zu/0/land_id_ab/0/leihe//datum/2022-07-10/sort//plus/1/page/2' ] custom_settings={ "FEEDS":{ "players.json" : {"format" : "json", 'encoding':'utf-8', 'indent':4} } } # 初始化全局数据容器,用于累积所有页面的数据 def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.merged_data = { 'names': [], 'position': [], 'origin_club': [], 'leage_origin_club': [], 'new_club': [], 'leage_new_club': [] } def parse(self, response): # 提取并清洗数据(保留原有逻辑) data = response.xpath("//*[@id='yw1']/table/tbody//table//text()").extract() data = map(str.strip, data) data = list(filter(lambda x: x != '', data)) # 将当前页面的列表数据追加到全局容器中 self.merged_data['names'].extend(data[0::6]) self.merged_data['position'].extend(data[1::6]) self.merged_data['origin_club'].extend(data[2::6]) self.merged_data['leage_origin_club'].extend(data[3::6]) self.merged_data['new_club'].extend(data[4::6]) self.merged_data['leage_new_club'].extend(data[5::6]) def closed(self, reason): # 爬虫结束时,输出合并后的完整字典 yield self.merged_data
关键改动说明
- 全局数据容器:在
__init__方法中初始化self.merged_data,每个字段对应空列表,用来累积所有页面的数据。 - 取消即时yield:原代码每次处理页面就生成独立字典,现在改为用
extend将当前页面列表追加到全局容器,避免生成多个分散字典。 - 爬虫结束统一输出:重写
closed方法,该方法会在所有请求处理完成后自动调用,此时输出合并好的完整字典,即可得到你需要的格式。
关于meta失效的说明
你之前尝试的meta主要用于单请求链内的数据传递(比如从parse到子回调函数),但你的场景是多个平级的start_urls,用类变量维护全局数据会更直接可靠。
内容的提问来源于stack exchange,提问作者David Molina
相关产品推荐
相关产品推荐

