天天看点

python urllib2介绍

前面已经介绍过urllib库(点此查看),urllib2与其类似,也是Python中用于请求url相关操作的内置库。

urllib2.urlopen(url[, data[, timeout[, cafile[, capath[, cadefault[, context]]]]])

这个函数可以像urllib.urlopen()那样以url做参数。也能以Request实例为参数,即用一个Request对象(下文构造方法)来映射你提出的HTTP请求,在它最简单的使用形式中你将用你要请求的地址创建一个Request对象,这个Request对象中可以设置传输数据、headers等。通过调用urlopen并传入Request对象,将返回一个file-like对象。urllib2还提供了接口来处理一般情况,例如:基础验证,cookies,代理和其他,它们通过handlers和openers的对象实现。

在HTTP请求时,允许你做额外的两件事。首先是你能够发送data表单数据,其次你能够传送额外的关于数据或发送本身的信息("metadata")到服务器,此数据作为HTTP的"headers"来发送。接下来让我们看看这些如何发送的吧:

Data数据

发送data数据的方式有两种,GET和POST方式。具体区别参见文章浅谈HTTP中Get与Post的区别。

python模拟GET方式基本上对url做些字符串的拼接就可以了,有时也会用到urllib.urlencode()函数。当使用urlopen()时没有传入data参数,默认的是GET方式进行请求。

python模拟POST方式,需要引入data参数。data数据会发送到URL(多为html中表单action属性的值,即接受数据并作出反应的URL,如php、jsp、cgi等)。使用python模拟post提交HTML表单,需要编码成标准形式。然后做为参数传到Request对象,编码工作使用urllib.urlencode()函数。

import urllib,urllib2
action_url="http://httpbin.org/post"#用于测试post的网址,返回提交的数据
values={'name':"alice",'age':20}
data=urllib.urlencode(values)#对表单数据编码
rqst=urllib2.Request(action_url,data)
response=urllib2.urlopen(rqst)#模拟提交表单数据到url并获得响应
print response.read()
           
Headers
有一些站点不喜欢被程序(非人为访问)访问,或者发送不同版本的内容到不同的浏览器。默认的urllib2把自己作为“Python-urllib/x.y”(x和y是Python主版本和次版本号,例如Python-urllib/2.5),
这个身份可能会让站点迷惑,或者干脆不工作。浏览器确认自己身份是通过User-Agent头,当你创建了一个请求对象,你可以给他一个包含头数据的字典。下面的例子发送跟上面一样的内容,但把自身模拟成Internet Explorer。
import urllib 
import urllib2 
url = 'http://www.weibo.cn/' 
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)' 
h = { 'User-Agent' : user_agent } 
req = urllib2.Request(url,headers=h) 
response = urllib2.urlopen(req) 
print response.read()
           

info and geturl

urlopen返回的应答对象response(或者HTTPError实例)有两个很有用的方法info()和geturl()
geturl :这个返回获取的真实的URL,这个很有用,因为urlopen(或者opener对象使用的)或许会有重定向。获取的URL或许跟请求URL不同。
info:这个返回对象的字典对象,该字典描述了获取的页面情况。通常是服务器发送的特定头headers。目前是httplib.HTTPMessage 实例。经典的headers包含"Content-length","Content-type",和其他。

urllib2.Request(url[, data][, headers][, origin_req_host][, unverifiable])

用于构造Request对象,可以传递data数据,添加请求头(headers)等,构造好后作为urllib2.urlopen()的参数。

Openers和Handlers

当你获取一个URL你使用一个opener(一个urllib2.OpenerDirector的实例),正常情况下,我们使用默认opener 进行urlopen()

但你能够创建个性的openers,Openers使用处理器handlers,所有的“繁重”工作由handlers处理。

每个handlers知道如何通过特定协议打开URLs,或者如何处理URL打开时的各个方面,例如HTTP重定向或者HTTP cookies。如果你希望用特定处理器获取URLs你会想创建一个openers,例如获取一个能处理cookie的opener,或者获取一个不重定向的opener。

要创建一个自定义opener,可以实例化一个OpenerDirector,然后调用不断调用add_handler(some_handler_instance);

同样,也可以使用build_opener,这是一个更加方便的函数,用来创建opener对象,他只需要一次函数调用。build_opener默认添加几个处理器,但提供快捷的方法来添加或更新默认处理器。其他的处理器handlers你或许会希望处理代理,验证,和其他常用但有点特殊的情况。

install_opener 用来创建(全局)默认opener。这个表示调用urlopen将使用你安装的opener。

Opener对象有一个open方法,该方法可以像urlopen函数那样直接用来获取urls:通常不必调用install_opener,除了为了方便。

具体问题可以参考文章:urllib2自定义opener详解。

继续阅读