Python 在爬虫的过程中,始终涉及到图片下载的问题,本文由简单到复杂的层面来讲解如何下载图片到如何高效下载图片
下载图片
简单下载图片
def download(url,floder):
r=response.get(url)
filename = url.split('/')[-1]
with open(f"{folder}/{filename}", 'wb') as f:
f.write(rc.content)
调用很简单,只需要进行函数调用即可
缺点就是下载大文件占用内存,内存本就不大,你这下载个文件就把内存占用完了还咋整
那么,我们就要对代码进行改造
分块下载
改造方案:
使用分块下载方案,减少对内存的占用
代码:
def dowmload(url, folder):
r = requests.get(url)
filename = url.split('/')[-1]
with open(f"{folder}/{filename}", 'wb') as f:
for chunk in r.iter_content(chunk_size=1024):
f.write(chunk)
这样,就支持了大文件下载,只要硬盘够空间,就能完好下载文件,除非你手欠中断了下载
异步下载
但是,如果是多个文件,就会发生阻塞现象,也就是文件要排队下载。消耗的时间会很长
那如何改造代码,支持多线程下载,提升效率呢
我们这里推荐使用异步的方案,代码简洁、高效
from aiohttp import ClientSession
from aiofiles import open as aio_open
async def download_file(url, folder):
async with ClientSession() as session:
async with session.get(url) as response:
if response.status == 200:
filename = url.split('/')[-1]
async with aio_open(f"{folder}/{filename}", 'wb') as f:
async for data in response.content.iter_any():
await f.write(data)
else:
print(response.status)
response.content.iter_any()
可以替换成response.content.iter_chunked(1024 * 1024)
如何去使用这个代码
tasks = []
for src in list_src:
tasks.append(download_file(src, file_name))
if tasks!= []:
await asyncio.gather(*tasks)
由于这是异步代码,要注意一下
这就是Python下载文件的方法,一般情况下,代码简单点,如果涉及爬虫,建议异步+代理,提升效率