urllib2自定义opener详解

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技术站

(0)
上一篇 2023年6月3日
下一篇 2023年6月3日

相关文章

  • Python实现批量自动整理文件

    下面是详细的攻略: 1. 准备工作 首先需要安装 Python 语言环境,可以前往官网下载安装。 安装完成后,需要安装第三方库 os 和 shutil,使用以下命令安装: pip install os pip install shutil 2. 功能设计 2.1 获取目录下所有文件 使用 os 模块提供的 listdir 函数获取目录下所有文件和目录: im…

    python 2023年5月19日
    00
  • Python图像处理之识别图像中的文字(实例讲解)

    让我来详细讲解一下”Python图像处理之识别图像中的文字(实例讲解)”的完整攻略。 简介 “Python图像处理之识别图像中的文字(实例讲解)”是一篇介绍如何使用Python识别图像中的文字的文章。在这篇文章中,我们将学习使用Python编写程序,利用OCR技术从图片中识别文字。 步骤 本文中,我们将使用tesseract OCR引擎来进行图像文字识别。下…

    python 2023年5月18日
    00
  • Python探索之pLSA实现代码

    Python探索之pLSA实现代码攻略 1. 简介 pLSA (Probabilistic Latent Semantic Analysis) 是一种概率模型,用于对文档进行主题建模。本攻略将介绍如何实现pLSA算法,同时提供两个示例说明它的用途。 2. 实现 2.1 数据准备 首先,我们需要一些文本数据用于主题建模。这里我们采用经典的20个新闻组数据集。可…

    python 2023年6月3日
    00
  • Python3+Requests+Excel完整接口自动化测试框架的实现

    我来为您详细讲解“Python3+Requests+Excel完整接口自动化测试框架的实现”的完整实例教程。 简介 在当前的软件开发过程中,接口测试不可或缺。为了提升测试效率和测试质量,我们需要使用接口自动化测试框架来进行测试,提高测试的可重复性和可维护性。这里我们将结合Python3+Requests+Excel来实现一个完整的接口自动化测试框架。 工具说…

    python 2023年5月13日
    00
  • mysql-python安装问题(在ma​​c os x lion上)

    【问题标题】:mysql-python installation problems (on mac os x lion)mysql-python安装问题(在ma​​c os x lion上) 【发布时间】:2023-04-02 21:15:01 【问题描述】: 我成功安装了所有东西,或者我是这么想的: 适用于 x86_64 的 MySQL 5.5。 Pyth…

    Python开发 2023年4月8日
    00
  • pip报错“TypeError: ‘module’ object is not callable”怎么处理?

    当使用 pip 安装 Python 包时,可能会遇到 “TypeError: ‘module’ object is not callable” 错误。这个错误通常是由于您的 Python 模块或包不兼容当前版本的 Python 或 pip 导致的。以下是详细讲解 pip 报错 “TypeError: ‘module’ object is not callab…

    python 2023年5月4日
    00
  • python获取服务器响应cookie的实例

    在Python中,我们可以使用requests库发送HTTP请求,并使用response对象获取HTTP响应的内容和Cookie信息。本文将详细讲解如何使用Python获取服务器响应Cookie的实例,包括使用requests库和http.cookiejar库两个示例。 使用requests库获取服务器响应Cookie的示例 以下是一个示例,演示如何使用re…

    python 2023年5月15日
    00
  • python学生信息管理系统(初级版)

    Python学生信息管理系统(初级版)攻略 简介 本文将详细讲解如何实现一个简单的Python学生信息管理系统,包括添加学生信息、修改学生信息、删除学生信息、查询学生信息等功能。 实现步骤 第一步:创建学生信息类 首先,需要创建一个学生信息类,包含学生的姓名、性别、年龄等信息。可以使用字典类型存储这些信息,代码如下: class Student: def _…

    python 2023年5月30日
    00
合作推广
合作推广
分享本页
返回顶部