上几次分享的内容都是有关通用爬虫的,但是我们生活中最常用到的大部分都是聚焦爬虫,那么要想使用聚焦爬虫就要用到数据解析工具正则,下面让我们先来了解什么是聚焦爬虫吧!
-
聚焦爬虫:在实施页面数据抓取时,需要针对性的对内容进行筛选过滤,保证只得到最重要的数据信息。例如本次介绍的糗事百科的页面打开之后,会有用户信息,图片、视频、文字各种格式的数据,但是我们只想要抓取图片信息,这时必须用到聚焦爬虫将其源码进行处理才可以得到
-
数据解析原理概述:
解析的局部文本内容都会在标签之间或标签对应的属性当中进行存储;
进行指定标签的定位;
标签或标签对应属性所存储的数据进行提取; -
基于聚焦爬虫的编码流程:
指定url;发送请求;获取响应数据;数据解析;持久化存储 -
要想使用聚焦爬虫,就先通过通用爬虫将整张页面爬取下来。图片是一个二进制数据,有对应的url去标识。
(1)这是糗事百科网页,已经打到开发者模式,可以看到光标移动到img src=……这里,表示的是该图片的源码,而且这里的每张图片都保存在这样的标签中,可以实现批量抓取
(2)这里我把这张图片的源码复制下来,进行一个数据提取,
<li class="item typs_multi" id="qiushi_tag_125039577">
<a class="recmd-left multi" href="/article/125039577" rel="nofollow" target="_blank" onclick="_hmt.push(['_trackEvent','web-list-multi','chick'])">
<img src="//pic.qiushibaike.com/article/image/TP3QKMMOD2G995F4.jpg?imageView2/1/w/150/h/112" alt="差点以为有猫拿狙击枪">
<div class="recmd-tag">2图</div>
</a>
可以看到是以<li class=“item typs_multi"开始,以结尾,我们的目的是只要得到//pic.qiushibaike.com/article/image/TP3QKMMOD2G995F4.jpg这串数据,先定义一个变量ex来存处理后的结果,中间加入.?表示匹配任意字符
ex=’<li class=“item typs_multi”.?’
再进行一个正则筛选,这时已经可以得到图片了
ex=’<li class=“item typs_multi”.?<img src="(.?)” alt.*?’
可以看到在图片的url后面还跟着一串?imageView2/1/w/150/h/112,这部分并不是我们要抓取的
同时我们最终还需要用图片的url进行图片命名永久化存储,就需要进一步进行处理,
ex=’<li class=“item typs_multi”.?<img src="(.?)?imageView2.?" alt.?’
-
爬取结果展示
-
代码
import requests
import re
import os
# 创建一个文件夹,保存所有图片
if not os.path.exists('./qiutuliba'):
os.mkdir('./qiutulibs')
url = 'https://www.qiushibaike.com/pic/'
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.93 Safari/537.36'
}
# 使用通用爬虫对url对应的一整张页面进行爬取
page_text = requests.get(url=url,headers=headers).text
# 使用聚焦爬虫对整张页面的所有糗图进行解析/提取。这里不懂正则表达式的可以去菜鸟教程https://www.runoob.com/python3/python3-reg-expressions.html学,现在的糗事网站和之前的不一样,所以自己手动修改了正则表达式才运行出结果,\表示匹配字符串结束
ex='<li class="item typs_multi".*?<img src="(.*?)\?imageView2.*?" alt.*?</a>'
imag_src_list = re.findall(ex,page_text,re.S)
print(imag_src_list)
# 遍历列表
for src in imag_src_list:
# 拼接出一个完整的图片url
src = 'https:'+src
# 请求到图片二进制数据
imag_data=requests.get(url=src,headers=headers).content
# 生成图片名称
imag_name=src.split('/')[-1]
# 图片存储的路径
imagPath='./qiutulibs/'+imag_name
with open(imagPath,'wb')as fp:
fp.write(imag_data)
print(imag_name,'下载成功!')
'''
<li class="item typs_multi" id="qiushi_tag_125039577">
<a class="recmd-left multi" href="/article/125039577" rel="nofollow" target="_blank" οnclick="_hmt.push(['_trackEvent','web-list-multi','chick'])">
<img src="//pic.qiushibaike.com/article/image/TP3QKMMOD2G995F4.jpg?imageView2/1/w/150/h/112" alt="差点以为有猫拿狙击枪">
<div class="recmd-tag">2图</div>
</a>
'''
对了,建议大家想学习正则表达式的伙伴去这个菜鸟教程
超给力!
作者还在成长期,这段时间一直在自学爬虫,会不定期更新,喜欢的可以加关注哦,同时也希望各位大牛们指出我的不足之处