如何用rvest中的节点和类提取网页数据
问题:如何用rvest中的节点和类提取网页数据 我正在一个网站上执行网页抓取,并且已经能够获取基本数据,但我现在需要从页面更复杂的部分收集数据。 我正在使用 rvest 从 AAA 天然气价格网站提取数据: https://gasprices.aaa.com/ 我现在正在尝试提取仅显示在地图上的县级数据(如果您将光标悬停在单个县上。我需要获取不同州各个县的县天然气价格。例如,如果您单击在缅因州,要
问题:如何用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
有一些额外的列需要删除,我把它留给读者作为练习。
更多推荐
所有评论(0)