文章目录
前言
- 爬虫在使用场景中的分类
- 通用爬虫
抓取系统重要组成部分。抓取的是一整张页面数据聚焦爬虫
⭐
是建立在通用爬虫的基础之上。抓取的是页面中特定的局部内容。- 增量式爬虫⭐
检测网站中数据更新的情况。只会抓取网站中最新更新出来的数据。
数据分析分类
- 正则
- bs4
xpath
⭐
数据解析原理概述
- 聚焦爬虫
编码流程:
- 指定url
- 发起请求
- 获取响应数据
- 数据解析
- 持久化存储
- 原理概述概述
- 解析的局部文本内容都会再标签之间或者标签对应的属性中进行存储
- 进行指定标签定位
- 标签或者标签对应的属性中存储的数据值进行提取(解析)
一、正则re进行数据解析
1.1 爬取糗事百科中糗图板块下所有的糗图图片⭐
- 需求分析
先使用通用爬虫获取一整张页面,再使用聚焦爬虫获取图片内容
- 具体分析
拷贝最小的局部源码:
- 目的:提取div中的img标签中的src属性值提取出来
<div class="thumb">
<a href="/article/124250612" target="_blank">
<img src="//pic.qiushibaike.com/system/pictures/12425/124250612/medium/JRYLE3WRJZXI8KYH.jpg" alt="糗事#124250612" class="illustration" width="100%" height="auto">
</a>
</div>
- 编写正则
ex = '<div class="thumb">.*?<img src="(.*?) alt.*?</div>'
# ()括号内容是我们想要的
- 代码编写
处理第一页数据:
- 获取图片路径并存储到列表
import requests
import re
if __name__ == '__main__':
url = 'https://www.qiushibaike.com/imgrank/'
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.72 Safari/537.36'
}
# 使用通用爬虫对url对应的一整张页面进行爬取
# 一整张页面数据使用.text 进行获取
page_text = requests.get(url=url, headers=headers).text
# 使用聚焦爬虫将页面中所有的糗图进行解析/提取
ex = '<div class="thumb">.*?<img src="(.*?)" alt.*?</div>'
# 返回列表
img_src_list = re.findall(ex,page_text,re.S)# re.S 叫做单行匹配 re.M 叫做多行匹配
print(img_src_list)
['//pic.qiushibaike.com/system/pictures/12424/124248898/medium/9EBHN0P7Z704IRNA.jpg', '//pic.qiushibaike.com/system/pictures/12425/124250569/medium/IYVWM19GECVE35N6.jpg', '//pic.qiushibaike.com/system/pictures/12425/124251068/medium/T42KZBCK2BODVH9N.jpg', '//pic.qiushibaike.com/system/pictures/12425/124251038/medium/R1C15IV0JA3O5GK7.jpg', '//pic.qiushibaike.com/system/pictures/12423/124237042/medium/B7C6RN8FG1ECU4QO.jpg', '//pic.qiushibaike.com/system/pictures/12425/124250034/medium/70UZCFWLI4PL3937.jpg', '//pic.qiushibaike.com/system/pictures/12414/124148138/medium/IBZA9V3283IO5809.jpg', '//pic.qiushibaike.com/system/pictures/12423/124238731/medium/936HVUV7OOMN9L4P.jpg', '//pic.qiushibaike.com/system/pictures/12424/124241238/medium/WKQS193J9BDN9MEW.jpg', '//pic.qiushibaike.com/system/pictures/12424/124241248/medium/NP2I6R4SYNPQG3H9.jpg', '//pic.qiushibaike.com/system/pictures/12425/124251192/medium/HMIK71X9R6RZFNY1.jpg', '//pic.qiushibaike.com/system/pictures/12425/124250567/medium/EQWD2NB6B1TUFD21.jpg', '//pic.qiushibaike.com/system/pictures/12423/124239461/medium/I1MFATNSTI7XQP6V.jpg', '//pic.qiushibaike.com/system/pictures/12423/124238410/medium/YG8Z33RG54KR7OC2.jpg', '//pic.qiushibaike.com/system/pictures/12423/124236773/medium/JAPN635V0G2V2BLA.jpg', '//pic.qiushibaike.com/system/pictures/12423/124235383/medium/JI0L091QQVS7PQHO.jpg', '//pic.qiushibaike.com/system/pictures/12424/124247459/medium/EAEV8Z68C99FU12L.jpg', '//pic.qiushibaike.com/system/pictures/12423/124239804/medium/11DVRSZJQ78HNT8D.jpg', '//pic.qiushibaike.com/system/pictures/12425/124250516/medium/ZEKVE91EMMMJ3JTB.jpg', '//pic.qiushibaike.com/system/pictures/12423/124237782/medium/S0O4E74O52K5YZW3.jpg', '//pic.qiushibaike.com/system/pictures/12425/124251193/medium/VEP5BC2ZKRHYYOOT.jpg', '//pic.qiushibaike.com/system/pictures/12425/124251161/medium/3SXGPJXG5C13JBAU.jpg', '//pic.qiushibaike.com/system/pictures/12425/124250224/medium/MZQF7KXXBDHMUS13.jpg', '//pic.qiushibaike.com/system/pictures/12425/124251222/medium/TOT961UBURC8WKTA.jpg', '//pic.qiushibaike.com/system/pictures/12423/124239840/medium/0MHKXBDTU7XLMCYW.jpg']
通过分析上图列表中路径发现少了些许东西:
https:
//pic.qiushibaike.com/system/pictures/12425/124250612/medium/JRYLE3WRJZXI8KYH.jpg
- 修改后下载到指定文件夹
# 需求:爬取糗事百科中糗图板块下所有的糗图图片
import requests
import re
import os
if __name__ == '__main__':
# 创建一个文件见 用来保存所有的图片
if not os.path.exists('./qiutuLibs'):
os.makedirs('./qiutuLibs')
url = 'https://www.qiushibaike.com/imgrank/'
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.72 Safari/537.36'
}
# 使用通用爬虫对url对应的一整张页面进行爬取
# 一整张页面数据使用.text 进行获取
page_text = requests.get(url=url, headers=headers).text
# 使用聚焦爬虫将页面中所有的糗图进行解析/提取
ex = '<div class="thumb">.*?<img src="(.*?)" alt.*?</div>'
# 返回列表
# findall()方法的使用见总结①
img_src_list = re.findall(ex,page_text,re.S)# re.S 叫做单行匹配 re.M 叫做多行匹配
print(img_src_list)
# 单独便利列表 并做get请求
for src in img_src_list:
# 拼接出完整的图片地址
src = 'https:' + src
# 发起get请求 获取二进制图片数据
img_data = requests.get(url=src,headers=headers).content
# 生成图片名称 从原始切分出来
# '//pic.qiushibaike.com/system/pictures/12417/124176031/medium/VC2AHAHUEUUX1KY3.jpg"'
img_name = src.split('/')[-1] # 最后一个
# 图片存储路径
imgPath = './qiutuLibs/' + img_name
with open(imgPath,'wb') as fp:
fp.write(img_data)
print(img_name,'下载成功')
处理第多页数据:
第一页:https://www.qiushibaike.com/imgrank/
(其实我们用这个url也是该页面:https://www.qiushibaike.com/imgrank/page/1/)
第二页:https://www.qiushibaike.com/imgrank/page/2/
第二页:https://www.qiushibaike.com/imgrank/page/3/
# 需求:爬取糗事百科中糗图板块下所有的糗图图片
import requests
import re
import os
if __name__ == '__main__':
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.72 Safari/537.36'
<