如何用Python(Databricks环境)爬取Highcharts图表数据?
解决方案:爬取Macromicro网站Highcharts数据
核心问题分析
Highcharts的图表数据是动态生成的,静态HTML里不会直接包含Highcharts.charts对象,需要通过以下几种方式获取:
方法1:直接提取页面中的全局数据变量
很多网站会把图表数据预存在页面的<script>标签里,而非通过JS动态计算。步骤如下:
- 用
requests获取页面源码 - 用正则匹配包含图表数据的全局变量(比如搜索
series、data相关的结构)
示例代码:
import requests import re import json url = "https://en.macromicro.me/collections/4356/freight/44756/drewry-world-container-index" 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" } response = requests.get(url, headers=headers) # 匹配包含Highcharts数据的脚本内容,根据实际页面调整正则 pattern = re.compile(r'Highcharts\.charts\[0\]\.series = (.*?);', re.DOTALL) match = pattern.search(response.text) if match: series_data = json.loads(match.group(1)) # 提取每个series的key和y字段 result = [] for series in series_data[:9]: # 取series[0]到series[8] for item in series.get("data", []): result.append({ "key": item.get("key"), "y": item.get("y") }) print(result[:5]) # 打印前5条验证 else: print("未找到目标数据变量")
方法2:用Selenium动态渲染页面(Databricks适配)
如果数据是完全动态生成的,需要模拟浏览器执行JS:
- 先在Databricks安装依赖:
%pip install selenium webdriver-manager
- 编写Selenium代码:
from selenium import webdriver from selenium.webdriver.chrome.options import Options from webdriver_manager.chrome import ChromeDriverManager import json chrome_options = Options() chrome_options.add_argument("--headless") # 无头模式适配Databricks环境 chrome_options.add_argument("--no-sandbox") chrome_options.add_argument("--disable-dev-shm-usage") driver = webdriver.Chrome(ChromeDriverManager().install(), options=chrome_options) driver.get("https://en.macromicro.me/collections/4356/freight/44756/drewry-world-container-index") # 执行JS获取Highcharts数据 script = """ var result = []; for(var i=0; i<9; i++){ var series = Highcharts.charts[0].series[i]; series.data.forEach(item => { result.push({key: item.key, y: item.y}); }); } return result; """ data = driver.execute_script(script) print(data[:5]) driver.quit()
方法3:抓包获取原始API接口(最高效)
- 打开浏览器开发者工具(F12)→ Network → XHR
- 刷新页面,寻找返回图表数据的接口(通常是
.json或不带后缀的API路径) - 直接请求该接口获取结构化数据,无需处理HTML或JS
示例(假设接口为实际抓包得到的地址,需自行确认):
import requests api_url = "实际抓包得到的API地址" 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", "Referer": "https://en.macromicro.me/collections/4356/freight/44756/drewry-world-container-index" } response = requests.get(api_url, headers=headers) data = response.json() # 提取所需的key和y字段(根据接口返回结构调整)
注意事项
- 必须添加
User-Agent等请求头,避免被网站拦截 - Databricks环境中使用Selenium需确保集群有足够权限运行Chrome
- 若遇到反爬,可尝试添加
Cookies(从浏览器复制)或使用代理
内容的提问来源于stack exchange,提问作者Boris Rendón
相关产品推荐
相关产品推荐

