Python循环请求URL数据时如何将各次结果追加到同一个列表
问题说明
现有代码逻辑为遍历Excel文件指定列的4500个单元格值,每次迭代将单元格值拼接至两段URL片段中间生成合法请求地址,调用接口获取对应数据,目标是将所有单元格对应的返回数据归集到同一个列表中。
原有问题代码如下:
import json import requests import pandas as pd data = pd.read_excel('allstockdata.xlsx') look = list(data["Meals"]) for i in look: alist = [] #Line of Interest i = str(i) alldata = json.loads(requests.get(url1half1 + i + url1half2).text) + json.loads(requests.get(url2half1 + i + url2half2).text) #Gets data in form of single nested dictionary in list for each iteration [{}] alist.append(alldata) # Line of Interest print(alist)
当前两次迭代的输出为:
[[{'Fruit': 'Apple', 'Protein': 'Steak', 'Vegetable': 'Cabbage' }]] [[{'Fruit': 'Pear', 'Protein': 'Chicken', 'Vegetable': 'Spinach'}]]
期望输出格式为所有条目归集到同一个列表:
[ [{'Fruit': 'Apple', 'Protein': 'Steak', 'Vegetable': 'Cabbage' }], [{'Fruit': 'Pear', 'Protein': 'Chicken', 'Vegetable': 'Spinach'}], ]
问题原因
存储结果的列表alist = []被写在了for循环内部,每次循环启动时都会重新创建一个空列表,追加完当前迭代的单条数据后就会进入下一轮循环重新初始化,之前迭代的数据完全不会保留,因此每次打印的列表都只包含当前单条数据。
修复方案
- 将存储全量结果的列表初始化逻辑移到for循环外部,保证整个遍历过程中列表只被创建一次
- 每次迭代拿到当前单元格对应的
alldata后,直接追加到这个全局结果列表中 - 等所有循环执行完成后,再打印或使用这个总结果列表即可
修复后的完整代码:
import json import requests import pandas as pd data = pd.read_excel('allstockdata.xlsx') look = list(data["Meals"]) # 结果列表移到循环外初始化,全量循环共用这一个列表 result = [] for i in look: i = str(i) # 分别请求两个接口、解析返回结果后合并 data1 = json.loads(requests.get(url1half1 + i + url1half2).text) data2 = json.loads(requests.get(url2half1 + i + url2half2).text) alldata = data1 + data2 # 当前条数据追加到总结果列表 result.append(alldata) # 循环全部结束后打印,输出就是预期的归集后结构 print(result)
可选优化建议
- 4500次接口请求量级较大,可以增加简单的异常捕获逻辑,避免某一次请求超时、报错直接中断整个遍历流程
- 可以根据目标站点的限流规则适当增加请求间隔,或使用异步请求提升采集效率,避免触发反爬限制
内容的提问来源于stack exchange,提问作者noviceprogramer
相关产品推荐
相关产品推荐

