如何用R爬取Amcharts交互式数据?泛欧交易所数据提取求助
问题描述
尝试从Euronext的股票页面获取标的代码为FR0004040608的数据,但页面数据以Amcharts 1.1交互式图表形式展示,无法找到对应的GET/POST请求参数,推测网站采用了其他数据传输机制。
使用R的httr、rvest等工具尝试爬取,代码及结果如下:
library(httr) library(rvest) library(XML) url <- 'https://live.euronext.com/en/product/equities/FR0004040608-XPAR' page <- read_html(url) class(page) # "xml_document" "xml_node" xml_child(page, 2) # {html_node} # <body class="layout-no-sidebars path-product"> # [1] <a href="#main-content" class="visually-hidden focusable skip-link"> ... # [2] <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-T ... # .... # [20] <script src="/sites/default/files/js/optimized/js_gcfptZrWxdKuaT414lrcjk ... > page %>% html_nodes(xpath = '//*[@id="price-chart"]')%>% html_text() # character(0) page %>% html_nodes("script")%>% html_text() page %>% html_nodes("noscript")%>% html_text() # [1] "form.antibot * :not(.antibot-message) { display: none !important; }" # [2] ""
开发者工具观察到的现象:
- 点击图表「Max」按钮后界面展示完整历史数据
- 常规请求响应中不包含图表数据
- 数据最终渲染在SVG元素中
技术解决方案思路
1. 追踪动态数据请求
这类交互式图表的数据通常通过异步AJAX请求加载,而非直接嵌入页面HTML:
- 打开浏览器开发者工具(F12),切换到「网络」标签,过滤「XHR/Fetch」类型请求
- 刷新页面或点击图表「Max」按钮,观察新增请求,重点查找含
price、history、chart等关键词的接口 - 复制请求的Headers(尤其是
Authorization、Cookie等验证字段)和参数,用R的httr::GET()/POST()模拟请求
2. 提取页面内嵌的JSON数据
部分网站会将图表数据以JSON形式嵌入页面<script>标签:
- 用
page %>% html_nodes("script") %>% html_text()遍历所有脚本内容 - 用正则表达式匹配含
chartData、priceHistory等关键词的JSON片段,提取后用jsonlite::fromJSON()解析为R数据框
3. 解析SVG中的渲染数据
如果数据直接渲染在SVG中:
- 定位SVG节点:
svg_node <- page %>% html_nodes("#price-chart svg") - 提取SVG的
<path>(路径)或<text>(文本)元素,这些元素的d属性或文本内容可能包含编码后的坐标数据 - 结合Amcharts的坐标映射规则,将像素坐标转换为实际的价格/时间数据
4. 使用无头浏览器模拟渲染
若上述方法无效,说明数据通过JavaScript动态生成,需用无头浏览器执行渲染:
- 在R中可使用
RSelenium或playwright包,模拟浏览器加载页面并完成渲染 - 等待图表加载完毕后,直接从DOM中提取数据,或调用Amcharts的API(如
chart.series[0].data)获取原始数据
5. 备选方案:官方API
Euronext提供官方数据接口(Euronext Data Feed),可申请API密钥后直接获取结构化数据,避免爬虫的不稳定问题。
内容的提问来源于stack exchange,提问作者Koffi Frederic Sessie
相关产品推荐
相关产品推荐

