rvest包总结
阅读数:290
1、rvest介绍
网络爬虫是讲呈现在网页上以非结构格式(html)存储的数据转化为结构化数据的技术,该技术非常简单易用。
rvest是R用户使用率最多的爬虫包,它简洁的语法可以解决大部分的爬虫问题。
基本使用方法:
-
使用read_html读取网页;
-
通过CSS或Xpath获取所需要的节点并使用html_nodes读取节点内容;
-
结合stringr包对数据进行清理。
与Python的比较:
-
Python倾向于做大型爬虫,与R相比,语法相对复杂,因此Python爬虫的学习曲线会相对陡峭。
-
对于那些时间宝贵,又想从网上获取数据的初学者而言,用R做爬虫是最好的选择:
-
R语法相对直观,规则更加灵活;
-
对于数据量不大的用户来数(小于百万级),R也能够非常自如地处理;
-
先学习R爬虫,等熟悉爬虫的原理之后,在过渡到Python是很容易的。
rvest的项目主页:https://cran.r-project.org/web/packages/rvest/index.html
2、API介绍
读取与提取:
-
read_html( ) 读取html文档的函数
-
html_nodes( ) 选择提取文档中指定元素的部分
-
html_name( ) 提取标签名称;
-
html_text( ) 提取标签内的文本;
-
html_attr( ) 提取指定属性的内容;
-
html_attrs( ) 提取所有的属性名称及其内容;
-
html_table( ) 解析网页数据表的数据到R的数据框中;
-
html_form( ) 提取表单。
乱码处理:
- guess_encoding( ) 用来探测文档的编码,方便我们在读入html文档时设置正确的编码格式
url <- "http://quote.eastmoney.com/stocklist.html"
x <- content(GET(url), "raw")
guess_encoding(x)
guess_encoding( )
用于探测网页的编码,遇到编码错误用这个解决
- repair_encoding( ) 用来修复html文档读入后的乱码问题
行为模拟:
-
set_values( ) 修改表单
-
submit_form( ) 提交表单
-
html_session( ) 模拟HTML浏览器会话
-
jump_to( ) 得到相对或绝对链接
-
follow_link( ) 通过表达式找到当前页面下的链接
-
session_history( ) 历史记录导航工具
3、函数详解
—3.1 读取与提取
——3.1.1 read_html
函数定义:read_html(x, encoding = "", ..., options = c("RECOVER", "NOERROR", "NOBLANKS"))
参数列表:
-
x 可以是url,本地路径,包含html的字符串,或者来自httr的请求如果x是URL参数就传递给GET()
-
encoding 文档的编码形式,查看iconvlist()有完整列表,他如果不能正确确定encoding方式可以尝试stri_enc_detect
应用实例:
——3.1.2 html_nodes
函数定义:
-
html_nodes(x, css, xpath)
-
html_node(x, css, xpath)
html_node只输出一个元素。当给了一个节点列表时,html_node将返回一个长度相等的列表。
参数列表:
-
x 完整的文档(XMLInternalDocument),tags列表(XMLNodeSet),单一的tag(XMLInternalElementNode)
-
css, xpath 要收集的节点。css和xpath 两种selector方式可选(class用".", id用"#"与标签连接, 标签之间用空格, ">"指定的筛选条件的父级标签),可使用浏览器插件Selector Gadget辅助(chrome中的css viewer 和 xpath helper 也是神器)
应用实例:
——3.1.3 html_name
函数定义:html_name(x)
参数列表:x 完整的文档(XMLInternalDocument),标签列表(XMLNodeSet)或(XMLInternalElementNode)
应用实例:
——3.1.4 html_text
函数定义:html_text(x, trim = FALSE)
参数列表:
-
x 完整的文档(XMLInternalDocument),标签列表(XMLNodeSet)或(XMLInternalElementNode)
-
trim 如果TRUE则过滤前后的空格
应用实例:
——3.1.5 html_attr
函数定义:
-
html_attr(x, name, default = NA_character_)
-
html_attrs(x)
参数列表:
-
x 完整的文档(XMLInternalDocument),标签列表(XMLNodeSet)或(XMLInternalElementNode)
-
name 要提取的属性名
-
default 若任何一个节点的属性不存在则用这里设置的string参数
应用实例:
——3.1.6 html_table
函数定义:html_table(x, header = NA, trim = TRUE, fill = FALSE, dec = ".")
参数列表:
-
x 网页文档、节点集或单个节点
-
header 如果为TRUE则使用第一行为列名,若为NA,当有<th>标签时使用第一行为列名
-
trim 如果为TRUE则过滤每个单元格前后的空格
-
fill 如果TRUE,自动填充缺失为NA
-
dec 字符转换为10进制
应用实例:
——3.1.7 html_form
函数定义:html_form(x)
参数列表:x 网页文档、节点集或单个节点
应用实例:
—3.2 乱码处理
——3.2.1 guess_encoding
函数定义:guess_encoding(x)
参数列表:x 字符型向量
应用实例:
——3.2.2 repair_encoding
函数定义:repair_encoding(x, from = NULL)
参数列表:
-
x 字符型向量
-
from 字符的实际编码格式
应用实例:
—3.3 行为模拟
——3.3.1 set_values( ) 修改表单
函数定义:set_values(form, ...)
参数列表:
-
form 要修改的表单
-
... 针对要修改控件的的名-值对
应用实例:
——3.3.2 submit_form
函数定义:submit_form(session, form, submit = NULL, ...)
参数列表:
-
session 要提交表单的会话
-
form 要提交的表单
-
submit 上传使用的button名,如果没有设置,默认为form第一个上传的button
-
... GET()和POST()的附加参数
应用实例:
——3.3.3 html_session
函数定义:
-
html_session(url, …)
-
is.session(x)
参数列表:
-
url 开始session的地址
-
... 这整个session的httr配置参数
-
x 欲测试是否是session的object
方法:
一个session结构可以响应httr和html方法的操作:可以访问请求的属性,以及可以使用html_nodes访问html。
应用实例:
——3.3.4 jump_to
函数定义:jump_to(x, url, ...)
参数列表:
-
x 一个会话
-
url 要访问的地址(相对或绝对)
应用实例:
——3.3.5 follow_link
函数定义:follow_link(x, i, css, xpath, ...)
参数列表:
-
x 一个会话
-
i 若为整型,则选择第i个链接;若为字符串,则选择包含该文本信息的第一个链接
-
css xpath 要选择的节点
-
... 能应用到这个请求的任何httr配置
应用实例:
——3.3.6 session_history
函数定义:
-
session_history(x)
-
back(x)
参数列表:x 一个会话
应用实例:
4、补充知识
—4.1 包外API
-
head( ) 检查数据
-
as.numeric( ) 转化为数值型
-
gsub( ) 移除" ", "\n", "\t"等
-
as.factor( ) 转化为因子
-
data.frame( ) 合并为数据框
-
trycatch( ) 错误处理
-
write.csv( ) 输出csv文件
-
file.download( ) 下载网络文件
-
read.table( ) 读取本地文件
-
save( ) 保存变量到本地
-
sapply( ) 向量化调用函数
-
iconv( ) 转化编码格式
-
rbind( ) 合并行
-
paste( ) 连接字符串,多用来生成有规律的链接地址
—4.2 关联package
-
stringr 字符串处理
-
RSelenium 模拟网页操作,可抓取动态页面
-
ggplot2 数据可视化
-
magrittr 辅助rvest
—4.3 使用技巧
- 获取特定序位的html标签,用到了magrittr包里的extract2函数。下面两行代码都可以获得该网页中第一个<table>标签
-
ateam %>% html_nodes("table") %>% extract2(1) %>% html_nodes("img")
-
ateam %>% html_nodes("table") %>%
[[
(1) %>% html_nodes("img")
-
%>%是管道操作符,意思是把左边的操作结果作为参数传递给右边的命令
-
需要换页的同类型页面的地址一般会有规律,找到规律后就可生成一系列地址
-
定位所需内容时,有时html_nodes+stringr更方便,不使用html_text
-
若爬取内容过多,可使用边爬边存或者分批处理等