Python requests分页爬取API仅获取第1页数据问题咨询
问题修复方案
你的代码仅能获取第一页数据,核心是缺少分页终止判断、请求头不全、未做兼容处理导致的,按以下方式调整即可:
核心问题点
- 硬编码循环到1000页,没有根据接口实际返回结果判断终止时机,超过最大页数后接口可能默认返回第一页内容
- 请求头缺少基础标识,容易被接口反爬策略拦截,翻页请求被降级返回第一页
- 未做字段容错、异常捕获,单条数据/单页请求出错就会导致整个程序终止
- 未指定每页条数参数,部分接口默认page参数仅在传了page_size时才生效
修正后可运行代码
import requests import time headers = { 'x-authorization': 'a422cc2a-31fb-4b4e-a1bd-a34b561adc6c', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36', 'Accept': 'application/json, text/plain, */*' } # 补充page_size参数指定每页返回条数,可根据接口实际限制调整数值 url_template = "https://api-prod.grip.events/1/container/4368/search?search=&sort=name&order=asc&type_id=4907,4906,5265,4964,4904,1026,4908&page={page}&page_size=20" with open("list.txt", "w", encoding="utf-8") as f: page = 1 while True: print(f"正在抓取第{page}页...") try: resp = requests.get( url_template.format(page=page), headers=headers, timeout=15 ) resp.raise_for_status() result = resp.json() page_data = result.get("data", []) # 当前页无数据说明已经到最后一页,直接终止循环 if not page_data: print(f"第{page}页无返回数据,抓取完成") break for item in page_data: # 用get取值避免单条数据缺字段导致程序崩溃 line = "\t".join([ item.get("company_name", ""), item.get("job_title", ""), item.get("name", ""), item.get("job_industry", "") ]) f.write(line + "\n") print(line) # 如果接口返回了总页数字段,可以替换空数据判断逻辑,提前终止 # meta = result.get("meta", {}) # total_page = meta.get("last_page", 0) # if page >= total_page: # print("已到最后一页,抓取完成") # break page += 1 # 加请求间隔避免触发限流 time.sleep(1) except Exception as e: print(f"第{page}页抓取失败,错误:{str(e)},跳过继续") page += 1 time.sleep(2) continue
仍无法翻页的排查方向
如果调整后还是只能拿到第一页,按以下顺序排查:
- 手动在浏览器/接口工具里请求page=2、page=3的地址,确认返回内容是否和第一页一致。如果一致,说明该接口不是用page参数做分页,这类活动接口很多用
cursor游标做分页标记,需要抓包看实际翻页请求的参数名 - 核对接口返回的响应结构,分页元数据通常在
meta/pagination节点下,确认实际的分页参数名、总页数是否符合预期 - 检查当前授权账号的权限,部分接口的普通权限仅允许查看第一页数据
- 对比官方客户端/浏览器翻页时的请求头,补全缺失的
Referer/Origin等头信息,部分接口会校验请求来源,校验不通过时固定返回第一页内容
内容的提问来源于stack exchange,提问作者Tori Elstrom
相关产品推荐
相关产品推荐

