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

Python爬取接口数据时for循环致字典覆盖、输出重复如何解决

问题根因

代码存在两处逻辑错误直接导致数据重复覆盖:

  • 存储单条参展商数据的字典wev定义在所有循环外部,全程只创建了一个字典对象,所有循环赋值操作都是修改同一个内存地址的内容,新值会直接覆盖旧值
  • 拆分了三个独立的for循环遍历同一份hits列表,仅在最后一个循环里执行列表追加操作,最终结果列表里存储的全是最后一次循环赋值后的同一份字典引用,因此所有行输出完全一致。

另外原代码还存在变量重名问题:请求体变量和结果列表变量都命名为data,容易引发逻辑冲突。

修复方案
  • 字典初始化操作移入单次遍历循环内部,每处理一条参展商数据就新建独立字典对象,彻底避免内存复用导致的覆盖问题
  • 合并三个独立for循环为单次遍历,同一次循环内完成当前参展商的名称、代理品牌、描述字段提取,提取完成后立刻将当前字典追加到结果列表
  • 字段提取改用dict.get()方法做兜底,避免部分参展商缺失对应字段时触发KeyError报错
  • 重命名重名的data变量,区分请求体和结果列表,避免变量冲突
修复后完整代码
import requests
import pandas as pd

headers = {
    'Accept-Language': 'en-GB,en-US;q=0.9,en;q=0.8,pt;q=0.7',
    'Connection': 'keep-alive',
    'Origin': 'https://www.nationalhardwareshow.com',
    'Referer': 'https://www.nationalhardwareshow.com/',
    'Sec-Fetch-Dest': 'empty',
    'Sec-Fetch-Mode': 'cors',
    'Sec-Fetch-Site': 'cross-site',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36',
    'accept': 'application/json',
    'content-type': 'application/x-www-form-urlencoded',
    'sec-ch-ua': '".Not/A)Brand";v="99", "Google Chrome";v="103", "Chromium";v="103"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-platform': '"Windows"',
}

params = {
    'x-algolia-agent': 'Algolia for vanilla JavaScript 3.27.1',
    'x-algolia-application-id': 'XD0U5M6Y4R',
    'x-algolia-api-key': 'd5cd7d4ec26134ff4a34d736a7f9ad47',
}

# 重命名请求体变量,避免和结果列表重名
query_payload = '{"params":"query=&page=0&facetFilters=&optionalFilters=[]"}'

resp = requests.post(
    'https://xd0u5m6y4r-dsn.algolia.net/1/indexes/event-edition-eve-e6b1ae25-5b9f-457b-83b3-335667332366_en-us/query',
    params=params,
    headers=headers,
    data=query_payload
).json()

exhibitor_list = []
hits = resp['hits']

# 单次遍历完成所有字段提取
for item in hits:
    # 每条数据新建独立字典,不复用内存地址
    exhibitor = {
        'title': item.get('name', ''),
        'Brand': item.get('representedBrands', ''),
        'des': item.get('description', '')
    }
    exhibitor_list.append(exhibitor)

df = pd.DataFrame(exhibitor_list)
print(df)
# 如需保存为本地CSV文件,可放开下方注释
# df.to_csv('national_hardware_show_exhibitors.csv', index=False, encoding='utf-8-sig')
扩展优化提示
  • 接口返回值中包含nbPages字段,代表数据总页数,可以在外层增加页码循环,动态修改请求参数里的page值,从0遍历到总页数-1即可拉取全量参展商数据,当前代码仅获取第一页数据
  • 返回结构中还包含展位号、公司官网、联系方式、展品分类等字段,可按需在字典中增加对应提取逻辑

内容的提问来源于stack exchange,提问作者Amen Aziz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 06:00:58