使用进程池批量下载PPT图片

作用:通过python的requests,re,multiprocessing等库实现批量下载PPT图片

操作步骤:

一、去百度查找对应的PPT网址并测试查看图片存储网络地址。

1、在百度查找到的PPT图片网址是:http://www.lfppt.com/pptbj___1.html

2、按F12——F5——↖——点击图片,查找到所有的图片都在img标签里,图片路径为src属性的属性值,如下图所示:

使用进程池批量下载PPT图片

二、开始在pycharm里编写代码。

在python3.7环境下的pycharm里编写源代码,代码如下:

#1、导入相应的库
import re,random,requests,os,time
from bs4 import BeautifulSoup
from multiprocessing import Pool
#2、创建相应的get请求函数下载图片
def downpic(page):
url="http://www.lfppt.com/pptbj___"+str(page)+".html"
agent1 = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36"} # 设定请求头的值agent1
agent2 = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36"} # 设定请求头的值agent2
agent3 = {"User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36"} # 设定请求头的值agent3
list1 = [agent1, agent2, agent3] # 设置3个请求头组成的列表,并赋值给列表list1
agent = random.choice(list1) # 请求头的值agent从列表list1里随机选择一个
try:
response = requests.get(url, headers=agent) # 伪装浏览器对网站进行get请求,并将请求结果赋值给response
response.encoding = response.apparent_encoding # 根据内容解析出网页的编码格式并赋值给response.encoding
html = response.text # 将网页的源代码赋值给html
pattern1=re.compile('<img.>') #设置正则表格式的匹配规则是查找img标签里的src属性的属性值
result1=re.findall(pattern1,html) #在html源代码里查找全部符合匹配规则pattern1的源代码,并赋值给result1,findall是查找所有的
xx=1 #设置自增遍历xx的初始值为1
path="F://PPT图片/" #定义保存到本机F盘PPT图片的路径,并赋值给path,用来保存下载的图片

if not os.path.exists(path): #假如这个路径不存在时
os.mkdir(path) #新建这个路径
for img in result1: #在查找出来的result1里遍历这个图片标签
url2 = img #将图片标签赋值给url2
response2 = requests.get(url2, headers=agent) #伪装浏览器对网站进行get请求,并将请求结果赋值给response2
response2.encoding = response2.apparent_encoding # 根据内容解析出网页的编码格式并赋值给response.encoding
content2 = response2.content #将网页相应的源代码二进制数据赋值给content2
abspath = path + str(page) + str(xx) + url2[-4:] #定义保存文件的绝对路径为path路径+页码+自增变量+图片的最后4个值
xx=xx+1 #每遍历一次,xx自增1
with open(abspath, "wb") as f: #打开绝对路径的文件abspath,并进行二进制写入操作,并设置为f
f.write(content2) #在f文件里写入网页相应的源代码二进制数据
f.close() #关闭文件f
print("{}下载完成,下载到本机的路径是:{}".format(url2, abspath))
except: #当接收到错误反馈时
print("爬取失败") #打印爬取结束
finally: #最终
print("第{}页图片下载完成".format(page)) #打印第多少页下载完成
if __name__ == '__main__':
start=time.time() #设置开始时间,并将开始时间赋值给start
pp=Pool(4) #创建进程池,进程池里的进程个数为4,4一般是根据cpu核心数确定的,并赋值给pp
for page in range(1,5): #遍历1到5页的数据,不含5,并赋值给page

pp.apply_async(downpic,args=(page,)) #创建非阻塞式进程,进程的任务是downpic下载图片,参数为page
pp.close() #关闭进程
pp.join() #等待进程结束才执行后续动作
end=time.time() #定义结束时间并赋值给end
print("总耗时{}秒".format(end-start)) #打印总耗时多少秒,总耗时是结束时间—开始时间
/<img.>

运行结果如下图所示:

使用进程池批量下载PPT图片

上图的左边是代码,右边是代码运行结果

保存到本机的PPT图片示例如下:

使用进程池批量下载PPT图片


分享到:


相關文章: