如何使用rvest指定节点与class提取网页县级油价数据
AAA油价网站县级数据爬取方案
1. R环境下的具体实现方法
直接用html_nodes()搜fm-tooltip-comment抓不到数据是必然的:这个带价格的td节点是鼠标悬停到地图区块时,前端JS临时插入DOM的,rvest本身不执行页面JS,只能抓取服务器首次返回的静态HTML源码,初始源码里根本不存在这个节点,自然定位不到。
不用上RSelenium这类重型浏览器自动化方案,完全是杀鸡用牛刀,直接提取页面内嵌的原始数据源即可,步骤如下:
- 用
rvest::read_html()读取对应州的页面源码 - 提取页面所有script标签内的JS文本,县级油价数据在页面加载时就已经全量写死在JS变量里,地图悬浮窗只是调用这部分数据做展示,根本没有做隐藏
- 用字符串匹配提取存储县级数据的JSON数组,用jsonlite转成R可直接处理的结构化表格,就能拿到该州所有县的实时油价,不需要模拟任何鼠标操作。
参考实现代码:
library(rvest) library(jsonlite) library(stringr) # 读取缅因州页面 me_page <- read_html("https://gasprices.aaa.com/?state=ME", encoding = "UTF-8") # 提取所有脚本块内容 script_blocks <- me_page %>% html_elements("script") %>% html_text2() # 匹配县级油价数据的JSON结构 county_data <- script_blocks %>% str_subset("county|tooltip") %>% str_extract("\\[\\{.*?\\}\\]") %>% fromJSON() # 提取阿鲁斯图克县油价 aroostook_gas_price <- county_data[county_data$county_name == "Aroostook", "price"]
2. 方法复用性说明
这个方案可以直接复用到所有州的县级数据采集:
- 全美所有州的子页面结构完全统一,县级油价都存储在命名规则一致的JS变量中,没有单独设置反爬逻辑
- 采集时只需要替换URL里的州缩写参数即可,不需要修改核心提取逻辑
- 唯一需要注意的是部分用西语、法语命名的县存在特殊字符,读取页面时指定UTF-8编码就不会出现乱码或数据丢失。
3. CSS选择器相关问题说明
这个场景下不需要用CSS选择器定位,也不推荐用:
- 动态生成的悬浮节点在静态源码中不存在,就算写对了CSS选择器,用rvest的静态爬取逻辑也抓不到内容。如果硬要走DOM定位的路线,必须启动真实浏览器模拟悬停操作,等节点渲染后再提取,采集效率极低还容易触发站点反爬。
- 如果是定位静态存在的带class属性的节点,适配rvest的CSS选择器写法很简单:标签名加.class名即可,比如你看到的价格节点选择器就是
td.fm-tooltip-comment,如果节点是静态存在的,直接传入html_elements(css = "td.fm-tooltip-comment")就能定位。 - 日常写选择器不需要手动敲,在Chrome开发者工具的元素面板找到目标节点,右键选择「Copy - Copy selector」就能直接拿到可用的选择器语句,粘贴到rvest函数里就能用,不用自己拼规则。
内容的提问来源于stack exchange,提问作者flâneur
相关产品推荐
相关产品推荐

