当我在Chrome浏览器中打开这个link,将光标悬停在左上角的Stocks上,并从类别Most Active中 Select Trading Liquidity,我可以看到该页面上显示的所需数据.

我试图使用下面的脚本复制我可以在Chrome dev工具中看到的XHR查询,但结果是STATUS_CODE 400.

import requests

url = 'https://www.barchart.com/proxies/core-api/v1/quotes/get'
link = 'https://www.barchart.com/stocks/most-active/daily-volume-leaders'

headers = {
    'Accept': 'application/json',
    'Accept-Encoding': 'gzip, deflate, br',
    'Accept-Language': 'en-US,en;q=0.5',
    'Host': 'www.barchart.com',
    'Referer': 'https://www.barchart.com/stocks/most-active/trading-liquidity',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:121.0) Gecko/20100101 Firefox/121.0',
}

params = {
    'lists': 'stocks.us.trading_liquidity.advances.overall',
    'orderDir': 'desc',
    'fields': 'symbol,symbolName,lastPrice,priceChange,percentChange,averageVolume100d,sharesOutstanding,tradingRatio,tradeTime,symbolCode,symbolType,hasOptions',
    'orderBy': 'tradingRatio',
    'meta': 'field.shortName,field.type,field.description,lists.lastUpdate',
    'hasOptions': 'true',
    'page': '1',
    'limit': '100',
    'raw': '1',
}

with requests.Session() as s:
    s.headers.update(headers)
    res = s.get(link)
    s.headers['X-Xsrf-Token'] = res.cookies['XSRF-TOKEN']
    resp = s.get(url)
    print(resp.status_code)
    print(resp.json())

如何让脚本生成JSON响应?

推荐答案

问得好,我需要做些调查.

Cookie的编码不正确,因此需要unquote个:

from urllib.parse import unquote

然后:

s.headers['X-XSRF-Token'] = unquote(res.cookies['XSRF-TOKEN'])

使用您的代码:

import requests
from urllib.parse import unquote

url = 'https://www.barchart.com/proxies/core-api/v1/quotes/get'
link = 'https://www.barchart.com/stocks/most-active/daily-volume-leaders'

headers = {
    'Accept': 'application/json',
    'Accept-Encoding': 'gzip, deflate, br',
    'Accept-Language': 'en-US,en;q=0.5',
    'Host': 'www.barchart.com',
    'Referer': 'https://www.barchart.com/stocks/most-active/trading-liquidity',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:121.0) Gecko/20100101 Firefox/121.0',
}

params = {
    'lists': 'stocks.us.trading_liquidity.advances.overall',
    'orderDir': 'desc',
    'fields': 'symbol,symbolName,lastPrice,priceChange,percentChange,averageVolume100d,sharesOutstanding,tradingRatio,tradeTime,symbolCode,symbolType,hasOptions',
    'orderBy': 'tradingRatio',
    'meta': 'field.shortName,field.type,field.description,lists.lastUpdate',
    'hasOptions': 'true',
    'page': '1',
    'limit': '100',
    'raw': '1',
}

with requests.Session() as s:
    s.headers.update(headers)
    res = s.get(link)
    s.headers['X-XSRF-Token'] = unquote(res.cookies['XSRF-TOKEN'])
    resp = s.get(url, params=params)
    print(resp.status_code)
    print(resp.json())

Python相关问答推荐

分析历史数据:多年来每天每小时的平均值

无法在Python中使用Selenium标记正确的元素以抓取网站

将列中的滚动值集转换为单元格中的单个值

aiohTTP与pytest的奇怪行为

单击Cookie横幅错误并在Selenium中启用搜索栏

如何将Pydantic URL验证限制为特定主机或网站

仅使用2种 colored颜色 创建热图

情节生成的饼图文本超出页面边界

将词典写入Excel

使用Beautiful Soup获取第二个srcset属性

如何将Matplotlib的fig.add_axes本地坐标与我的坐标关联起来?

使用regex分析具有特定字符的字符串(如果它们存在)

从包含数字和单词的文件中读取和获取数据集

使用FASTCGI在IIS上运行Django频道

ModuleNotFound错误:没有名为Crypto Windows 11、Python 3.11.6的模块

将两只Pandas rame乘以指数

如何在Python数据框架中加速序列的符号化

DataFrames与NaN的条件乘法

连接一个rabrame和另一个1d rabrame不是问题,但当使用[...]'运算符会产生不同的结果

如何使用SentenceTransformers创建矢量嵌入?