基于R语⾔rvest包的⽹页数据爬取(基础)
基于R语⾔rvest包的⽹页数据爬取(基础)
Project Num:201901
写在前⾯:
在使⽤技术⼿段爬取需要登录账号才可以获取到的数据时,请先认真阅读该⽹站的⽤户协议,以免产⽣不必要的法律问题。
⽂末附带html节点速查表以及rvest包函数功能速查表
关于html5页⾯源码的常识
html5是指包括HTML、CSS、JavaScript在内的⼀套技术组合。
(以下⼯作建议在firefox浏览器中进⾏)
前情提要:
HTML是超⽂本标记语⾔,重点去体会标记语⾔的特点,我个⼈感觉类似markdown(例如Rmarkdown),每⼀个节点开头都是
以<node_Name>开始,以</node_Name>结尾,举例:
<!DOCTYPE html>
<html>
<head>
<title>
⽂档标题
</title>
</head>
<body>
可见⽂本
</body>
</html>
看起来层次感很强,节点名永远是以⼀对或多对的形式出现。(这段html5的源码可以粘在⼀份*.txt⽂件⾥,然后把扩展名改为html,然后⽤web浏览器打开)
检查元素
检查⽹页元素是爬取⽹页内容的基础,你可以在浏览器中查看你所要爬取的数据所在的页⾯,将光标移动到要爬取的内容上,然后右键选择查看元素
然后打开查看器,我们可以看到"统计与数学学院"的域名与⽂本
可以看到,在"内蒙古财经⼤学"的官⽹⾸页中,党政部门、各学院以及教辅部门的内容被放在若⼲个<li></li>节点中,⽽这些节点则在id="binf"的<div></div>节点⾥,所以到这⾥我们可以将我们所需要的内容范围缩⼩到<div id="binf"></div>⾥。
明确了要爬取的节点之后,我们就可以开始使⽤R语⾔中的rvest包中的函数来尝试爬取数据了。
⽹络数据爬取的基本流程(基于R语⾔rvest包):
(来源:我瞎编的)
⾸先要明确⼀下我们的⽬标:
爬取内蒙古财经⼤学官⽹中各党政部门、各学院以及教辅部门的名称以及其官⽹的域名
# 加载包(加载包的习惯最好放在前⾯,东⼀个包西⼀个包不好整理)
library("dplyr") # 管道操作符所属的包
library("rvest") # 本次爬取⽹页数据的⼯具在这⾥
# 获取⽹站的url
# 本次url以www.imufe.edu为例
IMUFE_url <- "www.imufe.edu" # 要注意是http协议还是https协议
# 读取⽹页源码(read_html())
allSourceCode <- IMUFE_url %>%
read_html(encoding = "UTF-8") # UTF-8是内蒙古财经⼤学官⽹⾸页的编码⽅式,国内有些⽹站还会使⽤GBK编码;
此时allSourceCode就是页⾯的全部源码,根据我们之前对⽹页的分析,我们需要提取<div id="binf"></div>节点的信息,所以要使
⽤html_node()来进⾏处理,需要注意的是rvest包中有⼀个html_node()函数和⼀个html_nodes()函数,差别在于前者提取第⼀个符合条件的节点,后者提取符合条件的所有节点。
allSourceCode <- allSourceCode %>%
html_node("div[id=binf]")
#这段中的html_node()建议逐级往下写,因为有时候节点内容会被最⼩化,
#导致跨级爬取的时候返回NULL
此时的allSourceCode就是<div id="binf"></div>节点的所有源码了;
我们现在先提取个=各部门名称,通过查看元素,我们发现部门名称被放置在<a></a>节点中,但是并不在<>中,所以部门名称在这⾥是⼀种⽂本格式的内容,我们先提取<a></a>节点的源码(这个时候就需要html_nodes()了),然后使⽤html_text()函数提取其中的⽂本:
IMUFE_text <- allSourceCode %>%
html_nodes("a") %>%
html_text()
IMUFE_text
这就是我们需要的样⼦
接下来开始爬取各部门的域名,由于各部门的域名都是以链接的形式存放再<a></a>节点中,所以我们⾸先需要提取节点<a></a>,但是由于刚才提取的名称属于⽂本,这次属于链接,所以这次要使⽤另⼀个函数html_attrs()来处理:
IMUFE_url <- allSourceCode %>%
html_nodes("a") %>%
html_attrs()
emmmm和我想要的不太⼀样,现在每条数据都有两个值,但是我只需要第⼀条,所以得处理⼀下,只保留第⼀条:
for (i in 1:length(IMUFE_url)) {
IMUFE_url[[i]] <- IMUFE_url[[i]][1]
}
IMUFE_url <- cbind(IMUFE_url)
IMUFE_url
这个样⼦就是我们要的域名。
那么接下来就是⼀连串熟悉的操作了:
IMUFE_data_frame <- data.frame(IMUFE_text,IMUFE_url)
IMUFE_data_frame
这样就是我们最常见的数据框格式了。(有我⼤统数,emmmm,那就没问题了)
附录:
rvest包常⽤函数
(来源:rvest包帮助⽂档)
function_Name meaning_English meaning_Chinese back History navigation tools导航⼯具encoding Guess and repair faulty character encoding.猜测并修复错误的字符编码。
follow_link Navigate to a new url.导航到⼀个新的url。
google_form Make link to google form given id使链接到⾕歌形式给定的id guess_encoding Guess and repair faulty character encoding.猜测并修复错误的字符编码。
html Parse an HTML page.解析HTML页⾯。
html_attr Extract attributes, text and tag name from html.从html中提取属性、⽂本和标记名称。
html_attrs Extract attributes, text and tag name from html.从html中提取属性、⽂本和标记名称。
html_children Extract attributes, text and tag name from html.从html中提取属性、⽂本和标记名称。
html_form Parse forms in a page.解析页⾯中的表单。
html_name Extract attributes, text and tag name from html.从html中提取属性、⽂本和标记名称。
html_node Select nodes from an HTML document从HTML⽂档中选择节点
html_nodes Select nodes from an HTML document从HTML⽂档中选择节点html_session Simulate a session in an html browser.在html浏览器中模拟会话。
html_table Parse an html table into a data frame.将html表解析为数据帧。
html_text Extract attributes, text and tag name from html.从html中提取属性、⽂本和标记名称。
is.session Simulate a session in an html browser.在html浏览器中模拟会话。
jump_to Navigate to a new url.导航到⼀个新的url。
pluck Extract elements of a list by position.按位置提取列表的元素。
sponse Parse an HTML page.解析HTML页⾯。
read_xml.session Parse an HTML page.解析HTML页⾯。
repair_encoding Guess and repair faulty character encoding.猜测并修复错误的字符编码。
session_history History navigation tools历史记录导航⼯具set_values Set values in a form.在表单中设置值。
submit_form Submit a form back to the server.将表单提交回服务器。HTML标记速查表
(来源:w3cSchool)
网页设计html代码大全w3cschool
HTML 基本⽂档