本文主要介绍使用Python3下载文件的常用方法。

urllib

1
2
3
4
5
6
7
8
9
10
11
12
13
def report_hook(count, block_size, total_size):
'''回调函数
@count:已经下载的数据块
@block_size:数据块的大小
@total_size:远程文件的大小
'''
print('%02d%%'%(100.0 * count * block_size/ total_size))
from urllib import request
import os
url='https://www.python.org/ftp/python/3.7.1/python-3.7.1-amd64.exe'
filename = os.path.basename(url)
# 第一个参数网络地址;第二个参数 本地保存位置
request.urlretrieve(url,filename,report_hook)

注意,Python3.3之后不在使用urllib2。

urllib3

1
2
3
4
5
6
7
8
9
10
11
import os
import urllib3
import logging
# urllib3.disable_warnings()
logging.captureWarnings(True) # 捕获警告
url='https://www.python.org/ftp/python/3.7.1/python-3.7.1-amd64.exe'
filename = os.path.basename(url)
http=urllib3.PoolManager()
r=http.request('GET',url)
with open(filename, "wb") as code:
code.write(r.data)

requests

1
2
3
4
5
6
7
import os
import requests
url='https://www.python.org/ftp/python/3.7.1/python-3.7.1-amd64.exe'
filename = os.path.basename(url)
r = requests.get(url)
with open(filename, "wb") as code:
code.write(r.content)

如果下载比较大的文件,requests可以实现将下载的文件分块写到磁盘。

1
2
3
4
5
6
7
8
9
import os
import requests
url='https://www.python.org/ftp/python/3.7.1/python-3.7.1-amd64.exe'
filename = os.path.basename(url)
r = requests.get(url)
with open(filename, 'wb') as f:
for chunk in r.iter_content(chunk_size=32):
# r.iter_content(chunk_size) 来控制每个chunk的大小
f.write(chunk)

wget

wget是一个从网络上自动下载文件的自由工具。它支持HTTP,HTTPS和FTP协议,可以使用HTTP代理。

1
2
3
4
5
6
7
8
9
10
import wget
import subprocess
import os
def report_hook(current, total, width=100):
print('%2d%%' % (100.0 * current / total))
url='https://www.python.org/ftp/python/3.7.1/python-3.7.1-amd64.exe'
filename = os.path.basename(url)
cmd='wget --no-check-certificate -O %s %s ' % (filename, url)
# subprocess.call(cmd,shell=True)
wget.download(url, out=filename,bar=report_hook)

wget常用参数:

  • -c 断点续传
  • -t BUMBER 最大尝试连接次数(–tries=NUMBER)
  • -T SECONDS 响应超时秒数 (–timeout=SECOBDS)
  • -P PREFIX 将文件保存在目录(–directory-prefix=PREFIX)