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

抓取barchart.com调用API返回Code 500内部错误问题求解

错误原因
  • 硬编码了过期的X-XSRF-TOKEN:barchart的XSRF令牌是临时会话凭证,每次访问站点都会刷新,复制的浏览器端固定令牌会快速失效,必须从当前会话的cookies中动态提取。
  • 接口地址配置错误:代码中填写的apiurl为/proxies/core-api/v1/quotes/get(行情通用接口),而你需要请求的是期权数据专用接口,正确地址为/proxies/core-api/v1/options/get。
  • 请求头存在冗余干扰字段:headersIV中手动添加了method、scheme、path这类请求元字段,requests会自动生成此类参数,手动添加会导致服务端识别异常。
  • 过滤参数过期:payload中between(tradeTime,2021-10-21,2021-10-22)为2021年的固定日期,早已超出有效范围,会触发接口查询逻辑异常。
  • 缺少基础依赖导入:原代码未导入requests库,无法正常发起请求。
修复后的完整代码
import requests
from urllib.parse import unquote
from datetime import datetime, timedelta

# 生成最近两个交易日的动态日期(可根据需求调整)
end_date = datetime.now().strftime("%Y-%m-%d")
start_date = (datetime.now() - timedelta(days=1)).strftime("%Y-%m-%d")

geturl = r'https://www.barchart.com/options/highest-implied-volatility'
# 修正为期权数据接口地址
apiurl = r'https://www.barchart.com/proxies/core-api/v1/options/get'

getheaders = {
    'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
    'accept-encoding': 'gzip, deflate, br',
    'accept-language': 'en-US,en;q=0.9',
    'cache-control': 'max-age=0',
    'upgrade-insecure-requests': '1',
    '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'
}

getpay = {
    'page': 'all'
}

s = requests.Session()
# 先访问页面获取会话cookies
r = s.get(geturl, params=getpay, headers=getheaders)
# 动态提取并解码XSRF-TOKEN
xsrf_token = unquote(s.cookies['XSRF-TOKEN'])

headersIV = {
    'Accept': 'application/json',
    'Accept-Encoding': 'gzip, deflate, br',
    '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',
    'Accept-Language': 'en-US,en;q=0.9',
    'Referer': 'https://www.barchart.com/options/highest-implied-volatility',
    'X-XSRF-TOKEN': xsrf_token
}

payloadIV = {
    'fields': 'symbol,baseSymbol,baseLastPrice,baseSymbolType,symbolType,strikePrice,expirationDate,daysToExpiration,bidPrice,midpoint,askPrice,lastPrice,volume,openInterest,volumeOpenInterestRatio,volatility,tradeTime,symbolCode,hasOptions',
    'orderBy': 'volatility',
    'baseSymbolTypes': 'stock',
    'between(lastPrice,.10,)': '',
    'between(daysToExpiration,15,)': '',
    # 替换为动态日期
    f'between(tradeTime,{start_date},{end_date})': '',
    'orderDir': 'desc',
    'between(volatility,60,)': '',
    'limit': '200',
    'between(volume,500,)': '',
    'between(openInterest,100,)': '',
    'in(exchange,(AMEX,NASDAQ,NYSE))': '',
    'meta': 'field.shortName,field.type,field.description',
    'hasOptions': 'true',
    'raw': '1'
}

r = s.get(apiurl, params=payloadIV, headers=headersIV)
j = r.json()
print(j)
注意事项
  • 该站点有完善的反爬机制,不要短时间内发起大量请求,否则会被临时封禁IP。
  • 可根据自身需求调整payload中的过滤参数,比如波动率阈值、到期天数、成交量阈值等。
  • 若遇到请求失败,可先更新User-Agent字段为当前浏览器的标识,再重新尝试。

内容的提问来源于stack exchange,提问作者chem.cs

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 07:45:08