1. 获取图片链接,将图片链接append 到 list 中
图片链接有两种,
第一种,有规律 : 只有图片名称不一样
urls = []
for i in range(5460): # range(5460) 代表有多少张图片
url = '****图片存放的网址*/static/img/coins/32x32/{}.png'.format(i + 1)
urls.append(url)
get_coin_images(urls, 10)
第二种,无规律 :是所有的图片路径,如果用下面的方式,获取图片的名称,就不能用splie() 函数,需要获取图片名的函数,或自定义图片名称,
2. 进行多线程图片下载保存到本地
import requests
import time
import threading
import queue
from celery_test1.settings import DOWN_LOAD_COIN_URL # 这里是再settings.py 中设置的图片路径变量,根据实际情况确定
# 定义函数方法
def get_coin_images(urls=[], num=3):
"""
多线程下载远程图片保存到本地,
:param urls: 图片链接 list 这里就不做验证了,因为自己调用, 要作为公用还需要优化参数就执行程序
:param num: 开启的线程数,默认3
:return:
"""
q = queue.Queue()
for url in urls:
q.put(url)
start = time.time()
def fetch_img_func(q):
while True:
try:
url = q.get_nowait() # 不阻塞的读取队列数据
png = url.split('32x32/') # 这里是我根据图片的链接进行的拆分,获取图片的名称,进行原名称保存
print(png[1]) # 这里是获取的图片名称
i = q.qsize()
except Exception as e:
print(e)
break
print("当前还有%s个任务" % i) # 这里print 信息
res = requests.get(url, stream=True)
if res.status_code == 200:
save_img_path =DOWN_LOAD_COIN_URL + png[1] # settings.py 中设置的图片路径 + 拆分的原图片名称
# 保存下载的图片
with open(save_img_path, 'wb') as fs:
for chunk in res.iter_content(1024):
fs.write(chunk)
threads = []
for i in range(num):
t = threading.Thread(target=fetch_img_func, args=(q, ), name="child_thread_%s" % i)
threads.append(t)
for t in threads:
t.start()
for t in threads:
t.join()
print(time.time()-start) # 这里是结束时间 - 开始时间 获取的该程序的耗时
3 程序运行过程中的示例
4. 耗时,仅作参考,因为网络,硬件等问题不相同,