问题:如何用rvest中的节点和类提取网页数据

我正在一个网站上执行网页抓取,并且已经能够获取基本数据,但我现在需要从页面更复杂的部分收集数据。

我正在使用 rvest 从 AAA 天然气价格网站提取数据:

https://gasprices.aaa.com/

我现在正在尝试提取仅显示在地图上的县级数据(如果您将光标悬停在单个县上。我需要获取不同州各个县的县天然气价格。例如,如果您单击在缅因州,要转到缅因州页面(https://gasprices.aaa.com/?stateu003dME),我需要在网上抓取 Aroostook(地图上最北端的县)的价格。

我已经能够使用 rvest 提取都市区的数据(页面下方),使用html_nodes和节点“td”。但是,地图的代码更复杂。开发者工具(在 Chrome 中)不是简单的“td”节点,而是根据价格提供<td class="fm-tooltip-comment">$4.928</td(4.928 美元是 Aroostook 的当前价格,截至本文发布之日)。我似乎无法用 rvest 包来识别它来提取它。

我读过可以使用该类,或者其他人建议使用 css 代码在 rvest 中指定它,但我不熟悉如何这样做。提取都市区的数字很简单,但是嵌入在地图中的县级价格似乎不太容易获得。

有没有办法提取这个县级数据,以便我可以在 R 中进行网页抓取?而且,这对于我必须选择的所有县/州是否可以重复?我是否需要 css 代码,如果需要,如何正确访问/编写它以供 rvest 使用?

解答

看起来您要查找的信息存储在网页加载时下载的“index.php”文件中。缅因州的当前链接是“https://gasprices.aaa.com/index.php?premiumhtml5map_js_datau003dtrue&map_idu003d21&ru003d89346&veru003d5.9.3”。

我不确定 ru003d89346 的值是什么,可能是时间戳、跟踪 ID、临时令牌(以防止网络抓取)等。我怀疑此 URL 会更改,因此您可能需要使用浏览器上的开发人员工具来获取当前网址。

另外,map_id 指的是州,但我不知道合理性,佛罗里达州是 1,NC 是 35,缅因州是 21。

下载此文件,然后提取 JSON 数据并进行转换。数据以 {"st1": 开头并以 }} 结尾。

library(dplyr)

#read the index_php file and turn it into character string
index_php <-readLines("https://gasprices.aaa.com/index.php?premiumhtml5map_js_data=true&map_id=21&r=19770&ver=5.9.3")
index_php <- paste(index_php, collapse = " ")

#extract out the correct JSON data part and convert
jsondata <- stringr::str_extract(index_php, "\\{\"st1\":.+?\\}\\}") 
data<-jsonlite::fromJSON(jsondata)

#create a data frame with the results
answer <- bind_rows(data)

      id name         shortname link  comment image color_map color_map_over
   <int> <chr>        <chr>     <chr> <chr>   <chr> <chr>     <chr>         
 1     1 Androscoggin ""        ""    $4.964  ""    #ca3338   #ca3338       
 2     2 Aroostook    ""        ""    $4.928  ""    #dd7a7a   #dd7a7a       
 3     3 Cumberland   ""        ""    $4.944  ""    #ca3338   #ca3338       
 4     4 Franklin     ""        ""    $4.936  ""    #dd7a7a   #dd7a7a       
 5     5 Hancock      ""        ""    $4.900  ""    #01b5da   #01b5da       
 6     6 Kennebec     ""        ""    $4.955  ""    #ca3338   #ca3338 

有一些额外的列需要删除,我把它留给读者作为练习。

Logo

学AI,认准AI Studio!GPU算力,限时免费领,邀请好友解锁更多惊喜福利 >>>

更多推荐