如何用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末尾的45865type:图表类型标识,比如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
相关产品推荐
相关产品推荐

