You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

替代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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 21:24:10