以下翻译自:rvest包github项目主页
rvest包可以帮助我们从网页上抓取信息,它通常与magrittr包配合使用,便于进行常见的网络抓取任务。revest包的开发主要受启发于beautiful soup等库。
library(rvest)
lego_movie <- read_html("http://www.imdb.com/title/tt1490017/")
rating <- lego_movie %>%
html_nodes("strong span") %>%
html_text() %>%
as.numeric()
rating
#> [1] 7.8
cast <- lego_movie %>%
html_nodes("#titleCast .itemprop span") %>%
html_text()
cast
#> [1] "Will Arnett" "Elizabeth Banks" "Craig Berry"
#> [4] "Alison Brie" "David Burrows" "Anthony Daniels"
#> [7] "Charlie Day" "Amanda Farinos" "Keith Ferguson"
#> [10] "Will Ferrell" "Will Forte" "Dave Franco"
#> [13] "Morgan Freeman" "Todd Hansen" "Jonah Hill"
poster <- lego_movie %>%
html_nodes(".poster img") %>%
html_attr("src")
poster
#> [1] "http://ia.media-imdb.com/images/M/MV5BMTg4MDk1ODExN15BMl5BanBnXkFtZTgwNzIyNjg3MDE@._V1_UX182_CR0,0,182,268_AL_.jpg"
rvest包中最重要的几个函数如下:
read_html()
可以从url、磁盘中的文件或包含html结构的字符串中,读取html文档
通过css选择器html_nodes(doc, "table td")
选择文档的部分内容(如果不怕麻烦的话,也可以用xpath路径选择html_nodes(doc, xpath = "//table//td")
),如果你还没有听说过selectorgadget的话,请参阅vignette("selectorgadget")
html_tag()
提取标签名称,html_text()
提取标签内的所有文本内容,html_attr()
提取单个属性的值,html_attrs()
提取所有属性的值
rvest也可以用于处理XML文件:用xml()
解析,用xml_node()
/xml_nodes()
、xml_attr()
/xml_attrs()
、xml_text()
和xml_tag()
分别提取相应的元素
其中,xml()、xml_node()、xml_nodes()、xml_tag()属于
rvest包
的函数;read_html()、xml_text()、xml_attr、xml_attrs属于xml2包
的函数;加载rvest也会同时载入xml2。
【注】:html()
和xml()
都已弃用,统一改用read_html()
。
用html_table()
将网页中的表格解析为数据框形式
用html_form()
、set_values()
、submit_form()
分别提取、修改和提交表单
用guess_encoding()
、repair_encoding()
分别检测和修复字符编码问题
如果当前有可用的浏览器,通过html_session()
、jump_to()
、follow_link()
、back()
、forward()
、submit_form()
等函数可以与网站建立连接与会话。(此项目仍在进行中,欢迎反馈)
查看demos可了解这些函数的应用实例。
从CRAN安装已发行的版本:
install.packages("rvest")
或从github安装开发版本:
# install.packages("devtools")
devtools::install_github("hadley/rvest")
以下翻译自:rvest参考手册
版本:0.3.2
标题:网页简易爬取
描述:封装了xml2
、httr
包使其便于下载,用于处理HTM和XML文件
环境要求:R版本(>=3.0.1),xml2
载入:httr(>= 0.5),selectr,magrittr
建议:testthat,knitr,png,stringi(>=3.0.1),rmarkdown,covr
字符编码:UTF-8
许可证:GPL-3
LazyData:true
VignetteBuilder:knitr
RoxygenNote:5.0.1
URL:https://github.com/hadley/rvest
错误报告:https://github.com/hadley/rvest/issues
是否需要编译:否
作者:Hadley Wickham [aut, cre],RStudio [cph]
维护:Hadley Wickham [email protected]
库:CRAN
发行日期:2016-06-17 08:57:12
描述
当网页声明了错误的字符编码时,该函数可以提供帮助。使用guess_encoding
找出真正的字符编码形式(然后将其传递给html的字符参数)。或在找到真正的字符编码形式后,使用repair_encoding
修复字符向量。
用法
guess_encoding(x)
repair_encoding(x, from = NULL)
参数 | 说明 |
---|---|
x | 一个字符向量 |
from | 该字符向量的实际编码形式 |
stringi
这些函数封装自stringi包中的工具,因此必须保证已安装stringi包。
例子
# rvest包中有一个文档案例,该文档声明了错误的编码形式,x值将返回乱码
path <- system.file("html-ex", "bad-encoding.html", package = "rvest")
x <- read_html(path)
x %>% html_nodes("p") %>% html_text()
guess_encoding(x)
# 推测x的编码形式,得到两个相对有效的结果,其中只有一个是正确的
read_html(path, encoding = "ISO-8859-1") %>% html_nodes("p") %>% html_text()
read_html(path, encoding = "ISO-8859-2") %>% html_nodes("p") %>% html_text()
描述
给定id值,连接到google表单。
用法
google_form(x)
参数 | 说明 |
---|---|
x | 表单的唯一识别符 |
google_form("1M9B8DsYNFyDjpwSK6ur_bZf8Rv_04ma3rmaaBiveoUI")
描述
html已不再采用,请使用read_html()。
用法
html(x, ..., encoding = "")
## S3 method for class 'response'
read_xml(x, ..., encoding = "", as_html = FALSE)
## S3 method for class 'session'
read_xml(x, ..., as_html = FALSE)
参数 | 说明 |
---|---|
x | 一个url地址、本地路径、包含html结构的字符串,或通过httr请求得到的响应结果 |
… | 如果x是一个URL地址,就将附加参数传递给GET() |
encoding | 指定文档的字符编码,详阅iconvlist() 。如无法确定正确的字符编码,尝试stri_enc_detect |
as_html | 逻辑值,是否像解析html一样解析一个xml文件 |
# X是一个url地址:
google <- read_html("http://google.com", encoding = "ISO-8859-1")
google %>% xml_structure()
google %>% html_nodes("div")
# x是一个字符串(html5文件最低要求标签)
# http://www.brucelawson.co.uk/2010/a-minimal-html5-document/
minimal <- read_html("
blah
I'm the content"
)
minimal
minimal %>% xml_structure()
# x是一个httr请求的返回结果
google2 <- read_html(httr::GET("http://google.com"))
描述
解析网页中的表单。
用法
html_form(x)
参数 | 说明 |
---|---|
x | 一个节点、节点集或节点文件 |
参阅
HTML 4.01 表单的规范文档:http://www.w3.org/TR/html401/interact/forms.html
例子
html_form(read_html("https://hadley.wufoo.com/forms/libraryrequire-quiz/"))
html_form(read_html("https://hadley.wufoo.com/forms/r-journal-submission/"))
box_office <- read_html("http://www.boxofficemojo.com/movies/?id=ateam.htm")
box_office %>% html_node("form") %>% html_form()
描述
通过使用XPath和CSS选择器,更加方便地从HTML文档中提取片段。CSS选择器与selectorgadget共同使用将更为高效,帮助快速找到准确的选择路径。若之前从未使用过CSS选择器,请参阅这里。
用法
html_nodes(x, css, xpath)
html_node(x, css, xpath)
参数 | 说明 |
---|---|
x | 一个文档、节点集或单个节点 |
css,xpath | 待选择的节点,可以使用css或xpath 1.0二者之一 |
html_node与html_nodes:
html_node的作用类似于[[,用于精确抓取一个元素。当给定一系列节点时,html_node总是会返回一个长度相同的列表,而html_nodes返回的列表长度可能更长或更短。
CSS选择器
通过selectr包
(它是python cssselect库的端口),可以将CSS选择器转变为XPath选择器。
根据这里所描述的,大部分情况下采用CSS3选择器。一些例外情况如下:
:hover
,:active
,:focus
, :target
,:visited
*:first-of-type
,*:last-of-type
,*:nth-of-type
,*:nth-last-of-type
,*:only-of-type
:contains(text)
!=
, 例如[foo!=bar]
得到的结果与:not([foo=bar])
相同:not()
不止接受单个选择器,可接受一系列简单的选择器例子
# CSS选择器----------------------------------------------
ateam <- read_html("http://www.boxofficemojo.com/movies/?id=ateam.htm")
html_nodes(ateam, "center")
html_nodes(ateam, "center font")
html_nodes(ateam, "center font b")
# 但html_node最好是与magrittr包中的管道符函数%>%一起使用,这样可以将后续语句串接起来
ateam %>% html_nodes("center") %>% html_nodes("td")
ateam %>% html_nodes("center") %>% html_nodes("font")
td <- ateam %>% html_nodes("center") %>% html_nodes("td")
td
# 当作用于一系列节点时,html_nodes()会返回所有节点,将所有返回结果折叠为一个新的节点列表
td %>% html_nodes("font")
# html_node()返回首个匹配的节点。如果没有可匹配的节点,就会返回一个节点
if (utils::packageVersion("xml2") > "0.1.2") {
td %>% html_node("font")
}
# 为了能在指定位置将元素提取出来,用magrittr::extract2,它相当于[[
library(magrittr)
ateam %>% html_nodes("table") %>% extract2(1) %>% html_nodes("img")
ateam %>% html_nodes("table") %>% `[[`(1) %>% html_nodes("img")
# 找到前两个标签中的所有
标签
ateam %>% html_nodes("table") %>% `[`(1:2) %>% html_nodes("img")
ateam %>% html_nodes("table") %>% extract(1:2) %>% html_nodes("img")
# XPath选择器---------------------------------------------
# XPath的链式语句有点小技巧,你可能需要不断改变前缀,但用//可以帮助你从根节点开始选取,不论你现在处于文档中的哪一个位置
ateam %>%
html_nodes(xpath = "//center//font//b") %>%
html_nodes(xpath = "//b")
html_session 在html浏览器中模拟一个会话
描述
在html浏览器中模拟一个会话。
用法
html_session(url, ...)
is.session(x)
- 参数
参数
说明
url
开始会话的地址
…
整个会话过程中所使用到的任何httr配置参数
x
一个待检测的对象(检测其是否为一个会话)
方法
一个会话对象可以对httr、html方法操作产生响应:使用cookies(),headers()和status_code()来访问请求的属性;使用html_node()访问html。
例子
# http://stackoverflow.com/questions/15853204
s <- html_session("http://hadley.nz")
s %>% jump_to("hadley-wickham.jpg") %>% jump_to("/") %>% session_history()
s %>% jump_to("hadley-wickham.jpg") %>% back() %>% session_history()
s %>% follow_link(css = "p a")
html_table 将html中的表格解析为数据框
描述
将html中的表格解析为数据框。
用法
html_table(x, header = NA, trim = TRUE, fill = FALSE, dec = ".")
- 参数
参数
说明
x
一个节点、节点集或节点文件
header
是否将第一行设为表头?若为NA,则当含有 标签时,将以第一行作为表头
trim
删除每个单元格开头和结尾的空格
fill
逻辑值,若为TRUE,当行值小于最大列数时,自动将缺失的行值填充为NA
dec
字符转换为10进制
假设
目前html_table是基于如下假设:
- 每个单元格无跨行
- 表头在第一行
例子
tdist <- read_html("http://en.wikipedia.org/wiki/Student%27s_t-distribution")
tdist %>%
html_node("table.infobox") %>%
html_table(header = FALSE)
births <- read_html("https://www.ssa.gov/oact/babynames/numberUSbirths.html")
html_table(html_nodes(births, "table")[[2]])
# 如果网页表格的格式很糟糕,每一列中的行值数目不同,可以设定参数fill=TRUE。
skiing <- read_html("http://data.fis-ski.com/dynamic/results.html?sector=CC&raceid=22395")
skiing %>%
html_table(fill = TRUE)
html_text 从html中提取属性、文本和标签名
描述
从html中提取属性、文本和标签名。
用法
html_text(x, trim = FALSE)
html_name(x)
html_children(x)
html_attrs(x)
html_attr(x, name, default = NA_character_)
- 参数
参数
说明
x
一个文档、节点或节点集
trim
若为TRUE,则将删除开头和结尾的空格
name
待提取属性的名称
default
当遍历每个节点都未找到目标属性时,默认返回的字符
值
html_attr,html_tag,html_text返回的是一个字符向量。
html_attrs返回的是一个列表。
例子
movie <- read_html("http://www.imdb.com/title/tt1490017/")
cast <- html_nodes(movie, "#titleCast span.itemprop")
html_text(cast)
html_name(cast)
html_attrs(cast)
html_attr(cast, "class")
jump_to 指向新的url
描述
jump_to()获取相对或绝对链接;follow_link通过表达式获取当前页面下的链接(在标签中)。
用法
jump_to(x, url, ...)
follow_link(x, i, css, xpath, ...)
- 参数
参数
说明
x
一个会话过程
url
待跳转的相对或绝对链接
…
本次请求所需的httr配置参数
i
i 可以是一个整数型,表明匹配到第 i 个链接;i 也可以是一个字符串(区分大小写),表明匹配到首个含该字符串的链接
css,xpath
待选择的节点,可以使用css或xpath 1.0二者之一
- 例子
s <- html_session("http://hadley.nz")
s <- s %>% follow_link("github")
s <- s %>% back()
s %>% follow_link("readr")
pluck 通过指定位置,提取列表中的元素
描述
通过指定位置,提取列表中的元素。
用法
pluck(x, i, type)
- 参数
参数
说明
x
一个列表
i
字符串或整数型
type
输出类型
session_history 历史记录导向工具
描述
历史记录导向工具。
用法
session_history(x)
back(x)
- 参数
参数
说明
x
一个会话过程
set_values 设置表单中的值
描述
设置表单中的值。
用法
set_values(form, ...)
- 参数
参数
说明
form
待修改的表单
…
名称-值对
值
返回一个更新后的表单对象。
例子
search <- html_form(read_html("http://www.google.com"))[[1]]
set_values(search, q = "My little pony")
set_values(search, hl = "fr")
## Not run: set_values(search, btnI = "blah")
submit_form 将表单返回给服务器
描述
将表单返回给服务器。
用法
submit_form(session, form, submit = NULL, ...)
- 参数
参数
说明
session
待提交表单的会话
form
待提交的表单
submit
提交表单时所点击的按钮的名称,若未设置,则以表单中的首个提交按钮为默认值
…
传递给GET()或POST()的附加参数
值
若提交成功,被解析的html页面会产生响应。若http请求失败,会返回错误信息。通过创建submit_request返回的元素,来获取其他元素的响应信息。
例子
test <- google_form("1M9B8DsYNFyDjpwSK6ur_bZf8Rv_04ma3rmaaBiveoUI")
f0 <- html_form(test)[[1]]
f1 <- set_values(f0, entry.564397473 = "abc")
参考资料:
rvest包文档简易翻译
网页爬取利器——rvest
扒一扒rvest的前世今生
你可能感兴趣的:(【包】R语言rvest包简介)