使用Requests下载文件

目录

urllib 模块 (python2.7,python3 改为 urllib.request) 提供 urlretrieve 函数下载文件。

urlretrieve(url, download_path)

上述代码从 url 下载文件保存到本地,本地文件路径为 download_path。 不过,该函数在 python 3.6 版本中已不再推荐使用,后续可能会被移除。

urllib 和 urllib2 接近底层,比较难用,Requests 库封装复杂的借口,提供更人性化的 HTTP 客户端,但不直接提供下载文件的函数。 需要通过为请求设置特殊参数 stream 来实现。当 stream 设为 True 时,上述请求只下载 HTTP 响应头,并保持连接处于打开状态,直到访问 Response.content 属性时才开始下载响应主体内容。

r = requests.get(url, stream=True)

上述代码运行后,响应头 r.headers 已下载,连接保持打开状态,允许我们进一步控制。 可以使用 Response.iter_content(), Response.iter_lines() 方法控制,或者使用 Response.raw读取原始数据。

下面介绍使用 iter_contentraw 下载文件的方法。

iter_content

请看下面的函数

def download_file(url, download_path):
    r = requests.get(url, stream=True)
    if r.status_code == 200:
        with open(download_path, 'wb') as f:
            for chunk in r.iter_content(chunk_size=1024):
                f.write(chunk)
    return

上述函数每次读取 1024 字节(1KB)数据,写入到文件中。 chunk_size 默认为 1,可以设为任意整数或 None(每次接收到的块大小)。

raw

def download_file(url, download_path):
    r = requests.get(url, stream=True)
    if r.status_code == 200:
        with open(download_path, 'wb') as f:
            r.raw.decode_content = True
            shutil.copyfileobj(r.raw, f)
    return

上述代码使用 shutil.copyfileobj 将文件保存到本地。