Python调用分页API循环采集时无法追加所有页面数据仅获最后一页如何解决
问题代码错误分析
- URL参数拼接错误:查询参数之间需要用
&分隔,原代码里参数之间用了空格,导致服务端只能识别第一个参数,每次请求实际返回的都是默认的最后一页数据 - 认证参数传值错误:
HTTPBasicAuth里传入的是带引号的字符串'username'和'password',不是你提前定义的变量,会导致认证失败,接口返回非JSON格式的错误响应,这也是你之前直接加.json()方法代码报错的核心原因 - 分页范围错误:
range(1,88)生成的是1到87的整数,共87页,你需要拉取88页的话应该改成range(1, 89) - 数据存储错误:原代码直接把
requests返回的响应对象存入列表,没有解析响应体内容,也没有做请求状态校验,很容易出现异常
修正后的代码示例
import requests from requests.auth import HTTPBasicAuth username = "xxx" # 如果使用API Token认证,按接口要求填入对应字段即可,大部分场景下Token直接填到password字段 password= "xxx" all_pages = [] for page in range(1,89): # 修正参数拼接规则,用&分隔不同查询参数 url = f'https://api.riskmethods.net/v1/indicator_messages?per_page=1000&page={page}' resp = requests.get(url=url, auth=HTTPBasicAuth(username, password)) # 先校验请求状态再解析数据,避免异常 if resp.status_code == 200: page_data = resp.json() # 如果接口返回的结构体里,数据列表在对应key下,比如page_data['data'],就改成all_pages.extend(page_data['data']) all_pages.extend(page_data) else: print(f"第{page}页请求失败,状态码:{resp.status_code},响应片段:{resp.text[:200]}")
认证参数传入说明
- 使用
HTTPBasicAuth时直接传入提前定义好的账号、密码/Token变量即可,不要给变量额外加引号,加引号会被识别为固定字符串,无法读取变量内的实际值 - 如果是Token形式的Basic认证,大部分接口要求username留空字符串
"",password字段填Token即可,少部分接口要求username固定填"apikey",按接口文档要求调整即可
内容的提问来源于stack exchange,提问作者Rafał Pietrak
相关产品推荐
相关产品推荐

