urllib2自定义opener详解
什么是urllib2自定义opener
urllib2是Python用来打开URL的标准库,它提供了一系列的模块来处理HTTP请求,包括获取网页内容,POST数据,设置HTTP请求头等。urllib2自定义opener是一个更高级的使用urllib2的方式,它允许在一次HTTP请求中执行多个操作,并且可以自定义HTTP请求头和cookie等。使用这种方式,可以更加灵活地控制HTTP请求的行为。
自定义urllib2的Opener
要自定义urllib2的opener,需要先创建一个opener对象,然后使用urllib2的build_opener方法将其注册到urllib2中。创建opener对象的方法有两种,一种是直接使用urllib2.build_opener方法,另一种是继承urllib2.OpenerDirector并重写其中的方法来实现自定义的功能。其中前者更加简单,适合一些比较简单的需求,而后者则更具灵活性,可以实现各种更加复杂的功能。
直接使用build_opener方法创建opener
使用build_opener方法创建opener的示例如下:
import urllib2
opener = urllib2.build_opener(urllib2.HTTPHandler(), urllib2.HTTPSHandler())
response = opener.open('http://www.example.com/')
print response.read()
这个示例中,我们使用了urllib2的HTTPHandler和HTTPSHandler来创建了一个opener对象。这个opener对象可以处理HTTP和HTTPS请求,然后我们使用这个opener来打开了一个URL,并读取了其内容。
除了默认提供的HTTPHandler和HTTPSHandler之外,我们还可以自定义Handler来处理更加复杂的HTTP请求。例如,我们可以定义一个处理cookie的Handler,来处理cookie相关的功能。代码示例如下:
import urllib
import urllib2
class MyCookieHandler(urllib2.BaseHandler):
def __init__(self):
self.cookie = None
def http_response(self, req, res):
self.cookie = res.headers.get('Set-Cookie')
return res
https_response = http_response
opener = urllib2.build_opener(MyCookieHandler())
response = opener.open('http://www.example.com/')
print response.read()
print opener.handler_order
print opener.cookie
在这个示例中,我们自定义了一个MyCookieHandler类,它继承自urllib2.BaseHandler,并重写了其中的http_response和https_response方法。这个Handler可以在HTTP响应中获取到cookie信息,并将其保存到cookie属性中。然后我们使用这个Handler来创建opener,打开了一个URL,并读取了其内容。最后我们输出了opener的handler_order和cookie属性。
继承OpenerDirector重写方法创建opener
和上面的示例相比,继承OpenerDirector并重写其中的方法来创建opener则更加灵活,可以在每个阶段都实现自己的处理逻辑。我们可以重写一下几个方法:
- open(self, fullurl, data=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT)
- http_error_default(self, req, fp, code, msg, hdrs)
- http_error_302(self, req, fp, code, msg, headers)
示例代码如下:
import urllib2
class MyOpener(urllib2.OpenerDirector):
def __init__(self):
urllib2.OpenerDirector.__init__(self)
def open(self, fullurl, data=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT):
request = urllib2.Request(fullurl, data)
response = self.open_request(request)
return response
def http_error_default(self, req, fp, code, msg, hdrs):
print 'Error:', code
def http_error_302(self, req, fp, code, msg, headers):
print 'Redirect to:', headers.get('location')
opener = MyOpener()
response = opener.open('http://www.example.com/')
print response.read()
在这个示例中,我们自定义了一个MyOpener类,它继承自urllib2.OpenerDirector,并重写了其中的三个方法。在open方法中,我们使用urllib2.Request来创建一个请求对象,然后调用父类的open_request方法来实际执行HTTP请求。在http_error_default方法中,我们重写了HTTP请求出错的默认行为,直接输出了错误代码。在http_error_302方法中,我们处理了HTTP 302重定向的行为,输出了重定向的URL。
自定义HTTP请求头和cookie
HTTP请求头和cookie是在HTTP请求中非常重要的两个部分,它们可以控制HTTP请求的行为,并且也可以用来识别请求来源。urllib2自定义opener提供了非常方便的方式来自定义HTTP请求头和cookie。
自定义HTTP请求头
要自定义HTTP请求头,只需要在创建opener的时候添加一个urllib2.Request对象即可。例如:
import urllib2
request = urllib2.Request('http://www.example.com/')
request.add_header('User-Agent', 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:57.0) Gecko/20100101 Firefox/57.0')
opener = urllib2.build_opener()
response = opener.open(request)
print response.read()
在这个示例中,我们使用了urllib2.Request来创建一个请求对象,并利用add_header方法添加了一个User-Agent头,然后使用build_opener方法来创建opener并发起HTTP请求。
自定义cookie
要自定义cookie,可以使用urllib2的cookielib模块来自定义cookie。示例代码如下:
import cookielib
import urllib2
cookie = cookielib.Cookie(version=0, name='foo', value='bar')
jar = cookielib.CookieJar()
jar.set_cookie(cookie)
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(jar))
response = opener.open('http://www.example.com/')
print response.read()
print jar
在这个示例中,我们首先创建了一个cookie,然后使用cookielib.CookieJar来创建一个cookie的容器。然后我们将cookie添加到容器中,并使用urllib2.HTTPCookieProcessor来创建一个处理cookie的Handler,使用build_opener方法来创建opener,并发起HTTP请求。最后我们输出了响应内容和cookielib.CookieJar对象。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:urllib2自定义opener详解 - Python技术站