Python多URL请求合并DataFrame仅返回最后一条数据问题排查
问题根因
你的代码存在两处明显逻辑错误,是导致最终仅能获取最后一个URL返回数据的直接原因:
- 变量覆盖:循环内执行完
data_results.extend(resp)后,下一行data_results = resp.json(strict=False)会直接将之前用于累积全量结果的列表变量,覆盖为当前单次请求的返回值,前序循环存储的所有数据会被直接丢弃,循环执行完成后自然只保留最后一个URL的返回结果。 - 方法误用:
resp是requests库返回的Response响应对象,并非接口返回的结构化业务数据,不能直接作为extend/append的参数,必须先调用.json()方法解析出结构化数据后,再执行追加操作。
修正代码
import requests import pandas as pd URLs = ["https://www.url1.com/fall", "https://www.url1.com/spring"] data_results = [] payload = {} headers = { 'apikey': apikey } for url in URLs: resp = requests.get(url, headers=headers, data=payload) if resp.status_code != 200: print(f"Request error, url: {url}, status code: {resp.status_code}") continue # 解析当前请求的结构化返回 current_res = resp.json(strict=False) # 根据返回结构选择追加方式:如果返回是多条记录组成的列表用extend,单条字典用append # 若接口返回外层包裹状态字段(如{"code":200,"data":[...]}),需先提取到实际存储数据的列表,例如current_res["data"] if isinstance(current_res, list): data_results.extend(current_res) else: data_results.append(current_res) # 全量数据收集完成后转DataFrame,即可复用原有upsert逻辑入库 final_df = pd.DataFrame(data_results)
补充说明
如果转换后发现DataFrame结构不符合预期,先打印单次请求的current_res确认返回结构:大部分业务接口不会直接返回数据列表,通常会在外层包裹状态码、请求信息等字段,此时需要先定位到实际存储业务记录的列表字段,再执行追加操作即可。
内容的提问来源于stack exchange,提问作者DevMe12000
相关产品推荐
相关产品推荐

