rullib模块提供了一系列从指定rul中下载数据,同时也可以对字符串进行编码、解码工作的函数,一边在url中可以正确的显示出来。以下常用函数:urlopen(), rulretrieve(), quote(), unquote(), quote_plus(), unquote_plus()和urlencode()。
1、urlopen():打开一个给定的URL字符串表示的web链接,返回文件类型的对象。
语法:urlopen(urlstr, postQueryData=None)
urlstr如果没有给定协议或者下载方案,或者传入了file方案,urlopen就会打开本地文件;
一旦链接成功,urlopen会返回一个文件类型对象,就像在目标路径下打开了一个可读文件。例如,如果文件对象是f,那么“句柄”会支持一些读取内容的方法,如f.read() , f.readline() , f.readlins() , f.close() , f.fileno()。
说明:2.6和3.0版本的python中使用urllib2.urlopen()。2.6版本开始,urllib中废弃了urlopen,而在3.0中移除了该函数,3.x版本中需要使用urllib.request.urlopen()。
2、urllib.urlretrieve():下载完整的html,另存为文件,其语法如下:
urlretrieve(url, filename=None, reporthook=None, data=None)
urlretrieve()返回一个二元组(filename,mine_hdrs)
>>> filename = urllib.urlretrieve('http://www.google.com.hk/',filename='/home/dzhwen/python文件/Homework/urllib/google.html')
>>> type(filename)
<type 'tuple'>
>>> filename[0]
'/home/dzhwen/python\xe6\x96\x87\xe4\xbb\xb6/Homework/urllib/google.html'
>>> filename[1]
<httplib.HTTPMessage instance at 0xb6e2c38c>
- 参数 finename 指定了保存本地路径(如果参数未指定,urllib会生成一个临时文件保存数据。)
- 参数 reporthook 是一个回调函数,当连接上服务器、以及相应的数据块传输完毕时会触发该回调,我们可以利用这个回调函数来显示当前的下载进度。
- 参数 data 指 post 到服务器的数据,该方法返回一个包含两个元素的(filename, headers)元组,filename 表示保存到本地的路径,header 表示服务器的响应头
若果提供了reporthook这个回调函数,则在每块数据下载或传输完成后会调用这个函数。调用时使用以下3个参数:目前读入块数,块的字节数和总字节数。
例子:
#!/usr/bin/python
#encoding:utf-8
import urllib
import os
def Schedule(a,b,c):
'''''
a:已经下载的数据块
b:数据块的大小
c:远程文件的大小
'''
per = 100.0 * a * b / c
if per > 100 :
per = 100
print '%.2f%%' % per
url = 'http://www.python.org/ftp/python/2.7.5/Python-2.7.5.tar.bz2'
#local = url.split('/')[-1]
local = os.path.join('/data/software','Python-2.7.5.tar.bz2')
urllib.urlretrieve(url,local,Schedule)
######output######
#0.00%
#0.07%
#0.13%
#0.20%
#....
#99.94%
#100.00%
3、urllib.quote()和rullib.quote_plus()
quote*()函数用来获取URL数据,并将其编码,使其可以用于URL字符串中。具体来说就是必须对某些不能打印的活着不被web服务器作为有效URL接收的特殊字符串进行转换。
为什么需要转换请参看https://blog.csdn.net/likunshan/article/details/80882465;
4、urllib.urlencode()
urllencode()函数接受字典的键值对,并将其编译成字符串,作为CGI请求的URL字符串的一部分。
>>> from urllib import urlencode
>>> data = {
... 'a': 'test',
... 'name': 'test_name'
... }
>>> print urlencode(data)
a=test&name=test_name
为什么要组成如此形式参见:
URL 的post和get形式请求;