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
相关产品推荐
相关产品推荐

