求助:用Python(Selenium)抓取RSPO CREDITS Highcharts数据至DataFrame
提取RSPO CREDITS Highcharts数据到Pandas DataFrame
核心思路
Highcharts 图表的数据会直接暴露在页面的全局 JavaScript 对象中,无需定位DOM元素提取,直接用Selenium执行JS代码就能拿到原始数据,效率更高。
实现步骤&代码示例
from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By import pandas as pd # 初始化Chrome浏览器(需提前配置好ChromeDriver) driver = webdriver.Chrome() driver.get("https://rspo.org/palmtrace") # 等待图表加载完成(以页面中存在Highcharts容器为判断条件) WebDriverWait(driver, 20).until( EC.presence_of_element_located((By.CLASS_NAME, "highcharts-container")) ) # 执行JS获取页面所有Highcharts实例 charts = driver.execute_script("return window.Highcharts.charts;") # 初始化存储数据的列表 data_records = [] # 遍历每个图表实例 for chart in charts: # 跳过空实例 if not chart: continue # 获取图表标题,筛选出RSPO CREDITS相关图表 chart_title = chart.get('title').get('textStr') if not chart_title or "RSPO CREDITS" not in chart_title: continue # 获取x轴的年月分类数据 x_categories = chart.get('xAxis')[0].get('categories') # 获取图表中的系列(信用数量、美元价格) series_data = chart.get('series') # 遍历每个指标系列 for series in series_data: series_name = series.get('name') # 只处理目标指标 if series_name not in ["Credit Quantity", "USD Price"]: continue # 匹配每个数据点的年月和数值 for idx, point in enumerate(series.get('data')): year, month = x_categories[idx].split('-') data_records.append({ "图表名称": chart_title, "年份": year, "月份": month, "指标类型": series_name, "数值": point.get('y') }) # 转换为Pandas DataFrame df = pd.DataFrame(data_records) # 统一数值类型,空值转为NaN df['数值'] = pd.to_numeric(df['数值'], errors='coerce') # 关闭浏览器 driver.quit() # 查看结果示例 print(df.head())
关键细节说明
- 获取Highcharts实例:
window.Highcharts.charts是Highcharts的全局变量,直接存储了页面所有图表的实例对象,通过Selenium执行JS即可直接获取。 - 筛选目标图表:通过标题包含"RSPO CREDITS"过滤,避免处理页面上的无关图表。
- 年月解析:x轴分类直接是
YYYY-MM格式,拆分即可得到年份和月份,无需额外处理时间戳。 - 数据匹配:每个系列的索引与x轴分类索引一一对应,确保年月和数值精准匹配。
常见问题处理
- 若页面加载过慢,可延长
WebDriverWait的超时时间(比如调整为30秒)。 - 若x轴格式发生变化,需对应调整年月拆分的逻辑。
- 若存在空数据点,
pd.to_numeric的errors='coerce'参数会将其转为NaN,方便后续数据清洗。
内容的提问来源于stack exchange,提问作者Funkeh-Monkeh
相关产品推荐
相关产品推荐

