如何用Python提取交互式图表动态数据?已试Selenium+BeautifulSoup
提取Investidor10资产演化图表数据的Python方案
针对你遇到的图表数据需点击才显示、静态解析无法提取的问题,以下两个Python方案可以解决:
方案一:用Selenium模拟交互提取
既然点击柱状图才会弹出数据,直接用Selenium模拟点击操作,然后提取弹窗内容即可,步骤如下:
- 初始化Selenium浏览器,加载目标页面
- 等待图表元素加载完成
- 定位所有柱状图的可点击元素
- 逐个点击,提取弹窗中的资产价值、资本收益、投资金额
- 整理并保存数据
示例代码:
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import time # 初始化Chrome浏览器(需提前配置好chromedriver) driver = webdriver.Chrome() driver.get("https://investidor10.com.br/carteira/572422/") try: # 等待图表加载,等待第一个柱状图元素出现 wait = WebDriverWait(driver, 15) bars = wait.until(EC.presence_of_all_elements_located((By.CLASS_NAME, "highcharts-point"))) data_list = [] for bar in bars: # 用JS点击避免元素遮挡问题 driver.execute_script("arguments[0].click();", bar) time.sleep(0.5) # 等待弹窗渲染 # 提取弹窗数据,需根据页面实际元素结构调整选择器 try: tooltip_texts = driver.find_elements(By.CSS_SELECTOR, ".highcharts-tooltip span") if len(tooltip_texts) >=3: data_list.append({ "资产价值": tooltip_texts[0].text, "资本收益": tooltip_texts[1].text, "投资金额": tooltip_texts[2].text }) except Exception as e: print(f"单条数据提取失败: {e}") continue # 输出提取结果 for idx, item in enumerate(data_list, 1): print(f"第{idx}条数据: {item}") finally: driver.quit()
注意:需要用浏览器开发者工具查看页面实际的元素class、CSS选择器,调整代码中的定位规则,确保能准确抓取弹窗内容。
方案二:抓取后台API接口(更高效)
图表数据通常通过AJAX请求从后端API获取,直接抓这个接口比模拟点击更高效:
- 打开浏览器开发者工具(F12),切换到「网络」标签
- 刷新页面,筛选「XHR」或「Fetch」请求,找到包含图表数据的接口(关键词通常是
evolution、history、chart) - 复制该接口的URL、请求头和参数
- 用
requests库发送请求,解析返回的JSON数据
示例代码:
import requests # 替换为你找到的实际API接口URL api_url = "https://investidor10.com.br/api/carteira/evolution/572422" # 构造请求头,至少保留User-Agent,若需登录则添加Cookie headers = { "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", # 若网站需要登录验证,复制浏览器中的Cookie填入:"Cookie": "你的cookie内容;" } # 发送请求并解析数据 response = requests.get(api_url, headers=headers) data = response.json() # 根据API返回的JSON结构解析数据 data_list = [] for entry in data.get("data", []): data_list.append({ "日期": entry.get("date"), "资产价值": entry.get("valor_carteira"), "资本收益": entry.get("rendimento"), "投资金额": entry.get("aporte_total") }) # 输出结果 for item in data_list: print(item)
这个方案的关键是找到正确的API接口,你可以在浏览器网络请求列表中逐一排查,找到返回包含日期、资产数值的JSON数据的请求即可。如果接口需要登录态,直接复制浏览器中的Cookie到请求头即可。
内容的提问来源于stack exchange,提问作者Thiago Silva
相关产品推荐
相关产品推荐

