urllib模块提供的urlretrieve()函数。urlretrieve()方法直接将远程数据下载到本地。
urlretrieve(url, filename=None, reporthook=None, data=None)
参数filename指定了保存本地路径(如果参数未指定,urllib会生成一个临时文件保存数据。)
参数reporthook是一个回调函数,当连接上服务器、以及相应的数据块传输完毕时会触发该回调,我们可以利用这个回调函数来显示当前的下载进度。
参数data指post导服务器的数据,该方法返回一个包含两个元素的(filename, headers) 元组,filename 表示保存到本地的路径,header表示服务器的响应头
将baidu的html抓取到本地,保存在’’./baidu.html"文件中,同时显示下载的进度。
import urllib
#创建函数
def callbackfunc(blocknum, blocksize, totalsize):
'''回调函数
@blocknum: 已经下载的数据块
@blocksize: 数据块的大小
@totalsize: 远程文件的大小
'''
percent = 100.0 * blocknum * blocksize / totalsize
if percent > 100:
percent = 100
print "%.2f%%"% percent
#使用urllib的urlretrieve方法下载数据并回调函数callbackfunc
url = 'http://www.sina.com.cn'
local = 'd:\\sina.html'
urllib.urlretrieve(url, local, callbackfunc)
urlopen()可以轻松获取远端html页面信息,然后通过python正则对所需要的数据进行分析,匹配出想要用的数据,再利用urlretrieve()将数据下载到本地。对于访问受限或者对连接数有限制的远程url地址可以采用proxies(代理的方式)连接,如果远程连接数据量过大,单线程下载太慢的话可以采用多线程下载,这个就是传说中的爬虫。
在纯控制台输出的程序中,有时候想要显示程序运行的进度,如果进度更新一次就输出一次,会打印很多行信息,把前面有用的信息覆盖掉了。Linux下面安装文件时出现的文本形式的进度条和百分比只在一行里面刷新,很不错。Python在windows下面也可以实现这种效果。
import sys
import time
for i in range(10000):
percent = 1.0 * i / 10000 * 100
print 'complete percent:' + str(percent) + '%',
sys.stdout.write("\r")
time.sleep(0.1)