# 功能: 爬取指定网页当中的全部图片
# 开发时间: 2020/10/26 10:12
import requests
import json
import re #进行正则表达式的包的引用
import os
if __name__ == '__main__':
#创建一个文件夹对象用于实现对所爬取到的图片信息进行保存
if not os.path.exists('pictures'):
os.makedirs('pictures')
#进行UA伪装,将userAgent分装到一个字典对象当中去,user-agent可以到浏览器当中通过抓包工具来获取
headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'}
'''
在访问指定网站对象当中的页面的时候可以观察到
https://www.qiushibaike.com/imgrank/page/4/
最后面的参数为当前网站当中的第4页当中的图片数据,所以当网站当中100张图片的时候
要想对网站当中的所有的图片对象进行爬取的时候
应该写一个通用的URL地址用于动态的访问网站当中不同的页面
'''
url = 'https://www.qiushibaike.com/imgrank/page/%d/'
for pageNum in range(2,13):
newUrl=format(url%pageNum)
#通过通用爬虫来实现对第pageNum张网页对象进行获取操作
response=requests.get(newUrl,headers)
page_text=response.text#将网站的响应数据以字符串文本的形式来进行保存
'''
在网页当中通过抓包工具进行源码分析可知到每一张图片对象都在一个对应的div标签当中
<div class="thumb">
<a href="/article/123727095" target="_blank">
<img src="//pic.qiushibaike.com/system/pictures/12372/123727095/medium/CHJY6LJ7Y00R9C18.jpg" alt="糗事#123727095" class="illustration" width="100%" height="auto">
</a>
</div>
可以发现当前div块当中对应着一张图片对象
接下来通过正则表达式来将div标签当中image值提取出来
ex='<div class="thumb">.*?<img src="(.*?)" alt.*?</div>'
'''
ex = '<div class="thumb">.*?<img src="(.*?)" alt.*?</div>'
#调用正则表达式来进行匹配,ex为正则,page_text为进行匹配的数据,S为单行匹配
img_src_list=re.findall(ex,page_text,re.S)
#将所有匹配正则的值存放到列表对象当中并进行打印输出
print(img_src_list)
#对列表对象当中所请求到的图片数据信息进行打印输出
for src in img_src_list:
src='https:'+src#拼接出图片的完整地址
#从服务器当中获取二进制形式的图片响应数据
image_data=requests.get(url=src,headers=headers).content
#从图片地址当中将图片对象的名称分割出来,将切割后的部分存放到列表对象当中并获取最后一个列表元素
image_name=src.split('/')[-1]
#设定当前图片对象的存放路径
image_path='pictures/'+image_name
with open(image_path,'wb') as fp:
fp.write(image_data)#将当前所遍历到的二进制图片数据写入到指定的目录文件夹当中
print(image_name,'下载成功')