如何在Python GET请求中结合认证与参数实现Repsly表单数据分页导出?
解决Repsly API表单导出的参数传递与循环获取问题
我来帮你搞定这个问题!从你的测试结果能明显看出来:Repsly的这个表单导出接口,要求last_form_id作为URL路径的一部分,而不是普通的HTTP查询参数(也就是?key=value这种形式)。这就是你用params传递参数返回404,直接拼到URL里就正常的核心原因。
正确的实现思路
根据Repsly的文档要求,我们需要:
- 首次请求时,把
last_form_id设为0,拼到URL路径末尾 - 每次请求后,解析响应中的
LastID和TotalCount字段 - 如果
TotalCount不为0,就用LastID作为新的last_form_id构造下一个URL,继续请求 - 直到
TotalCount为0,停止循环,此时已获取全部数据
完整代码示例
import requests import time # 你的认证信息 username = 'XXXXXXX' password = 'XXXXXXX' user_pass = (username, password) # 初始化变量 all_form_data = [] last_form_id = 0 while True: # 构造正确的URL:把last_form_id作为路径参数 url = f"https://api.repsly.com/v3/export/forms/{last_form_id}" try: # 发起GET请求 response = requests.get(url, auth=user_pass) # 主动抛出HTTP错误(比如404、500等) response.raise_for_status() # 解析响应JSON response_data = response.json() # 收集本次请求的数据(假设数据在'data'字段,你需要根据实际响应调整) if 'data' in response_data: all_form_data.extend(response_data['data']) # 获取元数据 total_count = response_data.get('TotalCount', 0) current_last_id = response_data.get('LastID', 0) print(f"本次获取{len(response_data.get('data', []))}条数据,剩余{total_count}条") # 判断是否继续循环 if total_count == 0: print("已获取全部数据,停止请求") break # 更新last_form_id为本次的LastID last_form_id = current_last_id # 可选:添加请求间隔,避免触发API限流 time.sleep(1) except requests.exceptions.RequestException as e: print(f"请求出错:{e}") break except ValueError: print("响应不是有效的JSON格式") break # 处理最终收集到的所有数据 print(f"总共获取到{len(all_form_data)}条表单数据") # 这里可以添加保存数据到文件等逻辑
关键细节说明
- URL构造方式:用f-string把
last_form_id直接拼到URL路径里,完全符合Repsly接口的要求,而不是用params传递(那会生成查询参数,接口不识别) - 循环终止条件:严格遵循文档要求,当响应的
TotalCount为0时停止循环 - 异常处理:加入了
raise_for_status()捕获HTTP错误,还有JSON解析异常的处理,避免脚本意外崩溃 - 限流保护:添加了
time.sleep(1),如果API有频率限制,可以根据实际情况调整间隔时间
为什么之前的params方式不行?
当你用params={'last_form_id':'0'}时,requests会把参数转换成查询参数,最终请求的URL是:
https://api.repsly.com/v3/export/forms/?last_form_id=0
但Repsly的接口期望的是路径参数形式:
https://api.repsly.com/v3/export/forms/0
这两种URL结构完全不同,所以接口会返回404表示路径不存在。
内容的提问来源于stack exchange,提问作者Des
相关产品推荐
相关产品推荐

