urllib模块 | Python 2.7.11
官方文档: https://docs.python.org/2/library/urllib.html
某博客对官方文档较全的翻译: http://h2byte.com/post/tech/relation-bewteen-usllib-and-urllib2?action=show_raw
提供用于获取互联网上数据的高级接口
打开https URL时不会尝试验证服务器证书
1.接口:
1)urllib.
urlopen
(url[, data[, proxies[, context]]])
类似于内建函数open(),但接收的不是文件名而是URL;
若无法连接,将引发IOError异常;
若完成连接将返回一个类文件对象,该对象支持以下操作:
read() , readline() , readlines() , fileno() , close() : 这些函数与文件对象的同名函数有着相同的接口,使用方式与文件对象完全一样
info() : 返回一个包含与该URL相关联的元信息的mimetools.Message对象,如果是HTTP,则代表从服务器接收到的html文件中的header信息,如果是FTP,则会返回一个内容长度header(?),如果是本地文件,则包含文件最后一次修改时间、文件大小、文件类型等信息
geturl() : 返回页面的真实URL,一些服务器会将请求重定向到其他的URL,urlopen()会自动处理重定向,geturl()函数能获取到重定向后的URL
getcode() : 若URL是HTTP类型的则获取响应中的HTTP状态码,否则返回None
代理.......不懂,待补充
2)urllib.
urlretrieve
(url[, filename[, reporthook[, data]]])
在必要时将该URL表示的网络对象保存到本地文件,若url指向本地文件或有效缓存,则不进行保存
返回一个tuple (filename, headers),filename是保存的文件名,headers是urlopen().info()返回的信息
Exceptions与urlopen()的相同
如果没有指定保存的路径,则保存为临时文件
reporthook是一个回掉函数,接受三个参数(已接收数据块数,数据块大小(bytes),文件大小)
在FTP链接中当header不存在Content-Type键时第三个参数文件大小可能为-1
3)urllib.
_urlopener ?
4) urllib.
urlcleanup
()
清除之前调用urllib.urlretrieve()所留下的缓存
2. 实用功能
1)urllib.
quote
(string[, safe])
用%xx替换string中的特殊字符,但字母、数字和一些字符('_.-')不会被替换
通常这个函数针对URL中的路径部分进行替换
可选参数safe指定不用被替换的字符,默认值是'/'
2)urllib.
quote_plus
(string[, safe])
类似于urllib.quote(),但会用加号'+'替换空格,若加号不包括在safe参数中,string中的加号将会被转义,产生类似HTML表单的数据
3)urllib.
unquote
(string)
urllib.quote()的反函数,将%xx转换成相应的单字符
4)urllib.
unquote_plus
(string)
urllib.quote_plus()的反函数,类似于urllib.unquote(),但会把加号替换成空格
5)urllib.
urlencode
(query[, doseq])
将字典或包含两个元素的元组序列转换成"percent-encoded"(百分比编码?)字符串,使其能被用于urlopen()的可选变量data,主要用于POST请求中传递表单
转换后的字符串是一系列用'&'分隔开的key=value对,key 和 value 都是用quote_plus()转换过的
6)urllib.
pathname2url
(path)
将本地路径转换为url,过程中使用了quote()
7)urllib.
url2pathname
(path)
将url转换为本地路径,过程中使用了unquote()
8)urllib.
getproxies
() ?
3. URL Opener 对象
1)class urllib.
URLopener
([proxies[, context[, **x509]]])
打开和读取URLs的基类;
URLopener类默认情况下发送urllib/VVV(VVV代表urllib的版本号)的User-Agent header,应用程序可以通过URLopener和FancyURLopener的子类和设置类属性version来定义User-Agent header
可选参数proxies应该是字典类型描述的proxy URLs, 空字典会将proxy关闭, 默认值为None
context是一个ssl.SSLContext实例,定义opener打开https链接时的SSL
附加关键字参数用于建立https链接中传送SSL key 和 certificate
当服务器返回错误码时会引发IOError异常
open
(fullurl[, data])
用适当的协议打开fullurl
该方法设置缓存和代理信息后调用合适的open方法,如果方案未能识别,则调用open_unknown()
data参数的意义与urlopen()中的data参数意义相同
open_unknown
(fullurl[, data])
重写接口,打开未知类型的URL
retrieve
(url[, filename[, reporthook[, data]]])
version
该变量为opoener对象指定一个user agent,在子类中作为类变量设置或者在构造函数中设置
2)class urllib.
FancyURLopener
(...)
FancyURLopener是URLopener的子类,定义了处理http状态码301, 302, 303, 307 和 401的方法
4. urllib的局限
当前仅支持HTTP,FTP和本地文件
urlretrieve的caching特性被禁用了(until I find the time to hack proper processing of Expiration time headers.))
可能会反复等待一个连接建立而引起长延时
对待ftp的文件和目录,采用了不同的策略,可能会引起一些问题.作者建议使用ftplib模块,或者继承FancyOpener来改写.
不支持需要认证的代理
URL的处理建议使用urlparser模块