R语言Web Scraping爬取彭博行情前值价格返回空值问题
爬取失败的核心原因
你拿不到前值价格和选择器写法没有直接关系,核心问题有两个:
- 你用的CSS选择器里的类名是彭博前端构建时自动生成的哈希类名,类似
overviewRow__66339412a5、value__7e29a7c90d这类后缀的随机字符串,每次页面版本更新都会变化,当前能抓到当前价格只是巧合,类名更新后选择器会直接失效。 - 彭博的前值、涨跌幅、开盘价这类行情数据,不是写在页面首次返回的静态HTML里的,是页面加载完成后由JS异步拉取接口数据再渲染到DOM上的。
rvest的read_html()只能抓取初始静态源码,不会执行页面内的JS代码,自然拿不到后续才渲染出来的前值数据,你把所有section节点爬下来也找不到对应值。
修正方案
- 优先直接抓取数据接口:打开浏览器开发者工具的网络面板,刷新页面后筛选Fetch/XHR请求,就能找到返回
WORLD:IND全量行情数据的接口,直接用httr请求接口解析返回的JSON即可,接口返回的是结构化数据,自带前值、涨跌幅等所有行情字段,比解析HTML稳定很多,也不需要JS渲染环境。 - 如果需要解析页面DOM,换用支持JS渲染的爬取组件,比如R生态的
chromote、RSelenium包,调用真实浏览器内核加载页面,等所有JS执行完成、数据全部渲染到页面后再做元素提取。提取元素时不要用带随机哈希的动态类名,优先通过固定文本(比如"Previous Close"字段标签)定位相邻的数值节点,避免类名变动导致选择器失效。
现有代码的具体问题
- 第一段抓前值的代码用
div.value__7e29a7c90d做选择器:静态HTML里这个类名对应的节点要么不存在,要么默认填充值为0,真实的前值是JS运行后才替换进去的,所以只能拿到0。 - 第二段遍历所有section节点的代码:静态源码里的section节点本身就没有填充异步加载的行情数据,自然搜不到目标值。
内容的提问来源于stack exchange,提问作者youraz
相关产品推荐
相关产品推荐

