urllib2自定义opener详解

yizhihongxing

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 实现多任务进程

    利用 Python 实现多任务进程攻略 什么是多任务? 多任务是计算机处理多个任务的能力,它可以同时执行多个任务。在操作系统中,多任务可以通过进程和线程实现。 什么是进程? 进程是具有独立功能的正在执行的程序,它是操作系统资源分配的基本单位。每个进程都有自己的独立地址空间、栈、堆和代码段等,因此它们之间是独立的。 Python中可以通过multiproces…

    python 2023年5月19日
    00
  • Python中常用的高阶函数实例详解

    Python中常用的高阶函数实例详解 在Python中,高阶函数指的是以函数为参数或返回值的函数。Python内置了很多高阶函数,这些高阶函数可以大大提高代码的可读性,简化编程工作。接下来,我们就针对Python中常用的高阶函数进行详细讲解。 1. map() 在Python中,map()函数用于将一个函数作用于一个可迭代对象的每一个元素上,并返回一个新的可…

    python 2023年6月5日
    00
  • python Pexpect模块的使用

    Pexpect是Python编程语言的一个第三方模块,用于自动化与交互式命令行程序的交互。它可以帮助我们编写自动化脚本从而节省时间和减少错误。以下是使用Pexpect模块的完整攻略以及两个示例说明。 安装 在终端运行以下命令来安装Pexpect模块: pip install pexpect 如需更多信息,请参阅Pexpect官方网站。 使用Pexpect 使…

    python 2023年5月13日
    00
  • python二分法查找算法实现方法【递归与非递归】

    Python二分法查找算法实现方法【递归与非递归】 二分法查找算法是一种高效的查找算法,它的基本思想将有序数组分成两部分,然后判断目标值在哪一部分,再递归地在该部分中查找目值。本文将介绍Python中二分法查找算法的实现方法,包括递归和非递归两种方式。 二分法查找法实现方法 递归实现 递归实现二分法查找算法的基本思想是将有序数组分成两部分然后判断目标值在哪一…

    python 2023年5月13日
    00
  • 11行Python代码实现解密摩斯密码

    下面是详细的攻略: 1.了解摩斯密码 摩斯密码是一种用点(·)和线(–)作为符号,用于传输字母、数字和标点符号的电报代码。点和线的不同排列组合代表不同的字符。例如,字母A的摩斯码是·—,字母B的摩斯码是—···。 2.理解代码思路 这段Python代码使用了一个字典来存储每个字符所对应的摩斯码,然后使用字符串处理方法join()和split()来实现编码和解…

    python 2023年5月20日
    00
  • Python实现搜索Google Scholar论文信息的示例代码

    Python实现搜索Google Scholar论文信息的示例代码 Google Scholar是一个免费的学术搜索引擎,可以搜索学术文献、论文、书籍、报告等。本文将详细讲解如何使用Python实现搜索Google Scholar论文信息的示例代码,包括如何发送HTTP请求、如何解析响应、如何提取数据等。 发送HTTP请求 要实现搜索Google Schol…

    python 2023年5月15日
    00
  • Python requests的SSL证书验证方式

    首先,我们需要了解一下什么是SSL证书以及SSL证书的作用。SSL(Secure Sockets Layer)是一种在客户端浏览器和Web服务器之间建立加密连接的安全协议。SSL证书则是由公共信任的认证机构颁发的一种数字证书,用于验证收发数据双方的身份以及保护数据的传输安全。在使用Python的requests库进行网络请求时,我们要对SSL证书进行验证,以…

    python 2023年6月3日
    00
  • 一文搞懂Python的函数传参机制

    一文搞懂Python的函数传参机制 函数是Python中的重要组件,而函数参数则是Python函数的基本组成部分之一。本文将深入讲解Python的函数传参机制,其中包括以下内容: 函数调用时参数的传递方式 函数参数的默认值 可变参数(args 和 *kwargs) 参数传递时的深拷贝与浅拷贝 函数调用时参数的传递方式 Python中的参数传递有两种方式,分别…

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