r语⾔解析html,R语⾔爬⾍⼊门-rvest教程
安装包
白果的用途# install.packages("rvest")压力很大怎么办
查看rvest包的详细信息
library(help = rvest)
包的⽤法:
read_html() 读取html⽂档的函数,其输⼊可以是线上的url,也可以是本地的html⽂件,甚⾄是包含html的字符串也可以。
html_nodes() 选择提取⽂档中制定元素的部分。可以使⽤css lectors,例如html_nodes(doc, "table td");也可以使⽤xpath lectors,例如html_nodes(doc, xpath = "//table//td")。
html_tag() 提取标签名称;html_text() 提取标签内的⽂本;html_attr() 提取指定属性的内容;html_attrs() 提取所有的属性名称及其内容;
垃圾简笔画
html_table() 解析⽹页数据表的数据到R的数据框中。
html_form(),t_values()和submit_form() 分别表⽰提取、修改和提交表单。
在中⽂⽹页中我们经常会遇到乱码的问题,这⾥提供了两个函数来解决:guess_encoding()⽤来探测⽂档的编码,⽅便我们在读⼊html⽂档时设置正确的编码格式,repair_encoding()⽤来修复html⽂档读⼊后的乱码问题。
还有⼀些函数,⽤来模拟⽹上的浏览⾏为,如html_ssion(),jump_to(),follow_link(),back(),forward(),submit_form()等等。意外的发现作文
library(rvest)
web
position % html_nodes("p.pl") %>% html_text()
web
自强的故事
position
第⼀⾏是加载Rvest包。
第⼆⾏是⽤read_html函数读取⽹页信息(类似Rcurl⾥的getURL),在这个函数⾥只需写清楚⽹址和编码(⼀般就是UTF-8)即可。
第三⾏是获取节点信息。⽤%>%符号进⾏层级划分。web就是之前存储⽹页信息的变量,所以我们从这⾥开始,然后html_nodes()函数获取⽹页⾥的相应节点。在下⾯代码⾥我简单的重现了原⽹页⾥的⼀个层级结构。可以看到,实际上我们要爬取的信息在25个class属性为pl 的
标签⾥的⽂本。
[清] 曹雪芹 著 / ⼈民⽂学出版社 / 1996-12 / 59.70元
⽽对于这样的结构,在htmlnodes()函数⾥的写法就是简单的 "p.pl",其中“.”表⽰class属性的值,如果是id属性则⽤“#”,如果⼤家学过CSS选择器就很好理解了,是完全⼀致的。
最后我们⽤html_text()函数表⽰获取⽂本信息,否则返回的是整个
标签。总体上⽤以下⼀⾏代码就可以实现:
Example 2
盒⼦中,⽽每⼀⾏数据⼜都在ul中。所以,我们可以通过这两个特征来提取数据。
获取
以及ul中内容的R代码如下:
library(rvest)
library(plyr)
city
date
baUrl
Url
content %
read_html(encoding='GBK') %>%
html_nodes('div.tqtongji2') %>%
html_nodes("ul") %>%
html_text()
head(content)
发现数据之间⽤rntt之类的隔开。⽽'rntt'这些⾥⾯有:回车符,换⾏符和制表符。他们的共同点就是全都是空格。所以我们可以通过空格来进⾏分列,提取相应的数据。
content % strsplit("\\s{4,}")
content
为了美观和⽅便操作,我们把它转换为数据框的形式:
content
names(content)
content
Example 3 R 爬⾍之 rvest 包 :穿越表单 + 图⽚下载器
什么是会话?会话的出现是为了跟踪 cookie,保证 cookie 长期有效,只有当会话被关闭时,cookie 便会失效。你可以把会话(Session)想象成在浏览器中打开的页⾯窗⼝,你之所以可以在这个窗⼝执⾏很多操作,这是因为服务器端知道你的 cookie 中存在有效的SessionID,所以服务器会⼀直通过你的请求,把资源给你。
为什么要创建会话?后⾯我们将实现表单穿越时,需要保证是在会话窗⼝执⾏。
怎么创建会话?使⽤ html_ssion( ) 函数。
u
ssion
什么是表单?HTML 中的表单被⽤来搜集⽤户的不同类型的输⼊。例如,登录表单、搜索框表单等。HTML 表单
包含表单元素,表单元素是指不同类型的 input 元素、复选框(box)、单选(radio)、提交按钮(submit)等。
《我和我的祖国》
怎么穿越表单?分为以下⼏步:
提取出你所需要的表单:html_form( )
填写你的表单:t_values(form, name1=value1, name2=value2)
提交表单,发送给服务器:submit_form(ssion, form)
forms % html_form()
forms
form
form
采购管理制度在上⾯的结果中,只有 'arch_text' :的冒号后为空,这表明 'arch_text' 还没有填充任何值,⽽我们的填充任务就是把它填上。⽐如说我要搜索“美⼈鱼”,那么我就在t_values( ) 中指定⼀个 arch_text 参数,令它的值为“美⼈鱼”。
自动离职那么,现在我们的表单已经填充好了,只需要把它提交给服务器了。
filled_form
ssion2
ssion$url # 查看初始 ssion 的 url
ssion2$url # 查看提交表单后,返回的新会话 ssion2 的 url
iconv(URLdecode(ssion2$url), "UTF8")
显然,在提交表单后,我们访问的链接发⽣了变化。
PS:ssion2$url 之所以会有⼀堆 %A %B 之类的符号,是因为我们搜索的⽂本是中⽂,所以提交请求时,链接中的中⽂被再次编码。执⾏下⾯语句,便可以将链接变成我们能看懂的形式: