20.6. urllib2 — 用于打开 URL 的可扩展库 — Python 文档
20.6. urllib2 — 用于打开 URL 的可扩展库
笔记
urllib2 模块已拆分为 Python 3 中的多个模块,名为 urllib.request
和 urllib.error
。 2to3 工具将在将您的源代码转换为 Python 3 时自动调整导入。
urllib2 模块定义了有助于在复杂世界中打开 URL(主要是 HTTP)的函数和类——基本和摘要式身份验证、重定向、cookies 等。
urllib2 模块定义了以下函数:
- urllib2.urlopen(url[, data[, timeout[, cafile[, capath[, cadefault[, context]]]]])
打开 URL url,它可以是字符串或 Request 对象。
data 可以是一个字符串,指定要发送到服务器的附加数据,或者
None
如果不需要这样的数据。 目前 HTTP 请求是唯一使用 data 的请求; 当提供 data 参数时,HTTP 请求将是 POST 而不是 GET。 data 应该是标准 application/x-www-form-urlencoded 格式的缓冲区。 urllib.urlencode() 函数采用 2 元组的映射或序列,并返回此格式的字符串。 urllib2 模块发送包含Connection:close
标头的 HTTP/1.1 请求。可选的 timeout 参数指定阻塞操作(如连接尝试)的超时(以秒为单位)(如果未指定,将使用全局默认超时设置)。 这实际上仅适用于 HTTP、HTTPS 和 FTP 连接。
如果指定了 context,它必须是一个描述各种 SSL 选项的 ssl.SSLContext 实例。 有关更多详细信息,请参阅 HTTPSConnection。
可选的 cafile 和 capath 参数为 HTTPS 请求指定一组受信任的 CA 证书。 cafile 应该指向包含一组 CA 证书的单个文件,而 capath 应该指向散列证书文件的目录。 更多信息可以在 ssl.SSLContext.load_verify_locations() 中找到。
cadefault 参数被忽略。
此函数返回一个文件类对象,其中包含三个附加方法:
geturl()
— 返回检索到的资源的 URL,通常用于确定是否遵循重定向info()
— 以 mimetools.Message 实例的形式返回页面的元信息,例如标题(参见 HTTP 标题快速参考 )getcode()
— 返回响应的 HTTP 状态代码。
出现错误时引发 URLError。
请注意,如果没有处理程序处理请求,则可能会返回
None
(尽管默认安装的全局 OpenerDirector 使用 UnknownHandler 来确保这永远不会发生)。此外,如果检测到代理设置(例如,当设置了
http_proxy
等*_proxy
环境变量时),则默认安装 ProxyHandler 并且确保通过代理处理请求。2.6 版更改:添加了 timeout。
2.7.9 版本变更:添加了 cafile、capath、cadefault 和 context。
- urllib2.install_opener(opener)
- 安装一个 OpenerDirector 实例作为默认的全局开启器。 仅当您希望 urlopen 使用该开启器时才需要安装开启器; 否则,只需调用 OpenerDirector.open() 而不是 urlopen()。 代码不会检查真正的 OpenerDirector,任何具有适当接口的类都可以工作。
- urllib2.build_opener([handler, ...])
返回一个 OpenerDirector 实例,它按照给定的顺序链接处理程序。 handlers 可以是 BaseHandler 的实例,也可以是 BaseHandler 的子类(在这种情况下,必须可以不带任何参数调用构造函数)。 以下类的实例将位于 handlers 的前面,除非 handlers 包含它们、它们的实例或它们的子类:ProxyHandler(如果检测到代理设置)、UnknownHandler、HTTPHandler、HTTPDefaultErrorHandler、HTTPRedirectHandler、FTPHandler、[XFileHandler4X] 、HTTPErrorProcessor。
如果 Python 安装有 SSL 支持(即如果可以导入 ssl 模块),还会添加 HTTPSHandler。
从 Python 2.3 开始, BaseHandler 子类也可以更改其
handler_order
属性以修改其在处理程序列表中的位置。
会酌情引发以下异常:
- exception urllib2.URLError
- 处理程序在遇到问题时会引发此异常(或派生异常)。 它是
IOError
的子类。
- reason
- 这个错误的原因。 它可以是消息字符串或其他异常实例(socket.error 用于远程 URL,
OSError
用于本地 URL)。
- exception urllib2.HTTPError
尽管是一个异常(URLError 的子类),HTTPError 也可以作为一个非异常的类文件返回值(与 urlopen()[ X179X] 返回)。 这在处理奇异的 HTTP 错误时很有用,例如身份验证请求。
- code
RFC 2616 中定义的 HTTP 状态代码。 该数值对应于在 BaseHTTPServer.BaseHTTPRequestHandler.responses 中找到的代码字典中找到的值。
- reason
这个错误的原因。 它可以是消息字符串或其他异常实例。
提供以下类:
- class urllib2.Request(url[, data][, headers][, origin_req_host][, unverifiable])
这个类是一个 URL 请求的抽象。
url 应该是一个包含有效 URL 的字符串。
data 可以是一个字符串,指定要发送到服务器的附加数据,或者
None
如果不需要这样的数据。 目前 HTTP 请求是唯一使用 data 的请求; 当提供 data 参数时,HTTP 请求将是 POST 而不是 GET。 data 应该是标准 application/x-www-form-urlencoded 格式的缓冲区。 urllib.urlencode() 函数采用 2 元组的映射或序列,并返回此格式的字符串。headers 应该是一个字典,并将被视为 add_header() 被调用,每个键和值作为参数。 这通常用于“欺骗”
User-Agent
标头值,浏览器使用它来标识自己——一些 HTTP 服务器只允许来自普通浏览器的请求,而不是脚本。 例如,Mozilla Firefox 可能会将自己标识为"Mozilla/5.0 (X11; U; Linux i686) Gecko/20071127 Firefox/2.0.0.11"
,而 urllib2 的默认用户代理字符串是"Python-urllib/2.6"
(在 Python 2.6 上)。最后两个参数只对正确处理第三方 HTTP cookie 有用:
origin_req_host 应该是原始交易的请求主机,如 RFC 2965 所定义。 默认为
cookielib.request_host(self)
。 这是用户发起的原始请求的主机名或 IP 地址。 例如,如果请求是针对 HTML 文档中的图像,则这应该是对包含图像的页面的请求的请求主机。unverifiable 应指示请求是否不可验证,如 RFC 2965 所定义。 默认为
False
。 无法验证的请求是用户无法选择批准其 URL 的请求。 例如,如果请求是针对 HTML 文档中的图像,而用户没有选择批准自动获取图像的选项,则这应该是正确的。
- class urllib2.OpenerDirector
- OpenerDirector 类通过链接在一起的 BaseHandler 打开 URL。 它管理处理程序的链接以及从错误中恢复。
- class urllib2.BaseHandler
- 这是所有注册处理程序的基类——并且只处理简单的注册机制。
- class urllib2.HTTPDefaultErrorHandler
- 定义 HTTP 错误响应的默认处理程序的类; 所有响应都变成了 HTTPError 异常。
- class urllib2.HTTPRedirectHandler
- 处理重定向的类。
- class urllib2.HTTPCookieProcessor([cookiejar])
- 处理 HTTP Cookie 的类。
- class urllib2.ProxyHandler([proxies])
使请求通过代理。 如果给出 proxies,它必须是一个字典,将协议名称映射到代理的 URL。 默认是从环境变量
<protocol>_proxy
中读取代理列表。 如果没有设置代理环境变量,则在 Windows 环境中代理设置从注册表的 Internet 设置部分获取,而在 Mac OS X 环境中代理信息从 OS X 系统配置框架中检索。要禁用自动检测的代理,请传递一个空字典。
笔记
如果设置了变量
REQUEST_METHOD
,则HTTP_PROXY
将被忽略; 请参阅有关 getproxies() 的文档。
- class urllib2.HTTPPasswordMgr
- 保留
(realm, uri) -> (user, password)
映射的数据库。
- class urllib2.HTTPPasswordMgrWithDefaultRealm
- 保留
(realm, uri) -> (user, password)
映射的数据库。None
的领域被认为是一个包罗万象的领域,如果没有其他领域适合,就会搜索该领域。
- class urllib2.AbstractBasicAuthHandler([password_mgr])
- 这是一个混合类,有助于对远程主机和代理进行 HTTP 身份验证。 password_mgr,如果给出,应该是与 HTTPPasswordMgr 兼容的东西; 有关必须支持的接口的信息,请参阅部分 HTTPPasswordMgr 对象 。
- class urllib2.HTTPBasicAuthHandler([password_mgr])
- 处理与远程主机的身份验证。 password_mgr,如果给出,应该是与 HTTPPasswordMgr 兼容的东西; 有关必须支持的接口的信息,请参阅部分 HTTPPasswordMgr 对象 。
- class urllib2.ProxyBasicAuthHandler([password_mgr])
- 使用代理处理身份验证。 password_mgr,如果给出,应该是与 HTTPPasswordMgr 兼容的东西; 有关必须支持的接口的信息,请参阅部分 HTTPPasswordMgr 对象 。
- class urllib2.AbstractDigestAuthHandler([password_mgr])
- 这是一个混合类,有助于对远程主机和代理进行 HTTP 身份验证。 password_mgr,如果给出,应该是与 HTTPPasswordMgr 兼容的东西; 有关必须支持的接口的信息,请参阅部分 HTTPPasswordMgr 对象 。
- class urllib2.HTTPDigestAuthHandler([password_mgr])
- 处理与远程主机的身份验证。 password_mgr,如果给出,应该是与 HTTPPasswordMgr 兼容的东西; 有关必须支持的接口的信息,请参阅部分 HTTPPasswordMgr 对象 。
- class urllib2.ProxyDigestAuthHandler([password_mgr])
- 使用代理处理身份验证。 password_mgr,如果给出,应该是与 HTTPPasswordMgr 兼容的东西; 有关必须支持的接口的信息,请参阅部分 HTTPPasswordMgr 对象 。
- class urllib2.HTTPHandler
- 处理打开 HTTP URL 的类。
- class urllib2.HTTPSHandler([debuglevel[, context]])
处理打开 HTTPS URL 的类。 context 与 httplib.HTTPSConnection 的含义相同。
在 2.7.9 版更改:添加了 上下文 。
- class urllib2.FileHandler
- 打开本地文件。
- class urllib2.FTPHandler
- 打开 FTP URL。
- class urllib2.CacheFTPHandler
- 打开 FTP URL,保留打开的 FTP 连接的缓存以最大程度地减少延迟。
- class urllib2.UnknownHandler
- 处理未知 URL 的全能类。
- class urllib2.HTTPErrorProcessor
- 处理 HTTP 错误响应。
20.6.1. 请求对象
以下方法描述了 Request 的所有公共接口,因此必须在子类中重写所有方法。
- Request.add_data(data)
- 将 Request 数据设置为 data。 这被除 HTTP 处理程序之外的所有处理程序忽略——它应该是一个字节字符串,并将请求更改为
POST
而不是GET
。
- Request.get_method()
- 返回一个字符串,指示 HTTP 请求方法。 这仅对 HTTP 请求有意义,目前总是返回
'GET'
或'POST'
。
- Request.has_data()
- 返回实例是否有非
None
数据。
- Request.get_data()
- 返回实例的数据。
- Request.add_header(key, val)
- 向请求添加另一个标头。 当前,除 HTTP 处理程序之外的所有处理程序都忽略标头,将它们添加到发送到服务器的标头列表中。 注意同名的header不能超过一个,如果key冲突,后面的调用会覆盖之前的调用。 目前,这并没有丢失 HTTP 功能,因为所有在多次使用时有意义的标头都有一种(标头特定的)方式来仅使用一个标头获得相同的功能。
- Request.add_unredirected_header(key, header)
添加不会添加到重定向请求的标头。
2.4 版中的新功能。
- Request.has_header(header)
返回实例是否具有命名标头(检查常规和未重定向)。
2.4 版中的新功能。
- Request.get_full_url()
- 返回构造函数中给出的 URL。
- Request.get_type()
- 返回 URL 的类型——也称为方案。
- Request.get_host()
- 返回将建立连接的主机。
- Request.get_selector()
- 返回选择器——发送到服务器的 URL 部分。
- Request.get_header(header_name, default=None)
- 返回给定标头的值。 如果标题不存在,则返回默认值。
- Request.header_items()
- 返回请求标头的元组列表 (header_name, header_value)。
- Request.set_proxy(host, type)
- 通过连接到代理服务器来准备请求。 host 和 type 将替换实例的那些,并且实例的选择器将是构造函数中给出的原始 URL。
- Request.is_unverifiable()
- 返回请求是否不可验证,如 RFC 2965 所定义。 请参阅 Request 构造函数的文档。
20.6.2. OpenerDirector 对象
OpenerDirector 实例有以下方法:
- OpenerDirector.add_handler(handler)
- handler 应该是 BaseHandler 的一个实例。 搜索以下方法,并将其添加到可能的链中(注意 HTTP 错误是一种特殊情况)。
protocol_open
— 表示处理程序知道如何打开 协议 URL。http_error_type
— 表示处理程序知道如何处理 HTTP 错误代码为 type 的 HTTP 错误。protocol_error
— 表示处理程序知道如何处理来自(非http
)协议的错误。protocol_request
— 表示处理程序知道如何预处理 协议 请求。protocol_response
— 表示处理程序知道如何对 协议 响应进行后处理。
- OpenerDirector.open(url[, data][, timeout])
打开给定的 url(可以是请求对象或字符串),可选择传递给定的 data。 参数、返回值和引发的异常与 urlopen() 相同(它只是在当前安装的全局 OpenerDirector 上调用 open() 方法) . 可选的 timeout 参数指定阻塞操作(如连接尝试)的超时(以秒为单位)(如果未指定,将使用全局默认超时设置)。 超时功能实际上仅适用于 HTTP、HTTPS 和 FTP 连接)。
2.6 版更改:添加了 timeout。
- OpenerDirector.error(proto[, arg[, ...]])
处理给定协议的错误。 这将使用给定的参数(特定于协议)调用给定协议的注册错误处理程序。 HTTP 协议是一种特殊情况,它使用 HTTP 响应代码来确定具体的错误处理程序; 请参阅处理程序类的
http_error_*()
方法。返回值和引发的异常与 urlopen() 的相同。
OpenerDirector 对象分三个阶段打开 URL:
在每个阶段中调用这些方法的顺序是通过对处理程序实例进行排序来确定的。
每个具有名为
protocol_request
的方法的处理程序都会调用该方法来预处理请求。调用具有类似
protocol_open
方法的处理程序来处理请求。 当处理程序返回非 None 值(即 响应),或引发异常(通常为 URLError)。 允许异常传播。实际上,上述算法首先是针对名为
default_open()
的方法进行尝试的。 如果所有这些方法都返回 None,则对命名为protocol_open
之类的方法重复该算法。 如果所有这些方法都返回 None,则对名为unknown_open()
的方法重复该算法。请注意,这些方法的实现可能涉及调用父 OpenerDirector 实例的 open() 和 error() 方法。
每个具有名为
protocol_response
的方法的处理程序都会调用该方法来对响应进行后处理。
20.6.3. BaseHandler 对象
BaseHandler 对象提供了一些直接有用的方法,以及其他供派生类使用的方法。 这些旨在直接使用:
- BaseHandler.add_parent(director)
- 添加导演作为父级。
- BaseHandler.close()
- 删除所有父项。
以下属性和方法只能由从 BaseHandler 派生的类使用。
笔记
已采用的约定是将定义 protocol_request()
或 protocol_response()
方法的子类命名为 *Processor
; 所有其他的都被命名为 *Handler
。
- BaseHandler.parent
- 有效的 OpenerDirector,可用于使用不同的协议打开或处理错误。
- BaseHandler.default_open(req)
这个方法是BaseHandler中定义的而不是,但是子类如果想要捕获所有的URL就应该定义它。
这个方法,如果实现了,会被父级 OpenerDirector 调用。 它应该返回一个类似文件的对象,如 OpenerDirector 或
None
的 open() 的返回值中所述。 它应该引发 URLError,除非发生真正异常的事情(例如,MemoryError
不应映射到 URLError)。此方法将在任何特定于协议的 open 方法之前调用。
- BaseHandler.protocol_open(req)
(“协议”将被协议名称替换。)
这个方法是BaseHandler中定义的而不是,但是如果子类想要使用给定的协议处理URL,他们应该定义它。
此方法,如果定义,将被父 OpenerDirector 调用。 返回值应与 default_open() 相同。
- BaseHandler.unknown_open(req)
这个方法是BaseHandler中定义的而不是,但是如果子类想要捕获所有没有特定注册处理程序的URL来打开它,就应该定义它。
这个方法,如果实现了,会被 parent OpenerDirector 调用。 返回值应与 default_open() 相同。
- BaseHandler.http_error_default(req, fp, code, msg, hdrs)
这个方法是 BaseHandler 中定义的 不是 ,但是如果子类打算为其他未处理的 HTTP 错误提供一个包罗万象的方法,它们应该覆盖它。 OpenerDirector 报错时会自动调用,其他情况下一般不会调用。
req 将是一个 Request 对象,fp 将是一个带有 HTTP 错误正文的类文件对象,code 将是三个- 错误的数字代码,msg 将是用户可见的代码解释,hdrs 将是一个带有错误标题的映射对象。
返回值和引发的异常应该与 urlopen() 的相同。
- BaseHandler.http_error_nnn(req, fp, code, msg, hdrs)
nnn 应该是一个三位数的 HTTP 错误代码。 此方法也未在 BaseHandler 中定义,但会在发生代码为 nnn 的 HTTP 错误时在子类的实例上调用(如果存在)。
子类应覆盖此方法以处理特定的 HTTP 错误。
引发的参数、返回值和异常应与 http_error_default() 相同。
- BaseHandler.protocol_request(req)
(“协议”将被协议名称替换。)
这个方法是BaseHandler中定义的而不是,但是子类如果想要预处理给定的协议的请求,应该定义它。
此方法,如果定义,将被父 OpenerDirector 调用。 req 将是一个 Request 对象。 返回值应该是一个 Request 对象。
- BaseHandler.protocol_response(req, response)
(“协议”将被协议名称替换。)
这个方法是BaseHandler中定义的而不是,但是如果子类想要对给定的协议的响应进行后处理,他们应该定义它。
此方法,如果定义,将被父 OpenerDirector 调用。 req 将是一个 Request 对象。 response 将是一个实现与 urlopen() 的返回值相同接口的对象。 返回值应实现与 urlopen() 的返回值相同的接口。
20.6.4. HTTPRedirectHandler 对象
- HTTPRedirectHandler.redirect_request(req, fp, code, msg, hdrs, newurl)
返回 Request 或
None
以响应重定向。 当从服务器收到重定向时,http_error_30*()
方法的默认实现会调用它。 如果应该发生重定向,返回一个新的 Request 以允许http_error_30*()
执行重定向到 newurl。 否则,如果没有其他处理程序应该尝试处理此 URL,则引发 HTTPError,如果您不能但另一个处理程序可能会尝试处理,则返回None
。笔记
此方法的默认实现并没有严格遵循 RFC 2616,其中规定对
POST
请求的 301 和 302 响应不得在未经用户确认的情况下自动重定向. 实际上,浏览器确实允许自动重定向这些响应,将 POST 更改为GET
,并且默认实现重现了这种行为。
- HTTPRedirectHandler.http_error_301(req, fp, code, msg, hdrs)
- 重定向到
Location:
或URI:
URL。 当获得 HTTP '永久移动' 响应时,此方法由父 OpenerDirector 调用。
- HTTPRedirectHandler.http_error_302(req, fp, code, msg, hdrs)
- 与 http_error_301() 相同,但调用“找到”响应。
- HTTPRedirectHandler.http_error_303(req, fp, code, msg, hdrs)
- 与 http_error_301() 相同,但调用“查看其他”响应。
- HTTPRedirectHandler.http_error_307(req, fp, code, msg, hdrs)
- 与 http_error_301() 相同,但调用“临时重定向”响应。
20.6.6. ProxyHandler 对象
- ProxyHandler.protocol_open(request)
(“协议”将被协议名称替换。)
ProxyHandler 将有一个方法
protocol_open
用于每个 protocol,它在构造函数中给出的 proxies 字典中有一个代理。 该方法将修改请求通过代理,通过调用request.set_proxy()
,并调用链中的下一个处理程序来实际执行协议。
20.6.7. HTTPPasswordMgr 对象
这些方法在 HTTPPasswordMgr 和 HTTPPasswordMgrWithDefaultRealm 对象上可用。
- HTTPPasswordMgr.add_password(realm, uri, user, passwd)
- uri 可以是单个 URI,也可以是一个 URI 序列。 realm、user 和 passwd 必须是字符串。 这会导致
(user, passwd)
在 realm 的身份验证和任何给定 URI 的超级 URI 被给定时用作身份验证令牌。
- HTTPPasswordMgr.find_user_password(realm, authuri)
获取给定领域和 URI 的用户/密码(如果有)。 如果没有匹配的用户/密码,此方法将返回
(None, None)
。对于 HTTPPasswordMgrWithDefaultRealm 对象,如果给定的 realm 没有匹配的用户/密码,将搜索领域
None
。
20.6.8. AbstractBasicAuthHandler 对象
- AbstractBasicAuthHandler.http_error_auth_reqed(authreq, host, req, headers)
通过获取用户/密码对并重新尝试请求来处理身份验证请求。 authreq 应该是请求中包含有关领域信息的标头的名称,host 指定要验证的 URL 和路径,req 应该是(失败的) Request 对象,而 headers 应该是错误标头。
host 要么是一个权限(例如
"python.org"
) 或包含授权组件的 URL(例如"http://python.org/%22
)。 在任何一种情况下,权限都不能包含用户信息组件(因此,"python.org"
和"python.org:80"
可以,"joe:password@python.org"
不是)。
20.6.9. HTTPBasicAuthHandler 对象
- HTTPBasicAuthHandler.http_error_401(req, fp, code, msg, hdrs)
- 如果可用,请使用身份验证信息重试请求。
20.6.10。 ProxyBasicAuthHandler 对象
- ProxyBasicAuthHandler.http_error_407(req, fp, code, msg, hdrs)
- 如果可用,请使用身份验证信息重试请求。
20.6.11。 AbstractDigestAuthHandler 对象
- AbstractDigestAuthHandler.http_error_auth_reqed(authreq, host, req, headers)
- authreq 应该是请求中包含有关领域信息的标头的名称,host 应该是要验证的主机,req 应该是(失败的) Request 对象和 headers 应该是错误标头。
20.6.12。 HTTPDigestAuthHandler 对象
- HTTPDigestAuthHandler.http_error_401(req, fp, code, msg, hdrs)
- 如果可用,请使用身份验证信息重试请求。
20.6.13。 ProxyDigestAuthHandler 对象
- ProxyDigestAuthHandler.http_error_407(req, fp, code, msg, hdrs)
- 如果可用,请使用身份验证信息重试请求。
20.6.14。 HTTPHandler 对象
- HTTPHandler.http_open(req)
- 发送 HTTP 请求,可以是 GET 或 POST,具体取决于
req.has_data()
。
20.6.15。 HTTPSHandler 对象
- HTTPSHandler.https_open(req)
- 发送 HTTPS 请求,可以是 GET 或 POST,具体取决于
req.has_data()
。
20.6.16。 文件处理器对象
- FileHandler.file_open(req)
- 在本地打开文件,如果没有主机名,或者主机名是
'localhost'
。 否则将协议更改为ftp
,然后使用parent
重试打开它。
20.6.17。 FTPHandler 对象
- FTPHandler.ftp_open(req)
- 打开req指示的FTP文件。 登录总是使用空的用户名和密码完成。
20.6.18. CacheFTPHandler 对象
CacheFTPHandler 对象是具有以下附加方法的 FTPHandler 对象:
- CacheFTPHandler.setTimeout(t)
- 将连接超时设置为 t 秒。
- CacheFTPHandler.setMaxConns(m)
- 将最大缓存连接数设置为 m。
20.6.20。 HTTPErrorProcessor 对象
2.4 版中的新功能。
- HTTPErrorProcessor.http_response()
处理 HTTP 错误响应。
对于 200 个错误代码,立即返回响应对象。
对于非 200 错误代码,这只是通过 OpenerDirector.error() 将作业传递给
protocol_error_code
处理程序方法。 最终,如果没有其他处理程序处理错误, urllib2.HTTPDefaultErrorHandler 将引发 HTTPError。
- HTTPErrorProcessor.https_response()
处理 HTTPS 错误响应。
行为与 http_response() 相同。
20.6.21。 例子
除了下面的例子,更多例子在HOWTO Fetch Internet Resources Using urllib2中给出。
此示例获取 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 的标准输入并读取它返回给我们的数据。 请注意,此示例仅在 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() 默认提供了许多处理程序,包括 ProxyHandler。 默认情况下,ProxyHandler 使用名为 <scheme>_proxy
的环境变量,其中 <scheme>
是所涉及的 URL 方案。 例如,读取 http_proxy
环境变量以获取 HTTP 代理的 URL。
此示例将默认的 ProxyHandler 替换为使用以编程方式提供的代理 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')
添加 HTTP 标头:
将 headers 参数用于 Request 构造函数,或:
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 标头。 要改变这一点:
import urllib2
opener = urllib2.build_opener()
opener.addheaders = [('User-agent', 'Mozilla/5.0')]
opener.open('http://www.example.com/')
另外,请记住在传递 Request 时添加了一些标准标头(Content-Length、Content-Type 和 Host)到 urlopen()(或 OpenerDirector.open())。