如何在Python中抓取GraphQL接口的分页数据并清洗?

轻婷小哥_8686

轻婷小哥_8686

2026-10-26

914人浏览

原创

graphql分页常见结构通过响应中是否存在pageinfo、endcursor、hasnextpage等字段识别,若有则属relay游标分页,需用after参数翻页;否则可能为offset分页。

如何在python中抓取graphql接口的分页数据并清洗?

GraphQL分页常见结构怎么识别?

GraphQL本身不规定分页格式,但实际接口基本逃不开 first/after(Relay规范)或 limit/offset(简单游标或偏移)。抓取前必须先看文档或试发一次查询,确认返回里有没有 pageInfo、endCursor、hasNextPage 这类字段——它们才是翻页的关键信号,不是靠猜页码。

  • 如果响应里有 pageInfo.hasNextPage === true 且 pageInfo.endCursor 非空,说明用的是 Relay 游标分页,下一页必须传 after: "xxx"
  • 如果只有 totalCount 和 data 数组,但没游标字段,大概率是服务端偷偷做了 offset 分页,这时得手动累加 offset 参数
  • 别直接信响应里的 pageInfo.hasNextPage 值:有些接口在最后一页仍返回 true,但下一次请求返回空数据,得靠 data 长度是否为 0 来双重判断

requests发GraphQL查询时怎么带分页参数?

GraphQL 请求本质是 POST JSON,分页参数就塞在 variables 字段里,不是 URL 查询参数。写错位置(比如拼到 URL 上)会导致参数被忽略,永远只拿第一页。

  • 构造 payload 时,确保 query 字符串里有占位符,例如 $first 和 $after,并在 variables 对象里对应传值
  • 第一次请求 variables 可设为 {"first": 10};拿到响应后提取 data.xxx.edges[0].cursor 或 pageInfo.endCursor,作为下次的 after 值
  • 注意字符串转义:after 值通常是 base64 编码的,直接原样传,别再 encode 一遍,否则服务端解不出
{
  "query": "query($first: Int!, $after: String) { users(first: $first, after: $after) { edges { node { id name } } pageInfo { hasNextPage endCursor } } }",
  "variables": {"first": 10, "after": "YXJyYXljb25uZWN0aW9uOjEw"}
}

清洗分页数据时最容易漏掉什么?

分页拉下来的数据是嵌套结构(尤其 Relay 规范),直接 flatten 容易丢节点或重复。关键不是“把所有 node 提出来”,而是保持每页上下文可追溯。

macOS UI 自动化技能包 —— 用 Python 控制你的 Mac
macOS UI 自动化技能包 —— 用 Python 控制你的 Mac

让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限

下载
  • 不要直接对 response["data"]["users"]["edges"] 循环取 node 就完事:检查是否有 cursor 字段,它可能和业务逻辑强相关(比如用于去重或排序锚点)
  • 如果多页数据要合并成一张表,先统一字段名:有些页的 node 里是 fullName,另一页却是 name + lastName,得提前映射好
  • 空数据页也要记录:某次请求返回 {"data": {"users": {"edges": []}}},不代表出错,可能是真没数据,但得留日志,否则后续分析会误判总量

异步并发拉取 GraphQL 分页会踩哪些坑?

用 asyncio + aiohttp 能提速,但 GraphQL 接口往往限流严格,且游标依赖上一页结果,不能真正“并行”。

  • 绝对不要并发请求第 2、3、4 页:因为第 2 页的 after 值来自第 1 页响应,没拿到就发第 2 页,必然失败
  • 可以并发的是“同一页内多个子查询”(比如拉完用户列表后,并发查每个用户的 profile),但主分页流必须串行
  • 加 sleep(0.1) 比硬扛 429 更稳妥:有些接口对游标请求频率敏感,连续毫秒级请求容易触发限流,返回 "rate limit exceeded" 错误

真正难的不是写循环,是判断什么时候该停——hasNextPage 是软信号,edges 为空才是硬终点。别省那一次请求。

Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

python

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1811

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

4764

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1769

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

28417

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3407

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3427

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1203

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

616

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2643

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Uvicorn官方安装与入门手册
Uvicorn官方安装与入门手册

共0课时 | 0人学习

Python uv官方项目管理指南
Python uv官方项目管理指南

共0课时 | 0人学习

Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习