20.6. urllib2 —用于打开 URL 的可扩展库

Note

urllib2模块已在 Python 3 中分为几个名为urllib.requesturllib.error的模块。将您的源转换为 Python 3 时,2to3工具将自动适应导入。

urllib2模块定义了有助于在复杂环境中打开 URL(主要是 HTTP)的Function和类-基本身份验证和摘要身份验证,重定向,Cookie 等。

See also

推荐使用Requests package作为更高级别的 HTTPClient 端界面。

urllib2模块定义以下Function:

可选的* timeout *参数以秒为单位指定用于阻止诸如连接try之类的操作的超时(如果未指定,将使用全局默认超时设置)。这实际上仅适用于 HTTP,HTTPS 和 FTP 连接。

如果指定了* context *,则它必须是描述各种 SSL 选项的ssl.SSLContext实例。有关更多详细信息,请参见HTTPSConnection

可选的* cafile capath *参数为 HTTPS 请求指定一组受信任的 CA 证书。 * cafile 应该指向包含一堆 CA 证书的单个文件,而 capath *应该指向哈希证书文件的目录。可以在ssl.SSLContext.load_verify_locations()中找到更多信息。

此函数返回带有三个其他方法的文件状对象:

引发URLError错误。

请注意,如果没有处理程序处理请求,则可能返回None(尽管默认安装的全局OpenerDirector使用UnknownHandler来确保永远不会发生此错误)。

另外,如果检测到代理设置(例如,设置了*_proxy环境变量,如 http_proxy),则默认安装ProxyHandler并确保pass代理处理请求。

在 2.6 版中进行了更改:添加了“超时”。

在版本 2.7.9 中更改:添加了* cafile capath cadefault context *。

如果 Python 安装具有 SSL 支持(即,如果可以导入ssl模块),则还将添加HTTPSHandler

从 Python 2.3 开始,BaseHandler子类还可以更改其handler_order属性以修改其在处理程序列表中的位置。

适当地提出了以下异常:

提供了以下类:

最后两个参数仅对正确处理第三方 HTTP cookie 有用:

要禁用自动检测到的代理,请传递一个空字典。

Note

Note

如果设置了变量REQUEST_METHOD,则HTTP_PROXY将被忽略;请参阅getproxies()上的文档。

在版本 2.7.9 中更改:添加了* context *。

20.6.1. 请求对象

以下方法描述了Request的所有公共接口,因此所有这些都必须在子类中被覆盖。

2.4 版的新Function。

2.4 版的新Function。

20.6.2. OpenerDirector 对象

OpenerDirector个实例具有以下方法:

在 2.6 版中进行了更改:添加了“超时”。

返回的值和引发的异常与urlopen()相同。

OpenerDirector 对象按三个阶段打开 URL:

这些方法在每个阶段中的调用 Sequences 是pass对处理程序实例进行排序来确定的。

实际上,首先对名为default_open()的方法try了上述算法。如果所有此类方法都返回None,则对名为protocol_open的方法重复该算法。如果所有此类方法都返回None,则对名为unknown_open()的方法重复该算法。

请注意,这些方法的实现可能涉及父级OpenerDirector实例的open()error()方法的调用。

20.6.3. BaseHandler 对象

BaseHandler对象提供了一些直接有用的方法,以及其他一些供派生类使用的方法。这些旨在直接使用:

以下属性和方法仅应由BaseHandler派生的类使用。

Note

已经采用了将定义protocol_request()protocol_response()方法的子类命名为*Processor的约定。所有其他名称都称为*Handler

如果实现此方法,则将由父级OpenerDirector调用。它应返回OpenerDirectorNoneopen()的返回值中所述的文件状对象。除非发生 true 的 exceptions,否则它应该提高URLError(例如,不应将MemoryErrorMap 到URLError)。

将在任何特定于协议的打开方法之前调用此方法。

该方法未在BaseHandler中定义,但如果子类要使用给定的协议来处理 URL,则应定义该方法。

如果已定义,则此方法将由父级OpenerDirector调用。返回值应与default_open()相同。

如果实施此方法,将由parent OpenerDirector调用。返回值应与default_open()相同。

返回的值和引发的异常应与urlopen()相同。

子类应重写此方法以处理特定的 HTTP 错误。

引发的参数,返回值和异常应与http_error_default()相同。

该方法未在BaseHandler中定义,但如果子类要预处理给定协议的请求,则应定义该方法。

如果已定义,则此方法将由父级OpenerDirector调用。 * req *将是Request对象。返回值应为Request对象。

该方法未在BaseHandler中定义,但如果子类要后处理给定协议的响应,则应定义该方法。

如果已定义,则此方法将由父级OpenerDirector调用。 * req *将是Request对象。 * response *将是一个实现与urlopen()的返回值相同的接口的对象。返回值应实现与urlopen()的返回值相同的接口。

20.6.4. HTTPRedirectHandler 对象

Note

某些 HTTP 重定向需要此模块的 Client 端代码执行操作。在这种情况下,将引发HTTPError。有关各种重定向代码的确切含义的详细信息,请参见 RFC 2616

Note

此方法的默认实现未严格遵循 RFC 2616,即 RFC 2616POST请求的响应不得未经用户确认而自动重定向。实际上,浏览器确实允许这些响应的自动重定向,将 POST 更改为GET,并且默认实现会重现此行为。

20.6.5. HTTPCookieProcessor 对象

2.4 版的新Function。

HTTPCookieProcessor个实例具有一个属性:

20.6.6. ProxyHandler 对象

对于每个* protocol ProxyHandler都有一个方法protocol_open,该方法在构造函数中提供的 proxies *词典中有一个代理。该方法将pass调用request.set_proxy()来修改要pass代理的请求,并调用链中的下一个处理程序以实际执行协议。

20.6.7. HTTPPasswordMgr 对象

这些方法可用于HTTPPasswordMgrHTTPPasswordMgrWithDefaultRealm对象。

对于HTTPPasswordMgrWithDefaultRealm个对象,如果给定的* realm *没有匹配的用户名/密码,将搜索None领域。

20.6.8. AbstractBasicAuthHandler 对象

20.6.9. HTTPBasicAuthHandler 对象

20.6.10. ProxyBasicAuthHandler 对象

20.6.11. AbstractDigestAuthHandler 对象

20.6.12. HTTPDigestAuthHandler 对象

20.6.13. ProxyDigestAuthHandler 对象

20.6.14. HTTPHandler 对象

20.6.15. HTTPSHandler 对象

20.6.16. FileHandler 对象

20.6.17. FTPHandler 对象

20.6.18. CacheFTPHandler 对象

CacheFTPHandler个对象是FTPHandler个对象,具有以下其他方法:

20.6.19. UnknownHandler 对象

20.6.20. HTTPErrorProcessor 对象

2.4 版的新Function。

对于 200 个错误代码,将立即返回响应对象。

对于非 200 错误代码,这只是passOpenerDirector.error()将作业传递给protocol_error_code处理程序方法。finally,如果没有其他处理程序处理该错误,则urllib2.HTTPDefaultErrorHandler将引发HTTPError

行为与http_response()相同。

20.6.21. Examples

除以下示 exception,如何使用 urllib2 获取 Internet 资源中还提供了更多示例。

本示例获取 python.org 主页,并显示它的前 100 个字节:

>>> import urllib2
>>> f = urllib2.urlopen('http://www.python.org/')
>>> print f.read(100)
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<?xml-stylesheet href="./css/ht2html

在这里,我们将数据流发送到 CGI 的标准 Importing,并读取返回给我们的数据。请注意,此示例仅在 Python 安装支持 SSL 时有效。

>>> import urllib2
>>> req = urllib2.Request(url='https://localhost/cgi-bin/test.cgi',
...                       data='This data is passed to stdin of the CGI')
>>> f = urllib2.urlopen(req)
>>> print f.read()
Got Data: "This data is passed to stdin of the CGI"

上例中使用的示例 CGI 的代码是:

#!/usr/bin/env python
import sys
data = sys.stdin.read()
print 'Content-type: text-plain\n\nGot Data: "%s"' % data

基本 HTTP 验证的使用:

import urllib2
# Create an OpenerDirector with support for Basic HTTP Authentication...
auth_handler = urllib2.HTTPBasicAuthHandler()
auth_handler.add_password(realm='PDQ Application',
                          uri='https://mahler:8092/site-updates.py',
                          user='klem',
                          passwd='kadidd!ehopper')
opener = urllib2.build_opener(auth_handler)
# ...and install it globally so it can be used with urlopen.
urllib2.install_opener(opener)
urllib2.urlopen('http://www.example.com/login.html')

build_opener()默认提供许 multiprocessing 程序,包括ProxyHandler。默认情况下,ProxyHandler使用名为<scheme>_proxy的环境变量,其中<scheme>是涉及的 URL 方案。例如,读取 http_proxy环境变量以获得 HTTP 代理的 URL。

本示例将默认的ProxyHandler替换为使用以编程方式提供的代理 URL 的 URL,并使用ProxyBasicAuthHandler添加代理授权支持。

proxy_handler = urllib2.ProxyHandler({'http': 'http://www.example.com:3128/'})
proxy_auth_handler = urllib2.ProxyBasicAuthHandler()
proxy_auth_handler.add_password('realm', 'host', 'username', 'password')

opener = urllib2.build_opener(proxy_handler, proxy_auth_handler)
# This time, rather than install the OpenerDirector, we use it directly:
opener.open('http://www.example.com/login.html')

添加 HTTPHeaders:

使用Request构造函数的* headers *参数,或:

import urllib2
req = urllib2.Request('http://www.example.com/')
req.add_header('Referer', 'http://www.python.org/')
# Customize the default User-Agent header value:
req.add_header('User-Agent', 'urllib-example/0.1 (Contact: . . .)')
r = urllib2.urlopen(req)

OpenerDirector自动向每个Request添加* User-Agent *Headers。要更改此设置:

import urllib2
opener = urllib2.build_opener()
opener.addheaders = [('User-agent', 'Mozilla/5.0')]
opener.open('http://www.example.com/')

另外,请记住,当Request传递给urlopen()(或OpenerDirector.open())时,会添加一些标准 Headers(* Content-Length Content-Type Host *)。

首页