超越交易所API的加密货币和NFT市场数据抓取

交易所API有速率限制,并且只涵盖它们列出的币种。DEX对、NFT底价和铸币日历存在于JS繁重的页面后面,并有机器人检测。以下是如何可靠地收集所有这些数据。

加密货币市场数据看起来应该很简单——每个交易所肯定都有API?确实如此,但这些API有速率限制,只涵盖交易所列出的资产,并且对很多重要信息毫无涉及:去中心化交易所(DEX)对和NFT市场。如果你正在构建价格追踪器、上市机器人或另类数据源,你会很快达到API的上限,必须抓取剩下的部分。本指南涵盖了加密货币和NFT数据的层次,何时使用API与抓取,以及保持实时数据流的代理设置。它是关于数据收集,而非投资建议。

市场数据的三个层次

将数据分为三个层次。中心化交易所和聚合器数据——价格、市值、流通供应量、24小时交易量和1小时/24小时/7天变化——是像CoinMarketCap和CoinGecko这样的网站提供的内容,也是最容易获取的。DEX数据——实时对价格、流动性、新上市——存在于JavaScript渲染的页面上,很少有干净的免费API。NFT数据——底价、上市数量、铸币日历——位于客户端渲染的市场页面上,并运行机器人检测。大多数项目至少需要这三个层次中的两个,这就是为什么仅靠API永远无法满足需求。

从聚合器API开始

对于顶级CEX数据,首先使用公共聚合器API——它是免费的JSON,快速且已标准化。问题在于速率限制:免费层将你的调用次数限制在每分钟的适度数量,一旦你频繁轮询数百种资产,这种限制就会崩溃。尽可能少地调用以获取大批量快照,然后抓取API未涵盖的长尾部分。

import requests

# one call returns the top 100 by market cap, already normalised
r = requests.get(
    "https://api.coingecko.com/api/v3/coins/markets",
    params={"vs_currency": "usd", "order": "market_cap_desc",
            "per_page": 100, "page": 1},
    timeout=15,
)
for c in r.json()[:5]:
    print(c["symbol"], c["current_price"],
          c["total_volume"], c["price_change_percentage_24h"])

当你超出免费速率限制时,将请求分散到旋转IP上,这样每个IP的上限就不再是你的瓶颈。因为聚合器端点类似API且宽松,快速的数据中心代理是这里的经济选择——便宜、快速,足以并行化轮询而不触发限制。

交易所API与加密货币数据抓取的比较图,显示速率限制和DEX对及NFT底价的覆盖
聚合器API为你提供快速干净的CEX数据,但限制你并跳过DEX对和NFT——抓取正好填补了这些空白。

DEX对和交易所页面:渲染JavaScript

DEX对页面和许多交易市场页面通过JavaScript绘制价格和图表,并有激进的机器人检测——原始HTTP请求只会得到一个空壳。要读取实时对价格、流动性或代币的完整交易视图,你需要通过代理在无头浏览器中渲染页面。等待价格元素而不是固定的休眠,并在每次运行时旋转出口IP,以防止端点识别重复访问者。

from playwright.sync_api import sync_playwright

PROXY = {"server": "http://gate.quantumproxies.io:8000",
         "username": "USER", "password": "PASS"}

def pair_price(url, selector):
    with sync_playwright() as p:
        browser = p.chromium.launch(proxy=PROXY)
        page = browser.new_page()
        page.goto(url, wait_until="networkidle", timeout=30000)
        page.wait_for_selector(selector)          # wait for the price to render
        price = page.inner_text(selector)
        browser.close()
        return price

如果你要渲染很多这样的页面,维护一个浏览器群加上代理旋转会变得繁重。Scraper API渲染JavaScript,击败机器人层,并在一次调用中返回干净的数据——我们关于抓取JavaScript繁重网站的说明解释了何时切换。

使用Scraper API渲染JS繁重的加密货币页面

NFT底价和铸币日历

NFT数据是上市机器人和底价清扫者运行的基础:一个收藏的当前底价,有多少被列出,以及新铸币何时上线。市场页面在客户端渲染,所以可靠的方法是按紧凑的时间表快照一个收藏的底价并进行差异化——底价的下降或上市的激增是交易者采取行动的信号。铸币日历是同样的模式应用于即将到来的发行:轮询日历,捕获新条目,并对你关心的条目发出警报。

import time

def watch_floor(collection_url, selector, interval=60):
    last = None
    while True:
        floor = float(pair_price(collection_url, selector).strip(" ETH"))
        if last is not None and floor < last:
            print(f"floor dropped {last} -> {floor}")   # act on the dip
        last = floor
        time.sleep(interval)                              # snapshot cadence

这是上市机器人依赖数据生存或死亡的地方。一个对底价下降或新上市做出反应的狙击机器人只有在其数据流快速时才有效,而一个被速率限制或被阻止的数据流是毫无价值的。获胜的机器人积极轮询其目标收藏,使用干净的旋转IP,并将所有内容标准化为一种格式——收藏、价格、货币、时间戳——以便在市场间比较下降。抓取问题和交易问题是同一个问题:保持数据新鲜,永远不要被源头拒之门外。

通过代理从中心化交易所、DEX对和NFT市场拉取数据到时间序列存储的加密货币数据管道流程图
一个管道将CEX、DEX和NFT信号标准化;价值在于按节奏快照,而不是单次拉取。

哪个层次用哪个代理

将代理与目标匹配。聚合器和公共JSON端点宽松——快速、便宜的数据中心代理加上旋转处理它们,并保持你的每GB成本低。DEX页面、交易市场视图和NFT市场运行真实的机器人检测,因此需要住宅IP或携带浏览器指纹的Scraper API。要避免的错误是为愿意服务数据中心IP的端点支付住宅带宽——这在我们的何时使用数据中心代理指南中有介绍。因为这些数据流支持另类数据策略,我们的基金另类数据指南中的同样收集纪律适用:为所有内容加上时间戳,并按固定节奏快照。

常见问题解答

为什么在交易所有API时还要抓取加密货币数据?

交易所API有速率限制,只涵盖交易所列出的资产。它们不公开DEX对价格、NFT底价或铸币日历,免费层限制你的调用量。抓取填补了这些空白——代币的长尾、去中心化市场和市场数据——并让你跨源聚合API从未连接的数据。

我需要代理来抓取加密货币和NFT数据吗?

对于公共API的轻量使用,不需要。对于频繁轮询或抓取DEX和NFT页面,需要。聚合器端点限制每个IP的调用,因此旋转数据中心代理提高了你的吞吐量。DEX和市场页面运行机器人检测,这需要住宅IP或渲染JavaScript并携带浏览器指纹的Scraper API。

我如何抓取NFT底价?

市场收藏页面在客户端渲染,因此通过代理在无头浏览器中渲染页面,等待底价元素,并按计划快照。对连续快照进行差异化以捕捉下降和上市激增。每次运行旋转出口IP,并调整你的轮询速度,以免市场标记重复访问者。

我应该多久快照一次加密货币价格?

这取决于用例。投资组合追踪在分钟级别即可;用于交易信号的DEX和NFT底价监控通常需要更紧的间隔,对于最活跃的对甚至需要到秒级。更快的轮询增加了请求量和被封锁的风险,因此将其分散到旋转IP上,并存储时间戳以重建系列。

加密货币和NFT市场数据跨越三个层次——CEX聚合器、DEX对、NFT底价和铸币——没有单一API能覆盖它们。从聚合器开始获取干净的CEX快照,通过代理渲染JS繁重的DEX和市场页面,并根据每个目标的防护程度匹配代理类型:宽松的JSON使用便宜的数据中心IP,防护页面使用住宅或Scraper API。按节奏快照,为所有内容加上时间戳,标准化为一种格式,你就拥有一个能看到整个市场的数据流,而不仅仅是一个交易所碰巧列出的币种。

开始使用QuantumProxies收集市场数据