爬取多个页面的新闻标题

#这里RStudio使用的是R-3.4.4环境,xml2和magrittr是加载rvest
#包之前需要的包,否则rvest包无法加载
library(xml2)
library(magrittr)
library(rvest)#爬取网页的主要包
library(selectr)#解析器,少了这个包,后面会报错
url0<-"http://news.sina.com.cn/china/"#获取网址
link<-list()#用于下一页的抓取
#dat<-data.frame()
#n<-0#用于计数
#定义“下一页”网址的函数,便于之后的调用
download_url<-function(url)
{
  web<-read_html(url0)#读取网址
#找到所在网址“下一页”按钮的节点,鼠标选中“下一页”,右键选择查看元素
#获取节点信息,%>%符号进行层级划分,将左边的操作结果传递到右边,
#html_nodes()用于获取指定名称的网页元素、节点
#html_attrs()用于提取传递节点的所有属性名称及内容,即下一页网址的所有属性和内容
  link.next<- web %>% html_nodes('div.page-control span.pagebox_next a') %>% html_attrs()
  return(link.next)#返回下一页的信息
  }
#定义获取每一页网址内容的函数,将每一页页网址所要提取的内容封装起来,便于之后的调用
download_data<-function(url)
{
  web<-read_html(url0)#读取第一页的网址
 #抓取第一页网址的新闻标题,html_text()用于获取指定名称的网页元素、节点的文本内容
  title<-web %>% html_nodes('div.news-item h2') %>% html_text()
  return(data.frame(title))#将新闻标题保存为数据框格式并返回信息
}
link[[1]]<-(url0)#第一个网址
获取从第2页到第4页的网址
for(i in 2:4){
  link[[i]]<-download_url(link[[i-1]])#调用前面定义的“下一页”网址的函数
}
for(i in c(1:4))
{
  if(i==1)#如果第一页网址网页只有一页,则直接获取该页的数据
    data<-download_data(link[i])#调用前面定义的读取每一页内容的函数
  Else#如果第一页网址含多个页面
#将每页的数据按行进行数据框的拼接
    data<-rbind(data,download_data(link[[i]]))
}
write.table(data,file="E:\\news.txt")#将数据读入txt文件
write.csv(data,file="E:\\news.csv")#将数据读入csv文件

结果:


新闻“标题”的节点:

新闻标题的节点所在的div标签下的类名为:news-item,类下一层还有一个h2,h2下一层只有一个a

获取该节点信息的代码就为:

title<-web %>% html_nodes('div.news-item h2') %>% html_text()

这句代码还可以写成:

title<-web %>% html_nodes('div.news-item h2 a') %>% html_text()
h2下一层多了一个a,因为h2下一层只有一个a,就可以省略了.


扫描二维码关注公众号,回复: 1151375 查看本文章

“下一页”的节点:


“下一页”节点所在的div标签下的类名为:page-control,类下一层还有span,span下一层只有一个a

获取该节点信息的代码就为:

 link.next<- web %>% html_nodes('div.page-control span.pagebox_next a') %>% html_attrs()

其中a可省.

猜你喜欢

转载自blog.csdn.net/f_kld/article/details/80500900