#这里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,就可以省略了.
“下一页”的节点:
“下一页”节点所在的div标签下的类名为:page-control,类下一层还有span,span下一层只有一个a
获取该节点信息的代码就为:
link.next<- web %>% html_nodes('div.page-control span.pagebox_next a') %>% html_attrs()
其中a可省.