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

如何用requests和BeautifulSoup抓取Quantalys基金页面的动态图表?

抓取Quantalys基金页面底部图表的实现方法

问题描述

想要抓取某基金页面(页面ID为45865)的底部图表,已写出初步代码框架,但不清楚POST请求的query和data参数内容,同时发现有4个同名的API接口https://www.quantalys.com/Fonds/GetCompoTableAndGraph,需要明确实现方式。

初始代码框架:

url = "https://www.quantalys.com/Fonds/Composition/45865" 
api_url = "https://www.quantalys.com/Fonds/GetCompoTableAndGraph" # But there are 4 files named like that!!!
        
soup = BeautifulSoup(requests.get(url).content, "html.parser")

query = [??????] # I do not know what sort of information to input there
data = {???????} # I do not know what sort of information to input there

data = requests.post(api_url, data=data).json()
graph = json.loads(data['graph']) 
df = pd.DataFrame(graph['graph'])

解决方案

1. 分析API请求参数

这个接口是POST请求,参数需要从浏览器开发者工具的「网络」面板抓取实际请求参数:

  • 打开目标页面,按下F12启动开发者工具,切换到「网络」标签
  • 筛选「XHR」类型请求,找到GetCompoTableAndGraph的POST请求,查看「Form Data」栏的参数内容

2. 提取必要参数

从页面和请求中提取以下核心参数:

  • __RequestVerificationToken:页面内置的防CSRF令牌,可通过BeautifulSoup从页面的<input>标签提取
  • idFonds:基金ID,即页面URL末尾的45865
  • type:图表类型标识,比如1对应资产类别分布图表
  • period:数据时间周期,比如0对应最新数据
  • 其他固定参数:如isGar、isSynthese等,直接从实际请求中复制即可

3. 完整实现代码

import requests
from bs4 import BeautifulSoup
import json
import pandas as pd

# 目标页面URL
url = "https://www.quantalys.com/Fonds/Composition/45865"
api_url = "https://www.quantalys.com/Fonds/GetCompoTableAndGraph"

# 建立会话,维持Cookie和令牌一致性
session = requests.Session()
page_response = session.get(url)
soup = BeautifulSoup(page_response.content, "html.parser")

# 提取防CSRF令牌
csrf_token = soup.find("input", {"name": "__RequestVerificationToken"}).get("value")

# 构造POST请求参数
post_data = {
    "__RequestVerificationToken": csrf_token,
    "idFonds": "45865",
    "type": "1",  # 可根据需要的图表类型调整参数值
    "period": "0", # 0代表最新数据,其他值可从页面选项中获取
    "isGar": "False",
    "isSynthese": "False"
}

# 发送请求并解析数据
api_response = session.post(api_url, data=post_data)
api_result = api_response.json()

# 解析图表数据并转为DataFrame
graph_data = json.loads(api_result['graph'])
df = pd.DataFrame(graph_data['graph'])

# 输出结果示例
print(df.head())

关于多个同名API的说明

浏览器中显示的4个同名请求,是不同参数组合的请求(比如对应不同的图表类型或时间周期)。你只需根据目标图表的需求,构造对应参数的POST请求即可,无需处理所有4个请求。

内容的提问来源于stack exchange,提问作者Jacques

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 18:20:07