python3.x 版本将urllib与urllib2合并为urllib
urllib is a package that collects several modules for working with URLs:
urllib.request for opening and reading URLs
urllib.error containing the exceptions raised by urllib.request
urllib.parse for parsing URLs
urllib.robotparser for parsing robots.txt filesurllib.request
def _progress(count, block_size, total_size): ## 回调函数,count当前块的编号,block_size每次传输的块大小,total_size网页文件总大小
prog = float(count * block_size) / float(total_size) * 100.0 #进度的百分占比
sys.stdout.write('\r>> Downloading %s %.1f%%' %
(filename, prog))
sys.stdout.flush()
filepath, _ = urllib.request.urlretrieve(url, filepath, reporthook=_progress)
函数:urllib.urlretrieve(url[, filename[, reporthook[, data]]])
urllib.urlretrieve(url, filename, reporthook=None,data=None)
参数说明:
url:外部或者本地url
filename:指定了保存到本地的路径(如果未指定该参数,urllib会生成一个临时文件来保存数据);
reporthook:是一个回调函数,当连接上服务器、以及相应的数据块传输完毕的时候会触发该回调。我们可以利用这个回调函数来显示当前的下载进度。data:指post到服务器的数据。该方法返回一个包含两个元素的元组(filename, headers),filename表示保存到本地的路径,header表示服务器的响应头。
返回两个值,第一个值是文件的地址,第二个值是该文件的一些信息比如格式,类别,下载的日期等等
注意
这里的url所指的内容要和filepath的内容一致,
例如
import urllib.request
urllib.request.urlretrieve('https://www.baidu.com/3.jpg', '/home/zzp')这样子是会报错的
IsADirectoryError: [Errno 21] Is a directory: '/home/zzp/'就是说文件匹配成目录了
urllib.request.urlretrieve('https://www.baidu.com/3.jpg', '/home/zzp/333.jpg')这样就可以了,在zzp文件里面就能看到以333.jpg命名的文件了,若改为333.png,结果也可以下载,但是无法打开333.png文件。
aa,_ = urllib.request.urlretrieve('https://www.baidu.com/3.jpg', '/home/zzp/333.jpg')返回值aa是 ’/home/zzp/333.jpg‘ ,是字符串类型