You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 21:15:34