爬虫 | 正则表达式提取腾讯教育新闻链接及图片链接

前面的爬虫都是通过标签来爬取的,今天就分享一个小例子使用正则表达式来提取网页信息。如果你对正则表达式不熟悉,可以查看我之前写的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个链接。

是不是用正则表达式提取信息很方便很简单?使用标签只能爬取标签内部的数据,使用正则表达式就可以从这个网页源码中提取全部相应的信息。这两种方法可以根据不同场景不同需求灵活使用。


注:

作者:王亨

公众号:跟着菜鸟一起学R语言

原文链接:http://blog.csdn.net/wzgl__wh/

猜你喜欢

转载自blog.csdn.net/wzgl__wh/article/details/80368327