基于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浏览器打开)

检查元素

检查网页元素是爬取网页内容的基础,你可以在浏览器中查看你所要爬取的数据所在的页面,将光标移动到要爬取的内容上,然后右键选择查看元素

基于R语言rvest包的网页数据爬取(基础)
然后打开查看器,我们可以看到"统计与数学学院"的域名与文本
基于R语言rvest包的网页数据爬取(基础)
可以看到,在"内蒙古财经大学"的官网首页中,党政部门、各学院以及教辅部门的内容被放在若干个<li></li>节点中,而这些节点则在id="binf"<div></div>节点里,所以到这里我们可以将我们所需要的内容范围缩小到<div id="binf"></div>里。
基于R语言rvest包的网页数据爬取(基础)
明确了要爬取的节点之后,我们就可以开始使用R语言中的rvest包中的函数来尝试爬取数据了。

网络数据爬取的基本流程(基于R语言rvest包):

(来源:我瞎编的)

首先要明确一下我们的目标:
爬取内蒙古财经大学官网中各党政部门、各学院以及教辅部门的名称以及其官网的域名

# 加载包(加载包的习惯最好放在前面,东一个包西一个包不好整理)
library("dplyr") # 管道操作符所属的包
library("rvest") # 本次爬取网页数据的工具在这里

# 获取网站的url
# 本次url以www.imufe.edu.cn为例
IMUFE_url <- "http://www.imufe.edu.cn" # 要注意是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]")  

此时的allSourceCode就是<div id="binf"></div>节点的所有源码了;
我们现在先提取个=各部门名称,通过查看元素,我们发现部门名称被放置在<a></a>节点中,但是并不在<>中,所以部门名称在这里是一种文本格式的内容,我们先提取<a></a>节点的源码(这个时候就需要html_nodes()了),然后使用html_text()函数提取其中的文本:

IMUFE_text <- allSourceCode %>% html_nodes("a") %>% html_text()
IMUFE_text

基于R语言rvest包的网页数据爬取(基础)
这就是我们需要的样子
接下来开始爬取各部门的域名,由于各部门的域名都是以链接的形式存放再<a></a>节点中,所以我们首先需要提取节点<a></a>,但是由于刚才提取的名称属于文本,这次属于链接,所以这次要使用另一个函数html_attrs()来处理:

IMUFE_url <- allSourceCode %>% html_nodes("a") %>% html_attrs()

基于R语言rvest包的网页数据爬取(基础)
emmmm和我想要的不太一样,现在每条数据都有两个值,但是我只需要第一条,所以得处理一下,只保留第一条:

for (i in 1:length(IMUFE_url)) {
  IMUFE_url[[i]] <- IMUFE_url[[i]][1]
}
IMUFE_url <- cbind(IMUFE_url)
IMUFE_url

基于R语言rvest包的网页数据爬取(基础)
这个样子就是我们要的域名。
那么接下来就是一连串熟悉的操作了:

IMUFE_data_frame <- data.frame(IMUFE_text,IMUFE_url)
IMUFE_data_frame

基于R语言rvest包的网页数据爬取(基础)

这样就是我们最常见的数据框格式了。(嗯。。有我大统数,嗯,那就没问题了)



附录:

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. 按位置提取列表的元素。
read_xml.response 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 基本文档
<!DOCTYPE html>
<html>
<head>
<title>文档标题</title>
</head>
<body> 可见文本... </body>
</html>
基本标签(Basic Tags)
<h1>最大的标题</h1>
 <h2> . . . </h2>
 <h3> . . . </h3>
 <h4> . . . </h4>
 <h5> . . . </h5>
 <h6>最小的标题</h6>
 <p>这是一个段落。</p>
 <br> (换行)
 <hr> (水平线)
 <!-- 这是注释 -->
文本格式化(Formatting)
<b>粗体文本</b>
 <code>计算机代码</code>
 <em>强调文本</em>
 <i>斜体文本</i>
 <kbd>键盘输入</kbd> 
 <pre>预格式化文本</pre>
 <small>更小的文本</small>
 <strong>重要的文本</strong>
 <abbr> (缩写)
 <address> (联系信息)
 <bdo> (文字方向)
 <blockquote> (从另一个源引用的部分)
 <cite> (工作的名称)
 <del> (删除的文本)
 <ins> (插入的文本)
 <sub> (下标文本)
 <sup> (上标文本)
链接(Links)
普通的链接:<a href="https://www.w3cschool.cn/html/链接地址">链接文本</a>
图像链接: <a href="http://www.example.com/"><img src="URL" alt="替换文本"></a> 
邮件链接: <a href="https://www.w3cschool.cn/html/mailto:[email protected]">发送e-mail</a>
书签: <a id="tips">
提示部分</a> <a href="https://www.w3cschool.cn/html/html-quicklist.html#tips">跳到提示部分</a>
图片(Images)
<img src="URL" alt="替换文本" height="42" width="42">
样式/区块(Styles/Sections)
<style type="text/css">
   h1 {color:red;}
   p {color:blue;}
 </style>
 <div>文档中的块级元素</div>
 <span>文档中的内联元素</span>
无序列表
<ul>
   <li>项目</li>
   <li>项目</li>
 </ul>
有序列表
<ol>
   <li>第一项</li>
   <li>第二项</li>
 </ol>
定义列表
<dl>
   <dt>项目 1</dt>
     <dd>描述项目 1</dd>
   <dt>项目 2</dt>
     <dd>描述项目 2</dd>
 </dl>
表格(Tables)
<table border="1">
   <tr>
     <th>表格标题</th>
     <th>表格标题</th>
   </tr>
   <tr>
     <td>表格数据</td>
     <td>表格数据</td>
   </tr>
 </table>
框架(Iframe)
<iframe src="demo_iframe.htm"></iframe>
表单(Forms)
<form action="demo_form.php" method="post/get">
<input type="text" name="email" size="40" maxlength="50"> 
<input type="password"> 
<input type="checkbox" checked="checked"> 
<input type="radio" checked="checked"> 
<input type="submit" value="Send"> 
<input type="reset"> 
<input type="hidden"> 
<select> 
<option>苹果</option> 
<option selected="selected">香蕉</option> 
<option>樱桃</option> 
</select>
<textarea name="comment" rows="60" cols="20">
</textarea> 
</form>
实体(Entities)
&lt; 等同于 <
 &gt; 等同于 >
&copy; 等同于 ©