在能使用的各种网络工作库中,功能最强大的是urllib和urllib2,它们能够让网络访问文件,就像这些文件存在于电脑上一样,通过一个简单的调用,几乎可以把任何URL所指向的东西用作程序的输入。
1、打开远程文件
可以像打开本地文件一样打开远程文件,不同之处是可以使用只读模式,使用的是来自于urllib模块的urlopen。
import urllib
baidu = urllib.urlopen('http://www.baidu.com')
urlopen返回的类文件对象支持close、read、readline和readlines方法。
baidu = urllib.urlopen('http://www.baidu.com').read()
read() , readline() , readlines() , fileno() , close() :这些方法的使用方式与文件对象完全一样;
info():返回一个httplib.HTTPMessage 对象,表示远程服务器返回的头信息;
getcode():返回Http状态码。如果是http请求,200表示请求成功完成;404表示网址未找到; geturl():返回请求的url;
例子:
import urllib
baidu = urllib.urlopen('http://www.baidu.com')
print 'http header:\n',baidu.info()
print 'http statues:',baidu.getcode()
print 'url:',baidu.geturl()
for line in baidu:
print line
baidu.close()
运行结果:
http header:
Date: Wed, 18 Jun 2014 08:37:47 GMT
Content-Type: text/html; charset=utf-8
Connection: Close
Vary: Accept-Encoding
Set-Cookie: BAIDUID=752AA7ED1CC1CA9B76A8A2928F2BC7A8:FG=1; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Set-Cookie: BDSVRTM=0; path=/
Set-Cookie: H_PS_PSSID=6622_1450_5224_6996_6506_7057_4759_6018_7159_6930_7074_7134_6983_7105; path=/; domain=.baidu.com
P3P: CP=" OTI DSP COR IVA OUR IND COM "
Cache-Control: private
Cxy_all: baidu+8aa8d020a1f90c7e5f2e2962e0a3e349
Expires: Wed, 18 Jun 2014 08:37:29 GMT
X-Powered-By: HPHP
Server: BWS/1.1
BDPAGETYPE: 1
BDQID: 0xb06118de00023c84
BDUSERID: 0
http statues: 200
url: http://www.baidu.com
2、获取远程文件
函数urlopen提供一个能从中读取数据的类文件对象。如果希望urllib能够下载文件,并且在本地存储一个文件的副本,那么可以使用urlretrieve。urlretrieve返回一个元组(filename,headers)而不是类文件对象,filename是本地文件的名字(由urllib自动创建),header包含一些远程文件的信息。如果想要为下载的副本指定文件名,可以再urlretrieve函数的第二个参数中给出。
urllib.urlretrieve('http://www.python.org','D:\\python_webpage.html')
这个语句获取Python的主页并且把它存储在文件D:\\python_webpage.html中。如果没有指定文件名,文件就会放在临时的我只,用open函数可以打开它,但如果完成了对它的操作,用urlcleanup函数,可以清理临时文件,不需要提供参数。
urllib.urlretrieve('http://www.python.org','D:\\python_webpage.html')
urllib.urlcleanup()
例子:
import urllib
def cbk(a,b,c):
per = 100.0*a*b/c
if per > 100:
per = 100
print '%.2f%%' % per
url = 'http://www.sina.com.cn'
local = 'd:\\sina.html'
urllib.urlretrieve(url,local,cbk)
运行结果:
显示下载的百分比
3、一些功能
urllib.quote(string[, safe]):对字符串进行编码。参数safe指定了不需要编码的字符;
urllib.unquote(string) :对字符串进行解码;
urllib.quote_plus(string [ , safe ] ) :与urllib.quote类似,但这个方法用'+'来替换' ',而quote用'%20'来代替' '
urllib.unquote_plus(string ) :对字符串进行解码;
urllib.urlencode(query[, doseq]):将dict或者包含两个元素的元组列表转换成url参数。例如 字典{'name': 'dark-bull', 'age': 200}将被转换为"name=dark-bull&age=200"
urllib.pathname2url(path):将本地路径转换成url路径;
urllib.url2pathname(path):将url路径转换成本地路径;
例子:
data = 'name = dawn_123%~'
data1 = urllib.quote(data)
print data1
print urllib.unquote(data1)
data2 = urllib.quote_plus(data)
print data2
print urllib.unquote_plus(data2)
data3 = urllib.urlencode({'name':'dark-bull','age':200})
print data3
data4 = urllib.pathname2url(r'd:\a\b\c\23.php')
print data4
print urllib.url2pathname(data4)
运行结果:
name%20%3D%20dawn_123%25%7Ename = dawn_123%~
name+%3D+dawn_123%25%7E
name = dawn_123%~
age=200&name=dark-bull
///D:/a/b/c/23.php
D:\a\b\c\23.php
Reference:
http://www.blogjava.net/ashutc/archive/2011/03/21/346695.html
《Python基础教程》