使用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_content
和 raw
下载文件的方法。
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
将文件保存到本地。