如何使用 aiohttp 进行3次异步批量下载图片操作?

2026-05-28 18:572阅读0评论SEO问题
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计968个文字,预计阅读时间需要4分钟。

如何使用 aiohttp 进行3次异步批量下载图片操作?

前言:当我们需要批量下载图片的时候,requests 库可能会比较慢,如果一个个下载出现阻塞,后面的都会卡住,形成假死状态。虽然使用多线程也能提高效率,但这里介绍使用 aiohttp 异步库来实现。

如何使用 aiohttp 进行3次异步批量下载图片操作?

异步下载图片:

1. 首先,安装 aiohttp 库: pip install aiohttp

2. 编写异步下载函数: python import aiohttp import asyncio

async def download_image(session, url): async with session.get(url) as response: image_data=await response.read() with open(url.split('/')[-1], 'wb') as f: f.write(image_data)

async def main(urls): async with aiohttp.ClientSession() as session: tasks=[download_image(session, url) for url in urls] await asyncio.gather(*tasks)

if __name__=='__main__': urls=[ 'https://example.com/image1.jpg', 'https://example.com/image2.jpg', # ... 其他图片链接 ] asyncio.run(main(urls))

3. 运行程序,批量下载图片。使用 aiohttp 异步库可以有效地提高下载速度,避免阻塞问题。

前言

当我们需要批量下载图片的时候,requests 库会比较慢,如果一个个下载,出现阻塞的时候,后面的都会阻塞卡住,假死状态。当然你用多线程也能提高效率。

这里介绍用aiocdn.pixabay.com/photo/2014/10/07/13/48/mountain-477832_960_720.jpg',
'cdn.pixabay.com/photo/2013/07/18/10/56/railroad-163518_960_720.jpg',
'cdn.pixabay.com/photo/2018/03/12/20/07/maldives-3220702_960_720.jpg',
'cdn.pixabay.com/photo/2017/08/04/17/56/dolomites-2580866_960_720.jpg',
'cdn.pixabay.com/photo/2016/06/20/03/15/pier-1467984_960_720.jpg',
'cdn.pixabay.com/photo/2014/07/30/02/00/iceberg-404966_960_720.jpg',
'cdn.pixabay.com/photo/2014/11/02/10/41/plane-513641_960_720.jpg',
'cdn.pixabay.com/photo/2015/10/30/20/13/sea-1014710_960_720.jpg'
]

fp = Path('./down_img')
if not fp.exists():
fp.mkdir()


loop = asyncio.get_event_loop()
loop.run_until_complete(main(URL))

运行结果

mountain-477832_960_720.jpg 下载完成!
railroad-163518_960_720.jpg 下载完成!
maldives-3220702_960_720.jpg 下载完成!
dolomites-2580866_960_720.jpg 下载完成!
pier-1467984_960_720.jpg 下载完成!
plane-513641_960_720.jpg 下载完成!
iceberg-404966_960_720.jpg 下载完成!
sea-1014710_960_720.jpg 下载完成!
ALL RESULT:['cdn.pixabay.com/photo/2014/07/30/02/00/iceberg-404966_960_720.jpg', 'cdn.pixabay.com/photo/2018/03/12/20/07/maldives-3220702_960_720.jpg', 'cdn.pixabay.com/photo/2014/10/07/13/48/mountain-477832_960_720.jpg', 'cdn.pixabay.com/photo/2014/11/02/10/41/plane-513641_960_720.jpg', 'cdn.pixabay.com/photo/2017/08/04/17/56/dolomites-2580866_960_720.jpg', 'cdn.pixabay.com/photo/2013/07/18/10/56/railroad-163518_960_720.jpg', 'cdn.pixabay.com/photo/2015/10/30/20/13/sea-1014710_960_720.jpg', 'cdn.pixabay.com/photo/2016/06/20/03/15/pier-1467984_960_720.jpg']

Semaphore控制并发

上面的代码是把8个url一起加入到并发任务,当url数量很多的时候,我们希望可以控制并发量,于是可以用到Semaphore控制并发。

semaphore = asyncio.Semaphore(2) # 限制并发量为2

优化后的代码

import aiocdn.pixabay.com/photo/2014/10/07/13/48/mountain-477832_960_720.jpg',
'cdn.pixabay.com/photo/2013/07/18/10/56/railroad-163518_960_720.jpg',
'cdn.pixabay.com/photo/2018/03/12/20/07/maldives-3220702_960_720.jpg',
'cdn.pixabay.com/photo/2017/08/04/17/56/dolomites-2580866_960_720.jpg',
'cdn.pixabay.com/photo/2016/06/20/03/15/pier-1467984_960_720.jpg',
'cdn.pixabay.com/photo/2014/07/30/02/00/iceberg-404966_960_720.jpg',
'cdn.pixabay.com/photo/2014/11/02/10/41/plane-513641_960_720.jpg',
'cdn.pixabay.com/photo/2015/10/30/20/13/sea-1014710_960_720.jpg'
]

fp = Path('./down_img')
if not fp.exists():
fp.mkdir()

loop = asyncio.get_event_loop()
loop.run_until_complete(main(URL))

使用TCPConnector控制并发

TCPConnector 使用 limit 参数控制并发数

conn = aiocdn.pixabay.com/photo/2014/10/07/13/48/mountain-477832_960_720.jpg',
'cdn.pixabay.com/photo/2013/07/18/10/56/railroad-163518_960_720.jpg',
'cdn.pixabay.com/photo/2018/03/12/20/07/maldives-3220702_960_720.jpg',
'cdn.pixabay.com/photo/2017/08/04/17/56/dolomites-2580866_960_720.jpg',
'cdn.pixabay.com/photo/2016/06/20/03/15/pier-1467984_960_720.jpg',
'cdn.pixabay.com/photo/2014/07/30/02/00/iceberg-404966_960_720.jpg',
'cdn.pixabay.com/photo/2014/11/02/10/41/plane-513641_960_720.jpg',
'cdn.pixabay.com/photo/2015/10/30/20/13/sea-1014710_960_720.jpg'
]

fp = Path('./down_img')
if not fp.exists():
fp.mkdir()

loop = asyncio.get_event_loop()
loop.run_until_complete(main(URL))




本文共计968个文字,预计阅读时间需要4分钟。

如何使用 aiohttp 进行3次异步批量下载图片操作?

前言:当我们需要批量下载图片的时候,requests 库可能会比较慢,如果一个个下载出现阻塞,后面的都会卡住,形成假死状态。虽然使用多线程也能提高效率,但这里介绍使用 aiohttp 异步库来实现。

如何使用 aiohttp 进行3次异步批量下载图片操作?

异步下载图片:

1. 首先,安装 aiohttp 库: pip install aiohttp

2. 编写异步下载函数: python import aiohttp import asyncio

async def download_image(session, url): async with session.get(url) as response: image_data=await response.read() with open(url.split('/')[-1], 'wb') as f: f.write(image_data)

async def main(urls): async with aiohttp.ClientSession() as session: tasks=[download_image(session, url) for url in urls] await asyncio.gather(*tasks)

if __name__=='__main__': urls=[ 'https://example.com/image1.jpg', 'https://example.com/image2.jpg', # ... 其他图片链接 ] asyncio.run(main(urls))

3. 运行程序,批量下载图片。使用 aiohttp 异步库可以有效地提高下载速度,避免阻塞问题。

前言

当我们需要批量下载图片的时候,requests 库会比较慢,如果一个个下载,出现阻塞的时候,后面的都会阻塞卡住,假死状态。当然你用多线程也能提高效率。

这里介绍用aiocdn.pixabay.com/photo/2014/10/07/13/48/mountain-477832_960_720.jpg',
'cdn.pixabay.com/photo/2013/07/18/10/56/railroad-163518_960_720.jpg',
'cdn.pixabay.com/photo/2018/03/12/20/07/maldives-3220702_960_720.jpg',
'cdn.pixabay.com/photo/2017/08/04/17/56/dolomites-2580866_960_720.jpg',
'cdn.pixabay.com/photo/2016/06/20/03/15/pier-1467984_960_720.jpg',
'cdn.pixabay.com/photo/2014/07/30/02/00/iceberg-404966_960_720.jpg',
'cdn.pixabay.com/photo/2014/11/02/10/41/plane-513641_960_720.jpg',
'cdn.pixabay.com/photo/2015/10/30/20/13/sea-1014710_960_720.jpg'
]

fp = Path('./down_img')
if not fp.exists():
fp.mkdir()


loop = asyncio.get_event_loop()
loop.run_until_complete(main(URL))

运行结果

mountain-477832_960_720.jpg 下载完成!
railroad-163518_960_720.jpg 下载完成!
maldives-3220702_960_720.jpg 下载完成!
dolomites-2580866_960_720.jpg 下载完成!
pier-1467984_960_720.jpg 下载完成!
plane-513641_960_720.jpg 下载完成!
iceberg-404966_960_720.jpg 下载完成!
sea-1014710_960_720.jpg 下载完成!
ALL RESULT:['cdn.pixabay.com/photo/2014/07/30/02/00/iceberg-404966_960_720.jpg', 'cdn.pixabay.com/photo/2018/03/12/20/07/maldives-3220702_960_720.jpg', 'cdn.pixabay.com/photo/2014/10/07/13/48/mountain-477832_960_720.jpg', 'cdn.pixabay.com/photo/2014/11/02/10/41/plane-513641_960_720.jpg', 'cdn.pixabay.com/photo/2017/08/04/17/56/dolomites-2580866_960_720.jpg', 'cdn.pixabay.com/photo/2013/07/18/10/56/railroad-163518_960_720.jpg', 'cdn.pixabay.com/photo/2015/10/30/20/13/sea-1014710_960_720.jpg', 'cdn.pixabay.com/photo/2016/06/20/03/15/pier-1467984_960_720.jpg']

Semaphore控制并发

上面的代码是把8个url一起加入到并发任务,当url数量很多的时候,我们希望可以控制并发量,于是可以用到Semaphore控制并发。

semaphore = asyncio.Semaphore(2) # 限制并发量为2

优化后的代码

import aiocdn.pixabay.com/photo/2014/10/07/13/48/mountain-477832_960_720.jpg',
'cdn.pixabay.com/photo/2013/07/18/10/56/railroad-163518_960_720.jpg',
'cdn.pixabay.com/photo/2018/03/12/20/07/maldives-3220702_960_720.jpg',
'cdn.pixabay.com/photo/2017/08/04/17/56/dolomites-2580866_960_720.jpg',
'cdn.pixabay.com/photo/2016/06/20/03/15/pier-1467984_960_720.jpg',
'cdn.pixabay.com/photo/2014/07/30/02/00/iceberg-404966_960_720.jpg',
'cdn.pixabay.com/photo/2014/11/02/10/41/plane-513641_960_720.jpg',
'cdn.pixabay.com/photo/2015/10/30/20/13/sea-1014710_960_720.jpg'
]

fp = Path('./down_img')
if not fp.exists():
fp.mkdir()

loop = asyncio.get_event_loop()
loop.run_until_complete(main(URL))

使用TCPConnector控制并发

TCPConnector 使用 limit 参数控制并发数

conn = aiocdn.pixabay.com/photo/2014/10/07/13/48/mountain-477832_960_720.jpg',
'cdn.pixabay.com/photo/2013/07/18/10/56/railroad-163518_960_720.jpg',
'cdn.pixabay.com/photo/2018/03/12/20/07/maldives-3220702_960_720.jpg',
'cdn.pixabay.com/photo/2017/08/04/17/56/dolomites-2580866_960_720.jpg',
'cdn.pixabay.com/photo/2016/06/20/03/15/pier-1467984_960_720.jpg',
'cdn.pixabay.com/photo/2014/07/30/02/00/iceberg-404966_960_720.jpg',
'cdn.pixabay.com/photo/2014/11/02/10/41/plane-513641_960_720.jpg',
'cdn.pixabay.com/photo/2015/10/30/20/13/sea-1014710_960_720.jpg'
]

fp = Path('./down_img')
if not fp.exists():
fp.mkdir()

loop = asyncio.get_event_loop()
loop.run_until_complete(main(URL))