网络爬虫就是从网页上批量提取相应的信息,主要原理就是利用一定的 规则进行信息定位。tidyverse
系列工具包中的rvest
工具包可以快捷实现这一功能。下面代码就是使用rvest
中的相关函数进行爬虫的一个简单的例子:
library(rvest)library(tidyverse)#豆瓣新片榜网址html<-read_html("/chart")#爬取电影名称html%>%html_nodes("div.pl2a")%>%html_text()%>%str_remove_all("\\n")%>%str_remove_all("")->moviename#爬取每个电影的简略信息html%>%html_nodes("div.pl2p.pl")%>%html_text()->movieinfo#爬取每个电影的链接html%>%html_nodes("div.pl2a")%>%html_attr("href")->moviehtml#合并并整理bind_cols(moviename,movieinfo,moviehtml)%>%data.frame()%>%set_names(c("电影名","电影信息","链接"))%>%as_tibble()
原网页界面:
爬虫结果:
以上例子使用rvest
中的函数有4个:read_html()
,html_nodes()
,html_text()
和html_attr()
,其中最关键的是html_nodes()
函数。
1 read_html()
read_html()
的功能是读取网页内容,输入参数为网页地址,输出结果为一个list。
网页既可以是在线网页,也可以是储存到本地的离线html文件。
2 html_nodes()
html_nodes()
的功能是通过一定的规则来定位想要爬取的信息,语法结构如下:
html_nodes(x,css,xpath)
x为
read_html()
的输出结果;css和xpath为定位信息的两种方法,可以任选其一。
本篇主要介绍使用csss选择器进行信息定位,它主要使用网页标签规则进行信息定位。
2.1 网页标签规则
在网页任意位置点击鼠标右键,然后点击“检查”选项(或者“审查元素”)就可以打开它的源代码,网页显示的内容就是由这些源码的结构和内容控制的,以“豆瓣新片榜”为例,如下图所示:
网页源码具有以下几个特点:
每个标签的内容都是以<标签名 属性>开始,以</标签名>结束,其中属性可以缺省,见下图;
标签内部还可以嵌套标签,具有嵌套结构的标签开头有个明显的实心三角形作为提醒;
网页上显示的内容就存储在这些标签内。
2.2 CSS选择器
CSS选择器的语法规则见附表1。下面列举几个常见用法:
属性class和id分别简写为.和#,其他属性省略
比如要定位如下图所示的标签位置,CSS的值为div.pl2
;如果class换成id,则CSS值为div#pl2
前后标签具有嵌套结构,用空格隔开
比如下图需要定位的内容,位于div标签下的a标签中,CSS的值为div.pl2 a
。
如果要进一步定位到图中span标签内,则CSS值为div.pl2 a span
,span中的属性style省略。
同时选中同级的多个标签下的内容,中间用逗号隔开
比如下图中要定位的a标签和p标签是div标签下的同级标签,CSS的值为div.pl2 a,p.pl
选择多个同级同名标签的某一个,可以使用nth-child(n)语法
比如下图中的div标签内有多个同级p标签,要定位的内容位于其中一个p标签内,该p标签是div标签第5个子标签,CSS值为div#introduction-to-html-elements p:nth-child(5)
。其中#
后面跟的是div标签的id属性值,而class属性值带有空格,为避免歧义将其省略。
nth-child(n)表示从前往后数第n个子标签;
nth-last-child(n)表示从后往前数第n个子标签。
其他规则可参见附表1
2.3 html_node()
html_nodes()
会返回所有符合规则的记录。而html_node()
是html_nodes()
的单数形式,只返回第一条记录。
3 html_text()
html_text()
的输入参数是html_node()
或html_nodes()
的输出结果,返回值是对应网页展现的内容。
4 html_attr()
html_attrs()
的输入参数同样是html_node()
或html_nodes()
的输出结果,返回值是标签的所有属性值。
html_attr()
是其单数形式,用于返回特定的属性值,返回的属性由第二个参数name控制。
一些超链接的地址不会呈现在网页上,可以通过此函数进行爬取
比如下图中,a标签的href属性是每个电影在豆瓣上的主页的网址。爬取代码如下:
html%>%html_nodes("div.pl2a")%>%html_attr("href")
附表1
表格来源:/cssref/css_selectors.ASP