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

使用CCXT异步请求Bybit接口遭遇403错误,同步请求正常

解决CCXT异步请求Bybit接口403拦截问题

问题描述

使用CCXT的async_support模块编写Python异步代码请求Bybit接口时,收到403错误提示请求被拦截,但同步方式请求一切正常。

异步代码示例:

import ccxt.async_support as ccxt
import asyncio

async def main():
    exchange = ccxt.bybit()

    await exchange.load_markets()

    symbol = 'BTC/USDT'

    ticker = await exchange.fetch_ticker(symbol)

    print(f'BTC/USDT 当前价格: {ticker["last"]}')

asyncio.run(main())

收到的错误信息:

请求链接:https://api.bybit.com/v5/market/instruments-info?category=spot
Request blocked.
目前无法连接到此应用或网站的服务器。可能是流量过大或配置错误。请稍后重试,或联系应用或网站所有者。
如果您通过CloudFront向客户提供内容,可以查看CloudFront文档了解故障排除步骤并帮助防止此错误。

可能原因及解决方案

Bybit的CloudFront反爬机制可能识别了异步请求的默认特征(比如请求头、并发模式),以下是几种可行的解决方法:

1. 自定义请求头(模拟常规UA)

异步版本CCXT的默认请求UA可能和同步版存在差异,手动设置为常见浏览器UA或同步版UA:

import ccxt.async_support as ccxt
import asyncio

async def main():
    exchange = ccxt.bybit({
        'headers': {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36'
        }
    })

    await exchange.load_markets()
    symbol = 'BTC/USDT'
    ticker = await exchange.fetch_ticker(symbol)
    print(f'BTC/USDT 当前价格: {ticker["last"]}')
    await exchange.close()  # 异步版本必须手动关闭连接池

asyncio.run(main())

2. 启用请求速率限制

异步请求可能因并发过高触发反爬,开启enableRateLimit并配置合理间隔:

import ccxt.async_support as ccxt
import asyncio

async def main():
    exchange = ccxt.bybit({
        'enableRateLimit': True,
        'rateLimit': 1000  # 每次请求间隔1秒
    })

    await exchange.load_markets()
    symbol = 'BTC/USDT'
    ticker = await exchange.fetch_ticker(symbol)
    print(f'BTC/USDT 当前价格: {ticker["last"]}')
    await exchange.close()

asyncio.run(main())

3. 替换API端点域名

尝试使用Bybit的备用API域名,绕过CloudFront的CDN拦截:

import ccxt.async_support as ccxt
import asyncio

async def main():
    exchange = ccxt.bybit({
        'urls': {
            'api': {
                'spot': 'https://api.bytick.com/v5'
            }
        }
    })

    await exchange.load_markets()
    symbol = 'BTC/USDT'
    ticker = await exchange.fetch_ticker(symbol)
    print(f'BTC/USDT 当前价格: {ticker["last"]}')
    await exchange.close()

asyncio.run(main())

4. 务必关闭异步连接池

异步版本CCXT如果不手动关闭连接池,残留的连接可能被识别为异常请求,代码结束前必须调用await exchange.close()。

注意事项

  • 测试时先从单次请求验证,再逐步增加并发量
  • 不要频繁修改请求头或参数,避免触发更严格的反爬策略
  • 若以上方法无效,可尝试使用高质量代理IP

内容的提问来源于stack exchange,提问作者Александр Ивонин

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 15:11:08