替代Selenium轻量快速获取GraphQL子图JSON响应的方法
更轻量的GraphQL数据获取方案
你现在用Selenium模拟浏览器操作GraphQL控制台页面的方案完全是冗余的,不需要加载前端页面、点击执行按钮、等待DOM渲染,直接向子图接口发HTTP请求就能拿到完全一致的结果,速度快、资源占用极低,也不存在长响应需要滚动加载的问题。
实现逻辑
所有部署在The Graph上的子图都原生支持POST请求调用:
- 直接向子图的基础接口地址发送POST请求
- 请求体携带标准的GraphQL查询参数
- 接口直接返回标准JSON格式结果,和网页控制台点执行后展示的内容完全一致
- 不需要任何浏览器环境、不需要解析HTML,完全规避BeautifulSoup和Selenium遇到的DOM加载问题
可直接运行的代码
只需要安装requests依赖即可,不需要Chrome驱动、Selenium相关包:
import requests def find_datasets(): datasets = [] # 对应两条链的子图接口配置 subgraphs = [ { "network": "polygon", "api_addr": "https://v4.subgraph.polygon.oceanprotocol.com/subgraphs/name/oceanprotocol/ocean-subgraph" }, { "network": "ethereum", "api_addr": "https://v4.subgraph.mainnet.oceanprotocol.com/subgraphs/name/oceanprotocol/ocean-subgraph" } ] # 你需要执行的GraphQL查询语句,和网页端写的语法完全一致 query_content = """ { pools(orderBy: createdTimestamp, orderDirection: desc) { id datatoken { address } publishMarketSwapFee liquidityProviderSwapFee } } """ for subgraph in subgraphs: # 直接发起POST请求,移除原来的强制等待逻辑 resp = requests.post( subgraph["api_addr"], json={"query": query_content}, timeout=30 ) resp.raise_for_status() pool_data = resp.json() print(pool_data) # 结果解析逻辑和原有代码完全一致 for pool in pool_data['data']['pools']: datasets.append([ pool['id'], pool['datatoken']['address'], subgraph["network"], pool["liquidityProviderSwapFee"], pool["publishMarketSwapFee"] ]) return datasets
方案对比优势
- 资源占用极低:不需要启动Chrome进程,内存占用从数百MB降到数MB级别
- 运行效率高:去掉了原代码里累计40秒的强制sleep等待,普通查询1-3秒即可返回结果
- 无内容截断问题:接口直接返回全量JSON结果,不存在长响应需要滚动DOM才能加载完整内容的问题
- 稳定性更强:不需要定位页面按钮、结果窗口等DOM元素,不会因为GraphQL控制台前端改版导致脚本失效
扩展说明
如果需要查询指定区块的poolSnapshots数据,只需要把对应GraphQL查询语句替换到query_content变量里即可,查询语法和你在网页控制台使用的完全没有区别。如果遇到接口请求频率限制,加简单的重试逻辑或者请求间隔即可。
内容的提问来源于stack exchange,提问作者giacomomaraglino
相关产品推荐
相关产品推荐

