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下载文件的方法,一般情况下,代码简单点,如果涉及爬虫,建议异步+代理,提升效率

最后修改:2024 年 05 月 22 日
如果觉得我的文章对你有用,请随意赞赏