Python捕获Postman API响应并存储CSV失败问题排查
问题:Python分页获取API数据并写入CSV失败
我尝试用Python捕获API响应并存储到CSV文件,代码意图通过skip参数分页获取数据:首次请求skip=0获取前100条,之后自动将skip更新为100、200……直至无数据返回,最终把所有结果写入CSV,但当前代码无法实现该逻辑。
原代码
UsergroupURL="https://"+ dex.3ds.com" UsergroupsURL= UsergroupURL + "/3drdd/resources/b1/usersgroup?select=title,description,owner,members,pending_members,creation_date,modification_date&top=100&skip=0" skip = 0 all_results = [] while True: usergroupresponse = session.post(UsergroupsURL, data = data) if usergroupresponse.status_code != 200: Failmsg="Failed to post usergroup. Status code : " + str(response.status_code) sys.exit(Failmsg) results = usergroupresponse.json() print(results) if len(results) == 0: # No more results to retrieve break # Append the results to the all_results list all_results += results # Increment skip to skip the previously retrieved results skip += 100 # Update the URL with the new skip value UsergroupsURL = UsergroupURL + "/3drdd/resources/b1/usersgroup?select=title,description,owner,members,pending_members,creation_date,modification_date&top=100&skip=" + str(skip) print(results) # Write the results to a CSV file with open('response.csv', 'w', newline='') as csvfile: writer = csv.writer(csvfile) for row in all_results: writer.writerow(row.values())
代码中的问题
- URL初始化语法错误:
"https://"+ dex.3ds.com"中dex.3ds.com未加引号,会被当作变量处理,引发NameError。 - URL重复拼接:每次更新
UsergroupsURL时,在基础URL后重复拼接完整路径,导致URL变成https://dex.3ds.com/3drdd/.../3drdd/...,请求无效。 - 变量引用错误:错误信息里用了未定义的
response.status_code,实际响应变量是usergroupresponse。 - CSV无表头:直接写入字典值,CSV缺少表头,数据可读性差。
- 冗余代码:循环内重复打印
results。
修正后的代码
import sys import csv # 需提前初始化session和data,示例: # import requests # session = requests.Session() # data = {} # 替换为实际请求体数据 # 修复基础URL的语法错误 UsergroupURL = "https://dex.3ds.com" skip = 0 all_results = [] while True: # 每次循环动态构建请求URL,避免路径重复 UsergroupsURL = f"{UsergroupURL}/3drdd/resources/b1/usersgroup?select=title,description,owner,members,pending_members,creation_date,modification_date&top=100&skip={skip}" usergroupresponse = session.post(UsergroupsURL, data=data) # 修正响应变量引用 if usergroupresponse.status_code != 200: Failmsg = f"Failed to post usergroup. Status code : {usergroupresponse.status_code}" sys.exit(Failmsg) results = usergroupresponse.json() print(results) if not results: break all_results.extend(results) skip += 100 # 写入CSV并添加表头 if all_results: headers = all_results[0].keys() with open('response.csv', 'w', newline='', encoding='utf-8') as csvfile: writer = csv.DictWriter(csvfile, fieldnames=headers) writer.writeheader() writer.writerows(all_results) else: print("未获取到可写入CSV的数据")
修正说明
- 修复URL初始化:将基础URL改为正确的字符串格式。
- 动态构建请求URL:使用f-string每次基于基础URL和当前
skip值生成新请求地址,避免路径重复叠加。 - 修正变量引用:错误信息中使用正确的
usergroupresponse.status_code。 - 优化CSV写入:使用
csv.DictWriter自动生成表头,确保数据与表头对应,提升可读性。 - 移除冗余代码:删除重复的
print(results)语句。 - 添加空数据判断:无数据时给出提示,避免写入空文件。
内容的提问来源于stack exchange,提问作者Lechu
相关产品推荐
相关产品推荐

