从网页抓取数据(关于网络爬虫最简单易用的扩展包是rvest的方法)
优采云 发布时间: 2021-12-21 21:15从网页抓取数据(关于网络爬虫最简单易用的扩展包是rvest的方法)
在 R 中,最简单易用的网络爬虫扩展包是 rvest。运行以下代码以从 CRAN 安装:
install.packages("rvest")
首先加载包并使用read_html()读取data/single-table.html,然后尝试从网页中提取表格:
图书馆(rvest)
##加载需要的包:xml2
single_table_page single_table_page
## {xml_document}
##
## [1]
## [2] \n
下面是一张表
\n 注意single_table_page是一个HTML解析文档,HTML节点的嵌套数据结构。
使用rvest函数抓取网页信息的典型流程是这样的。一、定位需要从中提取数据
数据的 HTML 节点。然后,使用 CSS 选择器或 XPath 表达式过滤 HTML 节点以选择
需要节点,删除不需要的节点。最后,为解析的页面使用适当的选择器,使用 html_
nodes() 提取节点的子集,使用 html_attrs() 提取属性,使用 html_text() 提取文本。
rvest 包还提供了一些简单的功能,可以直接从网页中提取数据并返回数据框。例如,
为了提取网页中的所有元素,我们直接调用html_table():
html_ _table(single_table_page)
## [[1]]
## 姓名年龄
## 1 珍妮 18
## 2 詹姆斯 19
为了提取表格中的第一个元素,当我们使用CSS选择器表格时,调用
html_node() 选择第一个节点,然后在选择的节点上调用 html_table() 得到一个数据框:
html_ _table(html_ _node(single_table_page, "table"))
## 姓名年龄
## 1 珍妮 18
## 2 詹姆斯 19
一个很自然的想法是使用管道操作,就像第十二章介绍的 dplyr 包中使用的 %>% 管道一样。
道路运营商。回顾一下,%>% 执行 x %>% f(...) 的基本方法是 f(x,...),因此,嵌入
可以反汇编设置调用以提高可读性。上面的代码可以用 %>% 重写为:
single_table_page %>%
html_ _node("表") %>%
html_ _table()
## 姓名年龄
## 1 珍妮 18
## 2 詹姆斯 19
现在,读取 data/products.html 并使用 html_nodes() 来匹配节点:
products_page products_page %>%
html_ _nodes(".product-list li .name")
## {xml_nodeset (3)}
## [1] 产品-A
## [2] 产品-B
## [3] 产品-C
注意我们要选择的节点是product-list类的label下属于name类的section
观点。因此,使用 .product-list li .name 来选择这样的嵌套节点。如果你不熟悉这些符号
是的,请查看常用的 CSS 表。
之后,使用 html_text() 从所选节点中提取内容。此函数返回一个字符向量:
products_page %>%
html_ _nodes(".product-list li .name") %>%
html_ _text()
## [1]“产品-A”“产品-B”“产品-C”
同样,以下代码提取产品价格:
products_page %>%
html_ _nodes(".product-list li .price") %>%
html_ _text()
## [1] "$199.95" "$129.95" "$99.95"
在前面的代码中, html_nodes() 返回 HTML 节点的集合,
并且 html_text() 智能地从每个 HTML 节点中提取内部文本,然后返回一个字符向量。
但是,这些价格保留了它们的原创格式,即字符串形式,而不是数字。下面的代码提到
取相同的数据并将其转换为更常用的格式:
product_items%
html_ _nodes(".product-list li")
产品名称 = product_items %>%
html_ _nodes(".name") %>%
html_ _text(),
价格 = product_items %>%
html_ _nodes(".price") %>%
html_ _text() %>%
gsub("$", "", ., 固定 = TRUE) %>%
as.numeric(),
stringsAsFactors = FALSE
)
产品
##名称价格
## 1 产品-A 199.95
## 2 产品-B 129.95
## 3 产品-C 99.95
请注意,选择节点的中间结果可以存储在变量中以供重复使用。跟进
html_nodes() 或 html_node() 只匹配内部节点。
由于产品价格是数字,我们可以使用gsub()从原价中去掉$,然后转换结果
转化为数值向量。流水线操作中的 gsub() 调用有点特殊,因为之前的结果(用 . 表示)
它应该放在第三个参数位置,而不是第一个。
在本例中,.product-list li .name 可以简写为.name,.product-list 也是如此
li .price 可以替换为 .price。在实际应用中,CSS 类被广泛使用,因此,一个通用的
的选择器可能匹配太多不需要的元素。因此,最好选择更清晰的描述和更严格的条件
网格的选择器以匹配感兴趣的节点。