前面的爬虫都是通过标签来爬取的,今天就分享一个小例子使用正则表达式来提取网页信息。如果你对正则表达式不熟悉,可以查看我之前写的R正则表达式这篇文章。它对R几个常用正则表达式进行了详尽的解释,包括参数说明,函数区别,正则表达式转义等都有介绍。
今天通过爬取腾讯教育(http://edu.qq.com/)网页的所有关于教育新闻的链接,另外也爬取图片链接。
提取新闻链接
首先我们来分析一些教育类新闻链接的特点。
"http://edu.qq.com/a/20180509/003811.htm"
最明显的特点就是以http://edu.qq.com/a/
开头,以.htm
结尾。我们可以根据这个特点来写正则表达式。http://edu.qq.com/a/+[0-9.*]+[/]+[0-9.*]+[.]+htm
。
library(rvest) # 不一定用这个包,只要能读取网页源码就行
url<-"http://edu.qq.com/"
pages<-read_html(url)# gregexpr函数可以返回匹配字符的起始位置和长度。
news<-gregexpr("http://edu.qq.com/a/+[0-9.*]+[/]+[0-9.*]+[.]+htm",pages)
通过浏览器查找功能发现源码有也有185个链接。
现在来查看一下news的值。长度也是185个。news是list数据类型。
> summary(news)
Length Class Mode
[1,] 185 -none- numeric
>
现在来提取这些新闻链接,
newslink<-vector()
for(i in 1:length(news[[1]])){
#链接为起始位置+长度-1
newslink[i]<-substr(pages,news[[1]][i],news[[1]][i]+attr(news[[1]],'match.length')[i]-1)
}
结果为:
> head(newslink)
[1] "http://edu.qq.com/a/20180509/003811.htm" "http://edu.qq.com/a/20180509/003811.htm"
[3] "http://edu.qq.com/a/20180509/003811.htm" "http://edu.qq.com/a/20180507/038724.htm"
[5] "http://edu.qq.com/a/20180507/038724.htm" "http://edu.qq.com/a/20180507/038724.htm"
>
提取关于图片链接
分析图片链接如下,但其中间的字母除了ninja还有edu,所以这块也需要使用正则表达式来匹配。
”http://img1.gtimg.com/ninja/2/2017/01/ninja148480997229281.jpg“。
分析之后,发现图片链接都是开头为:
http://img1.gtimg.com/
,接下来是/字母数字
,以.jpg
结尾。
根据这个特点,我们可以把正则表达式写为:
http://img1.gtimg.com/+[a-z0-9/.*]+[.]+jpg
。
分析好之后,开始使用正则表达式来提取链接。
#提取图片链接
imag<-gregexpr("http://img1.gtimg.com/+[a-z0-9/.*]+[.]+jpg",pages)
提取图片链接的方法和刚才提取新闻链接相同
imagelink<-vector()
for(i in 1:length(imag[[1]]))
{
imagelink[i]<-substr(pages,imag[[1]][i],imag[[1]][i]+attr(imag[[1]],'match.length')[i]-1)
}
爬取的图片链接如下,总共有39个链接。
> head(imagelink)
[1] "http://img1.gtimg.com/ninja/2/2017/01/ninja148480995087885.jpg"
[2] "http://img1.gtimg.com/edu/pics/hv1/13/32/2275/147940048.jpg"
[3] "http://img1.gtimg.com/edu/pics/hv1/34/243/2274/147928849.jpg"
[4] "http://img1.gtimg.com/edu/pics/hv1/87/194/2194/142714407.jpg"
[5] "http://img1.gtimg.com/edu/pics/hv1/89/194/2194/142714409.jpg"
[6] "http://img1.gtimg.com/edu/pics/hv1/111/194/2194/142714431.jpg" >
> length(imagelink)
[1] 39
通过浏览器查找功能发现源码有也有39个链接。
是不是用正则表达式提取信息很方便很简单?使用标签只能爬取标签内部的数据,使用正则表达式就可以从这个网页源码中提取全部相应的信息。这两种方法可以根据不同场景不同需求灵活使用。
如果觉得不错,欢迎 点赞 评论 加 分享。后台回复爬虫,即可收到爬虫系列文章。