R语言爬虫之rvest包——基础详细介绍+示例

版权声明:转载请注明出处! https://blog.csdn.net/ddxygq/article/details/86549538

都说Python爬虫功能强大,其实遇到动态加载或者登陆网站Python还是很困难,对于大部分的一些普通爬虫,R语言还是很方便。这里介绍R语言rvest包爬虫,主要用到函数:read_html()、html_nodes()、html_text()和html_attrs()。

安装这个包:install.packages('rvest')

  • read_html():下载网页;
  • html_nodes():获得指定名称的网页元素、节点;
  • html_text():获得指定名称的网页元素、节点文本;
  • html_attrs():获得指定的网址;

 

以新浪内地新闻为例

下面是新浪内地新闻网址:http://news.sina.com.cn/china/

我们想要爬取每条新闻的标题、时间和对应的链接,因为点击标题,会触发链接,进入每条新闻内容页。

这是一些固定用法

载入rvest包
library(rvest)

这一页网址为:
url0 <- 'http://news.sina.com.cn/china/'

下载这一页全部网页元素
web <- read_html(url0)

鼠标右键==》"审查元素",可以看到这些信息所位于的网页标签,如下:

我们需要获取:        

(1)、新闻标题:"湖南“邵东伤医案”二审宣判 驳回上诉维持原判",位于<h2>标签下面的<a>标签里面的链接文本;
(2)、时间:位于<div class="time">里面的文本;
(3)、链接:就是href = "http://news.sina.com.cn/o/2017-06-23/doc-ifyhmpew3184730.shtml"这个东西。

 

它们都位于最外面大的蓝色框:<div class="news-item">里面,所以对于这么大的网站页面,我们需要首先定位到<div class="news-item">,然后具体定位它下面的新闻标题、时间。这里“class="news-item"”表示网页元素<div>的类为“news-item”,用“.”表示类(如果遇到< div id="idName">就需要用#,即:div#idName):
div.news-item h2 a

可以理解为class名为news-item下的h2标签下的a标签,直接定位到粉红色框处。

定位到链接<a>标签
News <- web %>% html_nodes('div.news-item h2 a')#把<a>新闻标题定准位。

相当于:News <- html_nodes(web,'div.news-item h2 a')

 

News下就包含<a>标签的所有信息,包括链接、文本、一些其它样式;

获得新闻标题

获得链接文本(也就是新闻标题)

Title <- News%>%html_text()


      其实,上面分两步获得新闻标题,利用管道传参可以一部完成,不利用管道照样可以一步,只是会有一层一层的括号,可读性不好。就是一个变量等价代换,把News那一部分换下来即可,即:
Title <- web %>% html_nodes('div.news-item h2 a')%>%html_text()

获得的一些新闻标题长这样:

获得新闻时间

为了便于对照查看,图再放一次:

 时间位于上图中红色框住的标签:<div class="time">6月23日 19:17</div>,虽然它也位于<div class="news-item">里面,但是这个标签名唯一,直接定位就好。可以这样理解:查找计算机文件时,两个文件夹下面可能有同名文件,这时就需要定位到各自的文件夹才行;如果,没有相同文件,直接搜索文件名而不需要定位到文件夹就行了。
Time <- web %>% html_nodes('div.time') %>% html_text()

获得的时间是这样的:

获得新闻链接

与第一步定位新闻标题一样:class名为news-item下的h2标签下的a标签,然后用专门函数html_attrs()获得链接。
link <- News %>% html_attrs()

获得的每个元素都是列表,比如第一个元素:

我们就需要,处理一下,每个元素有三个元素,取第一个就行了,于是:
link1 <- c(1:length(link))初始化一个向量
for(i in 1:length(link))
{
    link1[i] <- link[[i]][1]
}


最终得到的链接:

保存为csv文件

dat <- data.frame(Title,Time,link1)
setwd('D:\\RWorkSpace')
write.csv(dat,file = 'news.csv',row.names = FALSE)

示例代码

rm(list = ls())
library(rvest)
url0 <- 'http://news.sina.com.cn/china/'
web <- read_html(url0)
News <- web %>% html_nodes('div.news-item h2 a')
#---获得新闻标题---
Title <- News%>%html_text()
#---获得新闻时间---
Time <- web %>% html_nodes('div.time') %>% html_text()
#---获得链接---
link <- News %>% html_attrs()
link1 <- c(1:length(link))
for(i in 1:length(link))
{
  link1[i] <- link[[i]][1]
}
#---保存为csv文件---
#组合成数据框
dat <- data.frame(Title,Time,link1)
setwd('D:\\RWorkSpace')
write.csv(dat,file = 'news.csv',row.names = FALSE)

http://www.ikeguang.com/

猜你喜欢

转载自blog.csdn.net/ddxygq/article/details/86549538