【包】R语言rvest包简介

以下翻译自rvest包github项目主页

R语言rvest包简介

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参考手册

rvest包

2016年8月29日

版本:0.3.2
标题:网页简易爬取
描述:封装了xml2httr包使其便于下载,用于处理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
URLhttps://github.com/hadley/rvest
错误报告https://github.com/hadley/rvest/issues
是否需要编译:否
作者:Hadley Wickham [aut, cre],RStudio [cph]
维护:Hadley Wickham hadley@rstudio.com
:CRAN
发行日期:2016-06-17 08:57:12


encoding  推测并修复错误的字符编码

  • 描述
    当网页声明了错误的字符编码时,该函数可以提供帮助。使用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()

google_form  给定id值,连接到google表单

  • 描述
    给定id值,连接到google表单。

  • 用法

google_form(x)
  • 参数
参数说明
x表单的唯一识别符
  • 例子
google_form("1M9B8DsYNFyDjpwSK6ur_bZf8Rv_04ma3rmaaBiveoUI")

html  解析一个HTML页面

  • 描述
    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("<!doctype html>
                     <meta charset=utf-8>
                     <title>blah</title>
                     <p>I'm the content")
minimal
minimal %>% xml_structure()

# x是一个httr请求的返回结果
google2 <- read_html(httr::GET("http://google.com"))

html_form  解析网页中的表单

  • 描述
    解析网页中的表单。

  • 用法

html_form(x)
  • 参数
参数说明
x一个节点、节点集或节点文件
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()

html_nodes  从HTML文档中选择节点

  • 描述
    通过使用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选择器。一些例外情况如下:

    1. 用于交互需求的伪类选择器在此不起作用::hover:active:focus, :target:visited
    2. 下述伪类对通配符*不起作用:*:first-of-type*:last-of-type*:nth-of-type*:nth-last-of-type*:only-of-type
    3. 其支持:contains(text)
    4. 使用!=, 例如[foo!=bar]得到的结果与:not([foo=bar])相同
    5. :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()返回首个匹配的节点。如果没有可匹配的节点,就会返回一个<NA>节点
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")

# 找到前两个<table>标签中的所有<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,则当含有<th>标签时,将以第一行作为表头
trim删除每个单元格开头和结尾的空格
fill逻辑值,若为TRUE,当行值小于最大列数时,自动将缺失的行值填充为NA
dec字符转换为10进制
  • 假设
    目前html_table是基于如下假设:

    1. 每个单元格无跨行
    2. 表头在第一行
  • 例子

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通过表达式获取当前页面下的链接(在<a>标签中)。

  • 用法

jump_to(x, url, ...)
follow_link(x, i, css, xpath, ...)
  • 参数
参数说明
x一个会话过程
url待跳转的相对或绝对链接
本次请求所需的httr配置参数
ii 可以是一个整数型,表明匹配到第 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的前世今生

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值