抓取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
相关产品推荐
相关产品推荐

