urllib2
urllib2 — extensible library for opening URLs
注意
这个urllib2
模块已经被Python 3中的几个模块命名为urllib.request
和urllib.error
。将源代码转换为Python 3时,2to3工具将自动适应导入。
该urllib2
模块定义了帮助在复杂世界中打开URL(主要是HTTP)的函数和类 - 基本和摘要式身份验证,重定向,cookie等等。
该urllib2
模块定义了以下功能:
urllib2.urlopen(url[, data[, timeout[, cafile[, capath[, cadefault[, context]]]]])
打开URL url
,它可以是一个字符串,也可以是一个Request
对象。
数据
可以是指定发送到服务器的附加数据的
字符串,或者None
如果不需要这样的数据
。目前HTTP请求是唯一使用数据的
请求; 当提供数据
参数时,HTTP请求将成为POST而不是GET 。数据
应该是标准应用程序/ x-www-form-urlencoded
格式的缓冲区。该urllib.urlencode()
函数采用2元组的映射或序列,并以此格式返回字符串。urllib2模块发送包含Connection:close
头文件的HTTP / 1.1请求。
可选的timeout
参数指定阻止诸如连接尝试(如果未指定,将使用全局默认超时设置)等操作的超时(以秒为单位)。这实际上只适用于HTTP,HTTPS和FTP连接。
如果指定了上下文
,则它必须是ssl.SSLContext
描述各种SSL选项的实例。查看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
来确保永远不会发生这种情况)。
另外,如果检测到代理设置(例如,当设置了*_proxy
类似环境变量时http_proxy
),ProxyHandler
则默认安装并确保通过代理处理请求。
在版本2.6中更改:添加了超时
。
在版本2.7.9中进行了更改:添加了cafile
,capath
,cadefault
和context
。
urllib2.install_opener(opener)
安装一个OpenerDirector
实例作为默认的全局开启器。如果你想让urlopen使用那个开罐器,只需要安装一个开罐器; 否则,简单地调用OpenerDirector.open()
代替urlopen()
。代码不检查真实的OpenerDirector
,任何具有合适接口的类都可以工作。
urllib2.build_opener([handler, ...])
返回一个OpenerDirector
实例,按照给定的顺序链接处理程序。_handler_s既可以是实例,也可以是BaseHandler
子类BaseHandler
(在这种情况下,必须可以在不带任何参数的情况下调用构造函数)。以下类的实例将在_handler_s的前面,除非_handler_s包含它们,它们的实例或子类其中:ProxyHandler
(如果检测到代理设置), ,UnknownHandler
,HTTPHandler
,HTTPDefaultErrorHandler
,HTTPRedirectHandler
,FTPHandler
,。FileHandlerHTTPErrorProcessor
如果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()
)。这在处理异常的HTTP错误时很有用,例如验证请求。
code
RFC 2616中定义的HTTP状态代码。此数值对应于在中找到的代码字典中找到的值BaseHTTPServer.BaseHTTPRequestHandler.responses
。
reason
这个错误的原因。它可以是一个消息字符串或另一个异常实例。
提供以下课程:
class urllib2.Request(url[, data][, headers][, origin_req_host][, unverifiable])
这个类是一个URL请求的抽象。
网址
应该是包含有效网址
的字符串。
数据
可以是指定发送到服务器的附加数据的
字符串,或者None
如果不需要这样的数据
。目前HTTP请求是唯一使用数据的
请求; 当提供数据
参数时,HTTP请求将成为POST而不是GET 。数据
应该是标准应用程序/ x-www-form-urlencoded
格式的缓冲区。该urllib.urlencode()
函数采用2元组的映射或序列,并以此格式返回字符串。
标题
应该是一个字典,并将被视为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 cookies感兴趣:
origin_req_host
应该是RFC 2965
定义的源事务的请求主机。它默认为cookielib.request_host(self)
。这是用户发起的原始请求的主机名或IP地址。例如,如果请求是针对HTML文档中的图像的,则该请求应该是包含图像的页面请求的请求主机。
无法验证
应该表明请求是否无法验证
,如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])
导致请求通过代理。如果提供了代理服务器,它必须是一个字典映射协议名称到代理服务器的URL。缺省值是从环境变量中读取代理列表<protocol>_proxy。如果未设置代理环境变量,则在Windows环境中,代理设置可从注册表的“Internet设置”部分获得,而在Mac OS X环境中,将从OS X系统配置框架中检索代理信息。
禁用自动检测代理传递空字典。
注意
HTTP_PROXY
如果REQUEST_METHOD
设置了变量,将被忽略; 请参阅文档getproxies()
。
class urllib2.HTTPPasswordMgr
保持(realm, uri) -> (user, password)映射数据库。
class urllib2.HTTPPasswordMgrWithDefaultRealm
保持(realm, uri) -> (user, password)映射数据库。一个领域None被认为是一个全面的领域,如果没有其他领域适合,就会搜索这个领域。
class urllib2.AbstractBasicAuthHandler([password_mgr])
这是一个mixin类,可以帮助远程主机和代理进行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])
这是一个mixin类,可以帮助远程主机和代理进行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打开的类。上下文
的含义与上述相同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错误响应。
1.请求对象
以下方法描述了所有Request
的公共接口,所以必须在子类中覆盖所有接口。
Request.add_data(data)
将Request
数据
设置为数据
。除HTTP处理程序之外,所有处理程序都会忽略它 - 并且它应该是一个字节字符串,并且会将请求更改为POST
不是GET
。
Request.get_method()
返回一个指示HTTP请求方法的字符串。这只对HTTP请求有意义,目前总是返回'GET'
或'POST'
。
Request.has_data()
返回实例是否有非None
数据。
Request.get_data()
返回实例的数据。
Request.add_header(key, val)
向请求添加另一个标头。除了HTTP处理程序之外,所有处理程序都会忽略标题,并将它们添加到发送到服务器的标题列表中。请注意,不能有多个具有相同名称的标题,并且以后的调用将覆盖以前的调用,以防万一键发生
冲突。目前,这并不是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)
通过连接到代理服务器来准备请求。该主机
和类型
将取代这些实例,并且该实例的选择将是在构造函数中给出的原始URL。
Request.get_origin_req_host()
按照RFC 2965的
规定,返回原始事务的请求主机。请参阅Request
构造函数的文档。
Request.is_unverifiable()
根据RFC 2965的规定,返回请求是否无法验证。请参阅Request
构造函数的文档。
2. OpenerDirector对象
OpenerDirector
实例具有以下方法:
OpenerDirector.add_handler(handler)
处理程序
应该是一个实例BaseHandler
。搜索以下方法并添加到可能的链中(请注意,HTTP错误是一种特殊情况)。
protocol_open
- 表示处理程序知道如何打开协议
URL。
http_error_type
- 表示处理程序知道如何使用HTTP错误代码类型
处理HTTP错误。
protocol_error
- 表示处理程序知道如何处理来自(非http
)协议的
错误。
protocol_request
- 表示处理程序知道如何预处理协议
请求。
protocol_response
- 表示处理程序知道如何后处理协议
响应。
OpenerDirector.open(url[, data][, timeout])
打开给定的URL
(可以是请求对象或字符串),可以传递给定的数据
。引发的参数,返回值和异常与那些urlopen()
(它只是open()
在当前安装的全局中调用方法OpenerDirector
)相同。可选的timeout
参数指定阻止诸如连接尝试(如果未指定,将使用全局默认超时设置)等操作的超时(以秒为单位)。超时功能实际上仅适用于HTTP,HTTPS和FTP连接)。
在版本2.6中更改:添加了超时
。
OpenerDirector.error(proto[, arg[, ...]])
处理给定协议的错误。这将使用给定的参数(特定于协议)调用给定协议的注册错误处理程序。HTTP协议是一种特殊情况,它使用HTTP响应代码来确定特定的错误处理程序; 请参阅http_error_*()
处理程序类的方法。
所引发的返回值和异常与那些返回值和异常相同urlopen()
。
OpenerDirector对象分三个阶段打开URL:
在每个阶段中调用这些方法的顺序是通过对处理程序实例进行排序来确定的。
- 每个使用类似方法的处理程序都会调用该方法来预处理请求。
protocol_request
- 调用名为like的方法来处理请求。当处理程序返回非值(即响应)或引发异常(通常)时,此阶段结束。允许异常传播。
protocol_openNoneURLError
实际上,上述算法首先被尝试用于名为的方法default_open()
。如果所有这些方法都返回None
,则对于名为like的方法重复该算法。如果所有这些方法都返回,则对于名为的方法重复该算法。protocol_openNoneunknown_open()
请注意,这些方法的实现可能涉及调用父OpenerDirector
实例open()
和error()
方法。
- 每个使用类似方法的处理程序都会调用该方法来后处理响应。
protocol_response
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
。它应该返回一个类似于文件的对象,如open()
of OpenerDirector
或者返回值中所述None
。它应该提高URLError
,除非发生真正的例外事件(例如,MemoryError
不应映射到URLError
)。
此方法将在任何协议特定的打开方法之前调用。
BaseHandler.protocol_open(req)
(“协议”将被协议名称替换。)
这个方法没有
被定义BaseHandler
,但是如果他们想要使用给定的协议
处理URL,子类应该定义它。
该方法(如果已定义)将由父级调用OpenerDirector
。返回值应该与for相同default_open()
。
BaseHandler.unknown_open(req)
这个方法没有
定义BaseHandler
,但是子类应该定义它,如果他们想捕获所有没有
特定注册处理器的URL来打开它。
这个方法如果被实现的话,将会被调用parent
OpenerDirector
。返回值应该与for相同default_open()
。
BaseHandler.http_error_default(req, fp, code, msg, hdrs)
这个方法没有
在中定义BaseHandler
,但是如果它们打算提供一个捕获所有其他未处理的HTTP错误的子类,它应该覆盖它。它会被OpenerDirector
错误自动调用,通常不会在其他情况下调用。
req
将是一个Request
对象,fp
将是一个带有HTTP错误体的文件类对象,代码
将是错误的三位代码
,msg
将是代码
的用户可见解释,而hdrs
将是一个映射对象与错误的标题。
返回的值和异常应该与那些相同urlopen()
。
BaseHandler.http_error_nnn(req, fp, code, msg, hdrs)
nnn
应该是一个三位数的HTTP错误代码。这个方法也没有被定义BaseHandler
,但是如果它存在的话,在一个子类的一个实例上,当代码为nnn
的HTTP错误发生时,它将被调用。
子类应该重写此方法来处理特定的HTTP错误。
提出的参数,返回值和异常应该与for相同http_error_default()
。
BaseHandler.protocol_request(req)
(“协议”将被协议名称替换。)
这个方法没有
在中定义BaseHandler
,但是如果他们想要预处理给定协议的
请求,子类就应该定义它。
该方法(如果已定义)将由父级调用OpenerDirector
。请求
将成为一个Request
对象。返回值应该是一个Request
对象。
BaseHandler.protocol_response(req, response)
(“协议”将被协议名称替换。)
这个方法没有
在中定义BaseHandler
,但是如果子类想要后处理给定协议的
响应,子类就应该定义它。
该方法(如果已定义)将由父级调用OpenerDirector
。请求
将成为一个Request
对象。响应
将是一个实现与返回值相同的接口的对象urlopen()
。返回值应该实现与返回值相同的接口urlopen()
。
HTTPRedirectHandler对象
注意
某些HTTP重定向需要来自此模块的客户端代码的操作。如果是这样的话,HTTPError
就提出来了。有关各种重定向代码的准确含义的详细信息,请参阅RFC 2616
。
HTTPRedirectHandler.redirect_request(req, fp, code, msg, hdrs, newurl)
返回Request
或None
响应重定向。http_error_30*()
当从服务器收到重定向时,这由方法的默认实现调用。如果应该发生重定向,则返回一个新的Request
以允许http_error_30*()
执行重定向到newurl
。否则,HTTPError
如果没有其他处理程序尝试处理此URL,则返回,或者None
如果您不能,则返回另一个处理程序。
注意
此方法的默认实现并不严格遵循RFC 2616
,该规范规定
,对于POST
请求的301和302响应不得在用户未经确认的情况下自动重定向。实际上,浏览器确实允许自动重定向这些响应,将POST
更改为a GET
,并且默认实现会重现此行为。
HTTPRedirectHandler.http_error_301(req, fp, code, msg, hdrs)
重定向到Location:
或URI:
网址。OpenerDirector
当获得HTTP“永久移动”响应时,父级调用此方法。
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()
,但呼吁“临时重定向”响应。
5. HTTPCookieProcessor对象
2.4版本中的新功能。
HTTPCookieProcessor
实例有一个属性:
HTTPCookieProcessor.cookiejar
在cookielib.CookieJar
其中存储Cookie。
6. ProxyHandler对象
ProxyHandler.protocol_open(request)
(“协议”将被协议名称替换。)
对于在构造函数中给出的代理
字典中具有代理
的每个协议
,ProxyHandler
都会有一个方法。该方法将通过调用修改通过代理
的请求,并调用链中的下一个处理程序以实际执行协议
。protocol_openrequest.set_proxy()
7. HTTPPasswordMgr对象
这些方法可用于HTTPPasswordMgr
和HTTPPasswordMgrWithDefaultRealm
对象。
HTTPPasswordMgr.add_password(realm, uri, user, passwd)
uri
可以是单个URI,也可以是一系列URI。realm
,user
和passwd
必须是字符串。(user, passwd)
当给定领域的
认证和给定URI的任何给定的超级URI时,这导致用作认证令牌。
HTTPPasswordMgr.find_user_password(realm, authuri)
获取给定领域和URI的用户/密码(如果有的话)。(None, None)
如果没有匹配的用户/密码,此方法将返回。
对于HTTPPasswordMgrWithDefaultRealm
对象,None
如果给定的领域
没有匹配的用户/密码,则搜索领域
。
8. AbstractBasicAuthHandler对象
AbstractBasicAuthHandler.http_error_auth_reqed(authreq, host, req, headers)
通过获取用户/密码对来处理认证请求,然后重新尝试请求。authreq
应该是请求中包含有关域的信息的头
的名称,host
指定要认证的URL和路径,req
应该是(失败的)Request
对象,并且头
应该是错误头
。
主机
是权威(例如"python.org"
)或包含权威组件(例如"http://python.org/"
)的URL 。在任一情况下,权限不能包含userinfo的组分(所以,"python.org"
和"python.org:80"
都很好,"joe:password@python.org"
是不是)。
9. HTTPBasicAuthHandler对象
HTTPBasicAuthHandler.http_error_401(req, fp, code, msg, hdrs)
如果可用,请重新尝试带有认证信息的请求。
10. ProxyBasicAuthHandler对象
ProxyBasicAuthHandler.http_error_407(req, fp, code, msg, hdrs)
如果可用,请重新尝试带有认证信息的请求。
11. AbstractDigestAuthHandler对象
AbstractDigestAuthHandler.http_error_auth_reqed(authreq, host, req, headers)
authreq
应该是包含在请求中的关于域的信息的头部
的名称,主机
应该是要认证的主机
,req
应该是(失败的)Request
对象,并且头部
应该是错误头部
。
12. HTTPDigestAuthHandler对象
HTTPDigestAuthHandler.http_error_401(req, fp, code, msg, hdrs)
如果可用,请重新尝试带有认证信息的请求。
13. ProxyDigestAuthHandler对象
ProxyDigestAuthHandler.http_error_407(req, fp, code, msg, hdrs)
如果可用,请重新尝试带有认证信息的请求。
14. HTTPHandler对象
HTTPHandler.http_open(req)
发送HTTP请求,可以是GET或POST,具体取决于req.has_data()
。
15. HTTPSHandler对象
HTTPSHandler.https_open(req)
发送HTTPS请求,可以是GET或POST,具体取决于req.has_data()
。
16. FileHandler对象
FileHandler.file_open(req)
如果没有主机名或主机名是本地打开文件'localhost'
。将协议更改为ftp
其他方式,然后重试使用parent
。
17. FTPHandler对象
FTPHandler.ftp_open(req)
打开req
指示的FTP文件。登录始终使用空的用户名和密码完成。
18. CacheFTPHandler对象
CacheFTPHandler
对象是FTPHandler
具有以下附加方法的对象:
CacheFTPHandler.setTimeout(t)
将连接超时设置为t
秒。
CacheFTPHandler.setMaxConns(m)
将最大数量的缓存连接设置为m
。
19. UnknownHandler对象
UnknownHandler.unknown_open()
引发URLError
异常。
20. HTTPErrorProcessor对象
2.4版本中的新功能。
HTTPErrorProcessor.http_response()
处理HTTP错误响应。
对于200个错误代码,响应对象立即返回。
对于非200错误代码,这只是将作业传递给处理程序方法。最终,如果没有其他处理程序处理该错误,则会引发一次。protocol_error_codeOpenerDirector.error()urllib2.HTTPDefaultErrorHandlerHTTPError
HTTPErrorProcessor.https_response()
处理HTTPS错误响应。
行为与之相同http_response()
。
21.例子
除了下面的例子,HOWTO使用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的stdin发送数据流并读取它返回给我们的数据。请注意,此示例仅在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()提供了许多默认的处理程序,包括a 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
自动为每个用户
添加一个User-Agent
头Request
。要改变这一点:
import urllib2
opener = urllib2.build_opener()
opener.addheaders = [('User-agent', 'Mozilla/5.0')]
opener.open('http://www.example.com/')
另外,请记住,传递给(或)时会添加一些标准标题(Content-Length
,Content-Type
和Host
)。Requesturlopen()OpenerDirector.open()