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

浏览: 1869

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

image.png

现在来查看一下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个链接。

image.png

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

如果觉得不错,欢迎 点赞 评论 加 分享。后台回复爬虫,即可收到爬虫系列文章。




image.png

推荐 0
本文由 王亨 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册