同样下载600张图片保存到本地,测试同步下载和协程并发下载的速率
1、同步
import requests
import time
# 计算函数运行时间的装饰器
def run_time(func):
def decorator(*args, **kwargs):
start_time = time.time()
ret = func(*args, **kwargs)
end_time = time.time()
spend_time = end_time - start_time
print("======执行函数总用时间{}秒".format(spend_time))
return ret
return decorator
# 用普通方式下载图片
def image_url_list():
url_list = [
'http://tiebapic.baidu.com/forum/pic/item/a7d6277f9e2f07087e1e9379fe24b899a901f2b4.jpg',
'http://tiebapic.baidu.com/forum/pic/item/21e93901213fb80ec7c1d8ae21d12f2eb93894b3.jpg',
'http://tiebapic.baidu.com/forum/w%3D580/sign=2013511d414e9258a63486e6ac82d1d1/62a7d933c895d143847b5d5a64f082025aaf07bd.jpg',
'http://tiebapic.baidu.com/forum/w%3D580/sign=3d72ad76af0e7bec23da03e91f2fb9fa/f100baa1cd11728b4363355bdffcc3cec3fd2c78.jpg',
'http://tiebapic.baidu.com/forum/w%3D580/sign=976306cbae014a90813e46b599763971/4b600c338744ebf89338dd46cef9d72a6059a77a.jpg',
'http://tiebapic.baidu.com/forum/w%3D580/sign=bd7cb9b3f1cd7b89e96c3a8b3f254291/31dfa9ec8a1363270bab7b4a868fa0ec08fac701.jpg',
]
return url_list
@run_time
def download_image1(url_list):
index = 1
for url in url_list:
req = requests.get(url)
# print(req.status_code)
content = req.content
abs_path = 'D:/images/python_down_image/'
timestamp = int(time.time())
image_name = str(index) + '_' + str(timestamp) + '.jpg'
path = abs_path + image_name
with open(path, 'wb') as f:
f.write(content)
if index % 10 == 0:
print("成功下载{}张图片".format(index))
index += 1
if __name__ == '__main__':
ret_url_list = []
for i in range(100):
url_list = image_url_list()
ret_url_list.extend(url_list)
download_image1(ret_url_list)
同步下载图片结果
成功下载600张图片
======执行函数总用时间49.80484867095947秒
2、协程并发下载图片
import requests
import time
import aiohttp
import asyncio
from downlod_image import image_url_list
abs_path = 'D:/images/python_down_image/'
ret_url_list = []
for i in range(100):
url_list = image_url_list()
ret_url_list.extend(url_list)
# 协程下载图片
async def fetch(session, url, path):
async with session.get(url, verify_ssl=False) as response:
content = await response.content.read()
with open(path, 'wb') as f:
f.write(content)
async def main():
async with aiohttp.ClientSession() as session:
# 图片url列表
url_list = ret_url_list
tasks = []
index = 1
for url in url_list:
# 图片命名
timestamp = int(time.time())
image_name = str(index) + '_' + str(timestamp) + '.jpg'
path = abs_path + image_name
task = asyncio.create_task(fetch(session, url, path))
tasks.append(task)
index += 1
print("=================tasks:", tasks)
print("=================tasks_count:", len(tasks))
await asyncio.wait(tasks)
if __name__ == '__main__':
start_time = time.time()
asyncio.run(main())
end_time = time.time()
print("执行完毕一共用时{}秒".format(end_time - start_time))
协程下载结果
执行完毕一共用时4.188239574432373秒