– 用于打开URL的可扩展库 – Internet协议和支持(Python教程)(参考资料)
urllib.request
– 用于打开URL的可扩展库
源代码: Lib / urllib / request.py
urllib.request
模块定义了有助于在复杂世界中打开URL(主要是HTTP)的函数和类 – 基本和摘要式身份验证,重定向,cookie等等.
也可以看看
推荐使用Requests包用于更高级别的HTTP客户端界面.
urllib.request
模块定义了以下功能:
urllib.request.
urlopen
(url, data=None, [timeout, ] *, cafile=None, capath=None, cadefault=False, context=None)-
打开网址url,可以是字符串或
Request
对象.data必须是指定要发送到服务器的附加数据的对象,或者
None
如果不需要这样的数据。详见Request
urllib.request模块使用HTTP / 1.1并包含
Connection:close
HTTP请求中的标题.可选timeout参数指定阻塞操作(例如连接尝试)的超时(以秒为单位)(如果未指定,将使用全局默认超时设置)。这实际上只适用于HTTP,HTTPS和FTP连接.
如果context如果指定,它必须是
ssl.SSLContext
实例描述各种SSL选项。有关详细信息,请参阅HTTPSConnection
.可选的cafile和capath参数为HTTPS请求指定一组trustedCA证书。cafile应指向包含CA证书包的单个文件,而capath应指向散列证书文件的目录。更多信息可以在
ssl.SSLContext.load_verify_locations()
.找到cadefault参数被忽略.
这个函数总是返回一个可以作为上下文管理器的对象并且有
geturl()
等方法 – 返回检索到的资源的URL,常用于确定是否遵循重定向info()
– 返回页面的元信息,如标题,以email.message_from_string()
实例的形式(参见HTTP标题的快速参考)getcode()
– 返回响应的HTTP状态代码.
对于HTTP和HTTPS URL,这个函数返回
http.client.HTTPResponse
对象略有修改。除了上面的三个新方法之外,msg属性包含相同的信息作为reason
属性 – 服务器返回的原因短语 – 而不是响应头,因为它在HTTPResponse
.的文档中指定由遗产
URLopener
和FancyURLopener
类显式处理的FTP,文件和数据URL和请求,这个函数返回urllib.response.addinfourl
object.Raises
URLError
在协议错误上注意如果没有处理程序处理请求,可能会返回
None
(以为默认安装全局OpenerDirector
使用UnknownHandler
来确保这一点从来没有发生过.另外,如果检测到代理设置(例如,当设置
*_proxy
环境变量如http_proxy
时),ProxyHandler
是默认安装并确保请求是通过代理处理的.来自Python 2.6及更早版本的遗留
urllib.urlopen
功能已经完成;urllib.request.urlopen()
对应旧urllib2.urlopen
。代理处理,通过将字典参数传递给urllib.urlopen
,可以通过使用ProxyHandler
对象来获得在版本3.2:cafile和capath中加入
在版本3.2中更改:现在支持HTTPS虚拟主机(如果
ssl.HAS_SNI
为真).版本3.2中的新功能:data可以是一个可迭代的对象.
在版本3.3中更改:cadefault已添加.
在版本3.4.3中更改:context已添加.
自版本3.6:cafile, capath和cadefault以来已弃用而不赞成使用context。请改用
ssl.SSLContext.load_cert_chain()
,或者让ssl.create_default_context()
为您选择系统的可信任CA证书.
urllib.request.
install_opener
(opener)-
安装
OpenerDirector
instance作为默认的全局opener。如果你想让urlopen使用那个opener,只需要安装一个opener。否则,只需拨打OpenerDirector.open()
而不是urlopen()
。代码没有检查真实的OpenerDirector
,任何具有适当界面的课程都会工作.
urllib.request.
build_opener
( [handler, …])-
返回
OpenerDirector
实例,它按照给定的顺序链接处理程序。handler s可以是BaseHandler
,子的子类BaseHandler
(在这种情况下,必须可以在没有任何参数的情况下调用构造函数)。以下课程的实例将在handlers,除非handler包含它们,它们的实例或它们的子类:ProxyHandler
(如果检测到代理设置),UnknownHandler
,HTTPHandler
,HTTPDefaultErrorHandler
,HTTPRedirectHandler
,FTPHandler
,FileHandler
,HTTPErrorProcessor
.如果Python安装有SSL支持(即,如果
ssl
modulecan进口),HTTPSHandler
也将被添加.A
BaseHandler
子类也可以改变其handler_order
属性来修改它在处理程序列表中的位置.
urllib.request.
pathname2url
(path)-
转换路径名path从路径的本地语法到URL的路径组件中使用的表单。这不会产生完整的URL。使用
quote()
功能
urllib.request.
url2pathname
//(path)-
将路径组件path从百分比编码的URL转换为apath的本地语法。这不接受完整的URL。这个函数使用
unquote()
解码path.
urllib.request.
getproxies
()-
此帮助程序函数返回代理服务器URL映射的方案字典。它会在环境中扫描名为
<scheme>_proxy
,在不区分大小写的方法中,首先针对所有操作系统,当它无法找到它时,从Mac OSX SystemConfiguration for Mac OS X和Windows Systems Registry for Windows中查找代理信息。如果存在小写和大写环境变量(并且不同意),小写是首选.注意
如果设置了环境变量
REQUEST_METHOD
,通常表明你的脚本在CGI环境中运行,那么环境变量HTTP_PROXY
(大写_PROXY
)将被忽略。这是因为该变量可以由客户端使用“Proxy:”HTTPheader注入。如果需要在CGI环境中使用HTTP代理,请使用ProxyHandler
明确地,或确保变量名称是inlowercase(或至少是_proxy
后缀).
提供以下类:
- class
urllib.request.
Request
(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None) -
这个类是URL请求的抽象.
url应该是一个包含有效URL的字符串.
data必须是指定要发送到服务器的其他数据的对象,否则
None
如果不需要这样的数据。目前HTTPrequests是唯一使用data的。支持的对象类型包括字节,类文件对象和可迭代。如果没有提供Content-Length
也没有Transfer-Encoding
标题字段,HTTPHandler
将根据data.Content-Length
的类型设置这些标题将用于sendbytes对象,而Transfer-Encoding: chunked
在 RFC 7230 中指定,第3.3.1节将用于发送文件和其他iterables.对于HTTP POST请求方法,data应该是标准application/x-www-form-urlencoded格式的缓冲区。
urllib.parse.urlencode()
函数采用2元组的映射或序列,并以此格式返回ASCII字符串。它应该在被用作data参数之前编码为字节.headers应该是一个字典,并且将被视为
add_header()
被调用,每个键和值作为参数这通常用来“欺骗”User-Agent
标题值,由浏览器用于标识自身 – 某些HTTP服务器仅允许来自常见浏览器而非脚本的请求。例如,Mozilla Firefox可能将自己标识为"Mozilla/5.0(X11; U; Linux i686) Gecko/20071127 Firefox/2.0.0.11"
,而urllib
默认的用户代理字符串是"Python-urllib/2.6"
(在Python 2.6上).适当的
Content-Type
如果data论证存在。如果没有提供此标题并且data不是没有,Content-Type: application/x-www-form-urlencoded
将被添加为默认值.最后两个参数仅对正确处理第三方HTTP cookie感兴趣:
origin_req_host应该是origintransaction的请求主机,由 RFC 2965 定义。它默认为
http.cookiejar.request_host(self)
。这是用户发起的原始请求的主机名或IP地址。例如,如果请求是针对HTML文档中的图像,则该请求应该是包含图像的页面请求的请求主机。unverifiable应该表明请求是否无法验证,如 RFC 2965 所定义。它默认为
False
。无法验证的请求是用户没有选择批准的URL。例如,如果请求是针对HTML文档中的图像,并且用户没有选择批准自动获取图像,则应该是真的.method应该是一个字符串,表示将使用的HTTP请求方法(例如
"HEAD"
)。如果提供,其值存储在method
属性中并由get_method()
使用。默认为"GET"
如果data是None
或"POST"
otherwise.Subclasses可以通过在类本身中设置method
属性来指示不同的默认方法.注意
如果数据对象无法多次传送其内容(例如,只能生成一次内容的文件或iterable),则请求将无法按预期工作,并且会重新尝试HTTP重定向或身份验证。data在标题之后立即发送到HTTP服务器。在库中没有100-continue期望的支持.
在版本3.3中更改:
Request.method
参数被添加到Request类中.更改版本3.4:默认
Request.method
可以在类级别指示.更改版本3.6:如果是
Content-Length
没有提供,data既不是None
也不是字节对象。回到使用分块传输编码.
- class
urllib.request.
OpenerDirector
-
OpenerDirector
类通过BaseHandler
s chainedtogether打开URL。它管理处理程序的链接,并从错误中恢复.
- class
urllib.request.
BaseHandler
-
这是所有注册处理程序的基类 – 并且只处理简单的注册机制.
- class
urllib.request.
HTTPDefaultErrorHandler
-
一个定义HTTP错误响应的默认处理程序的类;所有的回应都变成了
HTTPError
exceptions.
- class
urllib.request.
HTTPRedirectHandler
-
一个处理重定向的类.
- class
urllib.request.
HTTPCookieProcessor
(cookiejar=None) -
一个处理HTTP Cookies的类.
- class
urllib.request.
ProxyHandler
(proxies=None) -
导致请求通过代理。如果proxies给出,它必须是adictionary将协议名称映射到代理的URL。默认是从环境变量
<protocol>_proxy
。如果未设置代理环境变量,则在Windows环境中,从注册表的“Internet设置”部分获取代理设置,并在Mac OS X环境中从OS X系统配置框架中检索代理信息.要禁用自动检测代理,请传递一个空字典.
no_proxy
环境变量可用于指定不应通过代理访问的主机;如果设置,它应该是逗号分隔的主机名后缀列表,可选附加:port
,例如cern.ch,ncsa.uiuc.edu,some.host:8080
.如果设置了变量
HTTP_PROXY
,则会忽略REQUEST_METHOD
;请参阅getproxies()
.
- class
urllib.request.
HTTPPasswordMgr
-
的文档保存
(realm, uri) -> (user, password)
mappings.
- class
urllib.request.
HTTPPasswordMgrWithDefaultRealm
-
的数据库保留
(realm, uri) -> (user, password)
映射的数据库。None
被认为是一个无所不能的领域,如果没有其他真实的东西可以被搜查.
- class
urllib.request.
HTTPPasswordMgrWithPriorAuth
-
的变种
HTTPPasswordMgrWithDefaultRealm
还有一个uri -> is_authenticated
映射。aBasicAuth处理程序可以使用它来确定何时立即发送身份验证凭据,而不是先等待401
响应.新版本3.5.
- class
urllib.request.
AbstractBasicAuthHandler
(password_mgr=None) -
这是一个mixin类,它有助于对远程主机和代理进行HTTP身份验证。password_mgr,如果给出,应该是与
HTTPPasswordMgr
兼容的东西;有关必须支持的接口的信息,请参阅 HTTPPasswordMgr对象。如果passwd_mgr还提供了is_authenticated
和update_authenticated
方法(参见 HTTPPasswordMgrWithPriorAuth对象),那么处理程序将使用is_authenticated
给定URI的结果,以确定是否使用请求输入身份验证凭据。如果is_authenticated
为URI返回True
,则发送凭据。如果is_authenticated
是False
,则不发送凭证,然后如果接收到401
响应,则使用认证凭证重新发送请求。如果验证成功,则调用update_authenticated
来设置is_authenticated
True
对于URI,以便后续请求URI或其任何超级URI将自动包含身份验证凭据.新版本3.5:添加
is_authenticated
support.
- class
urllib.request.
HTTPBasicAuthHandler
(password_mgr=None) -
处理远程主机的身份验证。password_mgr,如果给出,应该是与
HTTPPasswordMgr
兼容的东西;请参阅 HTTPPasswordMgr对象以获取必须支持的接口的信息。HTTPBasicAuthHandler会在提出错误的身份验证方案时引发ValueError
.
- class
urllib.request.
ProxyBasicAuthHandler
(password_mgr=None) -
用代理进行身份验证。password_mgr,如果给出,应该是与
HTTPPasswordMgr
兼容的东西;请参阅 HTTPPasswordMgr对象以获取必须支持的界面的信息.
- class
urllib.request.
AbstractDigestAuthHandler
(password_mgr=None) -
这是一个混合有助于HTTP身份验证的类,包括远程主机和代理。password_mgr,如果给出,应该是与
HTTPPasswordMgr
兼容的东西;参考 HTTPPasswordMgr对象有关必须支持的界面的信息.
- class
urllib.request.
HTTPDigestAuthHandler
(password_mgr=None) -
与远程主机进行身份验证。password_mgr,如果给出,应该是与
HTTPPasswordMgr
兼容的东西;请参阅 HTTPPasswordMgr对象以获取必须支持的接口的信息。同时添加摘要式身份验证处理程序和BasicAuthentication处理程序时,始终首先尝试摘要式身份验证。如果摘要式身份验证再次返回40x响应,则将其发送到Handle的基本身份验证处理程序。当使用除了Diagest或Basic之外的身份验证方案时,此Handler方法将引发ValueError
在版本3.3中更改:在不支持的身份验证上提升
ValueError
方案
- class
urllib.request.
ProxyDigestAuthHandler
// (password_mgr=None) -
用代理处理认证。password_mgr,如果给出,应该是与
HTTPPasswordMgr
兼容的东西;请参阅 HTTPPasswordMgr对象以获取必须支持的接口的信息.
- class
urllib.request.
HTTPHandler
-
处理HTTP URL打开的类
- class
urllib.request.
HTTPSHandler
(debuglevel=0, context=None, check_hostname=None) -
用于处理HTTPS URL打开的类。context和check_hostname与中的含义相同
http.client.HTTPSConnection
.在版本3.2中更改:context和check_hostname添加。
- class
urllib.request.
FileHandler
-
打开本地文件.
- class
urllib.request.
DataHandler
-
打开数据网址
3.4版本中的新功能
- class
urllib.request.
FTPHandler
-
打开FTP URL
- class
urllib.request.
CacheFTPHandler
-
打开FTP URL,保持打开FTP连接的缓存以最大限度地减少延迟.
- class
urllib.request.
UnknownHandler
-
一个抓住所有类来处理未知的URLs.
- class
urllib.request.
HTTPErrorProcessor
-
处理HTTP错误响应
请求对象
以下方法描述Request
的公共接口,所以可以在子类中重写所有。它还定义了几个公共属性,客户端可以使用它们来检查parsedrequest.
Request.
full_url
-
原始URL传递给构造函数.
更改版本3.4.
Request.full_url是一个带有setter,getter和deleter的属性。获取
full_url
返回带有碎片的原始请求URL(如果存在)
Request.
type
-
URI方案.
Request.
host
-
URI权限,通常是主机,但也可能包含由冒号分隔的端口.
Request.
origin_req_host
-
请求的原始主机,没有port.
Request.
selector
-
URI路径。如果
Request
使用代理,那么选择器将是传递给代理的完整URL .
Request.
data
-
请求的实体主体,或
None
如果没有说明的话版本3.4更改:改变
Request.data
如果以前设置或计算过,则删除“Content-Length”标题.
Request.
unverifiable
-
boolean,表示请求是否无法验证,如 RFC 2965 .
Request.
method
-
所定义的HTTP请求方法。默认情况下它的值是
None
,这意味着get_method()
将对正在使用的方法进行正常计算。它的值可以设置(从而覆盖get_method()
)通过在中的类级别设置默认值来提供默认值Request
子类,或绕过一个值到Request
构造函数来自methodargument.3.3版本中的新功能
版本3.4更改:现在可以在子类中设置默认值;以前它只能通过构造函数参数设置.
Request.
get_method
()-
返回一个表示HTTP请求方法的字符串。如果
Request.method
不是None
,则返回其值,否则返回"GET"
如果Request.data
是None
,或"POST"
如果不是。这只对HTTP请求有意义.更改版本3.3: get_method现在查看
Request.method
.
Request.
add_header
(key, val)的值-
在请求中添加另一个标头。除了HTTP处理程序之外,所有处理程序都会忽略标头,并将它们添加到发送到服务器的标头列表中。请注意,不能有多个带有相同名称的标头,以后的调用将覆盖以前的调用以防key碰撞。目前,这不会丢失HTTP功能,因为所有标头在使用时都会超过曾经有一个(特定于标题)的方法,只使用一个标题来获得相同的功能.
Request.
add_unredirected_header
(key, header )-
添加一个不会添加到重定向请求的标题.
Request.
has_header
(header)-
返回实例是否具有指定标题(检查常规和非重定向).
Request.
remove_header
(header)-
从请求实例中删除命名标题(包括常规标题和未标题标题).
版本3.4.
Request.
get_full_url
中的新内容()-
返回构造函数中给出的URL。
更改版本3.4.
返回
Request.full_url
Request.
set_proxy
(host, type)-
通过连接到代理服务器来准备请求。host和type将替换实例的那些,实例的选择器将是构造函数中给出的originalURL .
Request.
get_header
(header_name, default=None)-
返回给定标题的值。如果标题不存在,则返回默认值.
Request.
header_items
()-
返回请求标题的元组列表(header_name,header_value).
在版本3.4中更改:请求方法add_data,has_data,get_data,get_type,get_host,get_selector,get_origin_req_host和is_unverifiable已被删除,因为3.3已被删除.
OpenerDirector Objects
OpenerDirector
实例有以下方法:
OpenerDirector.
add_handler
(handler)-
handler应该是
BaseHandler
。搜索以下方法,并将其添加到可能的链中(注意HTTP错误是特殊情况).protocol_open()
– 表示处理程序知道如何打开protocolURLs.http_error_type()
– 表示处理程序知道如何使用HTTP错误代码来处理HTTPerrors type.protocol_error()
– 表示处理程序知道如何处理错误(非_http
)protocol.protocol_request()
– 表示处理程序知道如何预处理protocol requestsprotocol_response()
– 表示处理程序知道如何处理protocol响应.
OpenerDirector.
open
(url, data=None [, timeout] )-
打开给定的url(可以是请求对象或字符串),可选地通过给定的data。提出的参数,返回值和异常与
urlopen()
(它只是在当前安装的全局open()
上调用OpenerDirector
方法)。Theoptional timeout参数指定阻塞操作(如连接尝试)的超时秒数(如果未指定,将使用全局defaulttimeout设置)。超时功能实际上只适用于HTTP,HTTPS和FTP连接).
OpenerDirector.
error
(proto, *args)-
处理给定协议的错误。这将使用给定的参数(具体是协议)调用给定协议的已注册错误处理程序。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()
那个方法叫做后处理响应.
BaseHandler Objects
BaseHandler
对象提供了一些直接有用的方法,以及其他旨在由派生类使用的方法。这些用于直接使用:
BaseHandler.
add_parent
(director)-
添加导演为父母.
BaseHandler.
close
()-
删除任何父母.
以下属性和方法只能用于BaseHandler
.
引用的类
已经采用了约定protocol_request()
或protocol_response()
方法名为*Processor
;所有其他名称*Handler
.
BaseHandler.
parent
-
有效
OpenerDirector
,可用于打开使用不同的协议,或处理错误.
BaseHandler.
default_open
(req)-
这个方法not在
BaseHandler
,但子类应该定义它,如果他们想要捕获所有的URL .这个方法,如果实现,将由父亲调用
OpenerDirector
。它应该返回一个类似文件的对象,如open()
OpenerDirector
或None
的返回值所述。它应该提升URLError
,除非a真正特别的事情发生(例如,MemoryError
不应该映射到URLError
).这个方法将在任何协议特定的打开方法之前调用.
BaseHandler.
protocol_open
(req )-
这个方法not在
BaseHandler
,但如果他们想要使用给定的协议来处理URL,则子类应该定义它.这个方法,如果定义,将由父亲调用
OpenerDirector
。返回值应与default_open()
.
BaseHandler.
unknown_open
(req)-
这个方法是not在
BaseHandler
中定义的,但是子类应该定义它,如果他们想要捕获所有没有特定注册处理程序的URL来打开它.这个方法,如果实现,将由
parent
OpenerDirector
。返回值应与default_open()
.
BaseHandler.
http_error_default
(req, fp, code, msg, hdrs)-
这个方法是not在中定义
BaseHandler
但是,如果子类打算为其他未处理的HTTPerrors提供一个catch-all,则应该重新设置它。它会被OpenerDirector
得到错误,通常不应该在其他情况下调用.req将是一个
Request
对象,fp将是一个类似文件的对象,带有HTTP错误体,code将是错误的三位数代码,msg将是用户可见的代码说明,而hdrs将是一个带有错误标题的映射对象.提出的返回值和异常应与
urlopen()
.
BaseHandler.
http_error_nnn
(req, fp, code, msg, hdrs)-
nnn的返回值和异常应该是三位数的HTTP错误代码。这个方法也没有定义
BaseHandler
,但是当发生代码nnn的HTTP错误时,将在asubclass实例上调用(如果存在).子类应该覆盖此方法来处理特定的HTTP错误.
引发的参数,返回值和异常应该与
http_error_default()
.
BaseHandler.
protocol_request
(req)-
相同。这个方法是not在
BaseHandler
但是,如果子类想要预先处理给定协议的请求,则应该定义它.这个方法,如果定义的话,将被父级调用
OpenerDirector
.req将是Request
宾语。返回值应为Request
宾语。
BaseHandler.
protocol_response
(req, response)-
这个方法是not在中定义
BaseHandler
但是,如果子类想要对给定协议的后处理响应,则应该定义它.这个方法,如果定义的话,将被父级调用
OpenerDirector
.req将是Request
object。response将是与urlopen()
的返回值相同的接口。其值应该实现与urlopen()
.
HTTPRedirectHandler对象的返回值相同的接口
注意
某些HTTP重定向需要此模块的客户端代码执行操作。如果是这种情况,则会引发HTTPError
。见 RFC 2616 详细说明各种重定向代码的详细含义.
一个HTTPError
如果向HTTPTPededHandler提供不是HTTP,HTTPS或FTP URL的重定向URL,则作为安全考虑因素引发异常.
HTTPRedirectHandler.
redirect_request
(req, fp, code, msg, hdrs, newurl)-
返回
Request
要么None
响应重定向。当从服务器接收到aredirection时,这是由http_error_30*()
方法的默认实现调用的。如果要进行重定向,请返回一个新的Request
允许http_error_30*()
执行到newurl的重定向。否则,举起HTTPError
如果没有其他处理程序应该尝试处理这个URL,或者如果你不能再用其他处理程序返回None
.注意
这种方法的默认实现并不严格遵循 RFC 2616 ,它表示301和302响应
POST
如果没有用户确认,请求不得自动重定向。实际上,browsersdo允许自动重定向这些响应,将POST更改为GET
,默认实现再现了这种行为.
HTTPRedirectHandler.
http_error_301
(req, fp, code, msg, hdrs)-
转到
Location:
或URI:
网址。这个方法由theparentOpenerDirector
获得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()
,但要求’临时重定向’响应.
ProxyHandler对象
ProxyHandler.
protocol_open
(request)-
ProxyHandler
会有一个方法protocol_open()
每一个protocol在中有代理proxies在构造函数中给出的字典。该方法将修改通过代理的请求,通过调用request.set_proxy()
,并调用链中的下一个处理程序来实际执行协议.
HTTPPasswordMgr对象
这些方法可以在HTTPPasswordMgr
和HTTPPasswordMgrWithDefaultRealm
对象上找到
HTTPPasswordMgr.
add_password
// (realm, uri, user, passwd)-
uri可以是单个URI或一系列URI。realm, user和passwd必须是字符串。当
(user, passwd)
的认证和任何给定URI的超级URI被给出时,这会导致realm用作身份验证令牌.
HTTPPasswordMgr.
find_user_password
(realm, authuri)-
获取给定领域和URI的用户/密码(如果有)。这个方法会返回
(None, None)
如果没有匹配的用户/密码.对于
HTTPPasswordMgrWithDefaultRealm
物品,领域None
如果给出realm没有匹配的用户/密码.
HTTPPasswordMgrWithPriorAuth对象
此密码管理器将HTTPPasswordMgrWithDefaultRealm
扩展为支持应始终发送身份验证凭据的URI .
HTTPPasswordMgrWithPriorAuth.
add_password
(realm, uri, user, passwd, is_authenticated=False)-
realm, uri, user, passwd至于
HTTPPasswordMgr.add_password()
. is_authenticated设置is_authenticated
给定URI或URI列表的标志。如果is_authenticated被指定为True
, realm被忽略了
HTTPPasswordMgr.
find_user_password
(realm, authuri)-
与
HTTPPasswordMgrWithDefaultRealm
对象
HTTPPasswordMgrWithPriorAuth.
update_authenticated
(self, uri, is_authenticated=False)-
更新给定
is_authenticated
或listof URI的uri标志.
HTTPPasswordMgrWithPriorAuth.
is_authenticated
(self, authuri)-
返回给定URI的
is_authenticated
标志的当前状态.
AbstractBasicAuthHandler Objects
AbstractBasicAuthHandler.
http_error_auth_reqed
(authreq, host, req, headers)-
通过获取用户/密码对并重新尝试请求来处理身份验证请求。authreq应该是请求中包含有关域的信息的头的名称,host指定要验证的URL和路径,req应该是(失败的)
Request
对象和headers应该是错误标题.host是一个权限(例如
"python.org"
)或一个包含一个权限组件的URL(例如"http://python.org/"
)。在任何一种情况下,授权都不能包含userinfo组件(因此,"python.org"
和"python.org:80"
很好,"joe:[email protected]"
不是).
HTTPBasicAuthHandler对象
HTTPBasicAuthHandler.
http_error_401
(req, fp, code, msg, hdrs)-
如果可用,请使用身份验证信息重试请求.
ProxyBasicAuthHandler对象
ProxyBasicAuthHandler.
http_error_407
(req, fp, code, msg, hdrs)-
如果可用,请使用身份验证信息重试请求.
AbstractDigestAuthHandler对象
AbstractDigestAuthHandler.
http_error_auth_reqed
(authreq, host, req, headers)-
authreq应该是头部的名称,其中包含请求中包含的有关realmis的信息,host应该是要验证的主机,req应该是(失败的)
Request
对象,而headers应该是错误的头文件
HTTPDigestAuthHandler对象
HTTPDigestAuthHandler.
http_error_401
(req, fp, code, msg, hdrs)-
用身份验证信息重试请求。如果可用.
ProxyDigestAuthHandler对象
ProxyDigestAuthHandler.
http_error_407
(req, fp, code, msg, hdrs)-
使用身份验证信息重试请求。如果可用.
HTTPHandler对象
HTTPHandler.
http_open
(req)-
发送HTTP请求,可以是GET或POST,具体取决于
req.has_data()
.
HTTPSHandler对象
HTTPSHandler.
https_open
(req)-
发送HTTPS请求,可以是GET或POST,取决于
req.has_data()
.
FileHandler Objects
FileHandler.
file_open
(req)-
如果没有主机名,则在本地打开文件,或者主机名是
"localhost"
.在版本3.2中更改:此方法仅适用于本地主机名。当给出一个remotehostname时,会引发一个
URLError
。
DataHandler Objects
DataHandler.
data_open
(req)-
读取一个数据URL。这种URL包含URLitself中编码的内容。数据URL语法在 RFC 2397 中指定。此实现在base64编码数据URL中标记空格,因此URL可以包含在它来自的任何源文件中。但即使有些浏览器没有注意到base64编码数据URL末尾缺少填充,这种实现会在这种情况下提升
ValueError
FTPHandler Objects
FTPHandler.
ftp_open
(req)-
打开req指示的FTP文件。登录总是使用emptyusername和password.
CacheFTPHandler对象
CacheFTPHandler
对象是FTPHandler
对象,具有以下附加方法:
CacheFTPHandler.
setTimeout
(t)-
设置连接超时到t秒.
CacheFTPHandler.
setMaxConns
(m)-
设置最大缓存连接数m.
UnknownHandler Objects
UnknownHandler.
unknown_open
()-
举起
URLError
exception.
HTTPErrorProcessor Objects
HTTPErrorProcessor.
http_response
(request, response)-
处理HTTP错误响应
对于200个错误代码,响应对象是立即返回.
对于非200错误代码,这只是将作业传递给
protocol_error_code()
处理程序方法,通过OpenerDirector.error()
。最后,HTTPDefaultErrorHandler
将如果没有其他处理程序处理错误,则HTTPError
举起
HTTPErrorProcessor.
https_response
(request, response)-
进程HTTPS错误响应
行为是与
http_response()
.
相同示例
除了以下示例之外,还有更多示例在 HOWTO使用urllib包获取Internet资源.
此示例获取python.org主页并显示前300个字节.
>>> import urllib.request>>> with urllib.request.urlopen("http://www.python.org/") as f:... print(f.read(300))...b"<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\n\n\n<htmlxmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">\n\n<head>\n<meta http-equiv="content-type" content="text/html; charset=utf-8" />\n<title>Python Programming "
请注意,urlopen返回一个bytes对象。这是因为没有办法自动确定从HTTP服务器接收的字节流的编码。通常,一旦程序确定或猜测出适当的编码,程序就会将返回的字节对象解码为字符串.
以下W3C文档https://www.w3.org/International/O-charset列出了(X)HTML或XML文档可以指定编码信息的各种方式.
由于python.org网站使用其元标记中指定的 utf-8 编码,我们将使用相同的方法来解码字节对象.
>>> with urllib.request.urlopen("http://www.python.org/") as f:... print(f.read(100).decode("utf-8"))...<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtm
不使用上下文管理器方法
>>> import urllib.request>>> f = urllib.request.urlopen("http://www.python.org/")>>> print(f.read(100).decode("utf-8"))<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtm
在下面的示例中,我们将数据流发送到CGI的stdin并读取它返回给我们的数据。请注意,此示例仅在Python安装支持SSL时才起作用.
>>> import urllib.request>>> req = urllib.request.Request(url="https://localhost/cgi-bin/test.cgi",... data=b"This data is passed to stdin of the CGI")>>> with urllib.request.urlopen(req) as f:... print(f.read().decode("utf-8"))...Got Data: "This data is passed to stdin of the CGI"
上例中使用的示例CGI的代码是:
#!/usr/bin/env pythonimport sysdata = sys.stdin.read()print("Content-type: text/plain\n\nGot Data: "%s"" % data)
import urllib.requestDATA = b"some data"req = urllib.request.Request(url="http://localhost:8080", data=DATA,method="PUT")with urllib.request.urlopen(req) as f: passprint(f.status)print(f.reason)
使用BasicHTTP身份验证:
import urllib.request# Create an OpenerDirector with support for Basic HTTP Authentication...auth_handler = urllib.request.HTTPBasicAuthHandler()auth_handler.add_password(realm="PDQ Application", uri="https://mahler:8092/site-updates.py", user="klem", passwd="kadidd!ehopper")opener = urllib.request.build_opener(auth_handler)# ...and install it globally so it can be used with urlopen.urllib.request.install_opener(opener)urllib.request.urlopen("http://www.example.com/login.html")
build_opener()
默认提供许多处理程序,包括ProxyHandler
。默认情况下,ProxyHandler
使用名为<scheme>_proxy
的环境变量,其中<scheme>
是所涉及的URL方案。例如,http_proxy
读取环境变量以获取HTTP代理URL .
这个例子取代了默认的ProxyHandler
使用以编程方式提供的代理URL,并添加代理授权支持ProxyBasicAuthHandler
.
proxy_handler = urllib.request.ProxyHandler({"http": "http://www.example.com:3128/"})proxy_auth_handler = urllib.request.ProxyBasicAuthHandler()proxy_auth_handler.add_password("realm", "host", "username", "password")opener = urllib.request.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 urllib.requestreq = urllib.request.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 = urllib.request.urlopen(req)
OpenerDirector
自动添加User-Agent标题to//very Request
。要改变这个:
import urllib.requestopener = urllib.request.build_opener()opener.addheaders = [("User-agent", "Mozilla/5.0")]opener.open("http://www.example.com/")
另外,请记住一些标准标题(Content-Length,Content-Type和Host)当Request
被传递到urlopen()
(要么OpenerDirector.open()
).
这是一个使用GET
方法检索URL包含参数的示例会话:
>>> import urllib.request>>> import urllib.parse>>> params = urllib.parse.urlencode({"spam": 1, "eggs": 2, "bacon": 0})>>> url = "http://www.musi-cal.com/cgi-bin/query?%s" % params>>> with urllib.request.urlopen(url) as f:... print(f.read().decode("utf-8"))...
以下示例使用POST
方法而不是。请注意,从urlencode输出的params在被发送到urlopen之前被编码为字节作为data:
>>> import urllib.request>>> import urllib.parse>>> data = urllib.parse.urlencode({"spam": 1, "eggs": 2, "bacon": 0})>>> data = data.encode("ascii")>>> with urllib.request.urlopen("http://requestb.in/xrbl82xr", data) as f:... print(f.read().decode("utf-8"))...
以下示例使用显式指定的HTTP代理,overridingen环境设置:
>>> import urllib.request>>> proxies = {"http": "http://proxy.example.com:8080/"}>>> opener = urllib.request.FancyURLopener(proxies)>>> with opener.open("http://www.python.org") as f:... f.read().decode("utf-8")...
>>> import urllib.request>>> opener = urllib.request.FancyURLopener({})>>> with opener.open("http://www.python.org/") as f:... f.read().decode("utf-8")...
Legacy interface
以下函数和类从Python 2模块urllib
移植(而不是urllib2
)。他们可能会在将来的某个时候被弃用.
urllib.request.
urlretrieve
(url, filename=None, reporthook=None, data=None)-
将URL表示的网络对象复制到本地文件。如果URL指向本地文件,除非提供了filename,否则不会复制该对象。返回一个元组
(filename, headers)
其中filename是可以在其下找到对象的本地文件名,headers是w//vertheinfo()
urlopen()
返回的对象的方法返回(远程对象)。例外情况与urlopen()
.第二个参数(如果存在)指定要复制到的文件位置(如果有,则该位置将是具有生成名称的临时文件)。第三个参数(如果存在)是一个可调用的,一旦建立网络连接就会被调用,并且在每个块之后被调用一次。callable将传递三个参数;到目前为止传输的块数,块大小(以字节为单位)以及文件的总大小。第三个参数可能是
-1
在较旧的FTP服务器上,它们没有返回文件大小以响应检索请求.以下示例说明了最常见的使用场景:
>>> import urllib.request>>> local_filename, headers = urllib.request.urlretrieve("http://python.org/")>>> html = open(local_filename)>>> html.close()
如果url使用
http:
方案标识符,可以给出data参数可选指定POST
请求(通常请求类型为GET
)。data参数必须是标准application/x-www-form-urlencoded格式的字节对象;看urllib.parse.urlencode()
功能urlretrieve()
会举起ContentTooShortError
当它检测到可用数据量小于预期数量时(这是Content-Length报头报告的大小)。例如,下载中断时会发生这种情况.Content-Length被视为下限:如果有更多数据要读取,urlretrieve会读取更多数据,但如果可用的数据较少,则会引发异常.
在这种情况下你仍然可以检索下载的数据,它存储在异常实例的
content
属性中.如果没有Content-Length提供了标头,urlretrieve无法检查它已下载的数据的大小,只返回它。在这种情况下,你只需假设下载成功.
urllib.request.
urlcleanup
( )-
清除以前调用可能遗留的临时文件到
urlretrieve()
.
- class
urllib.request.
URLopener
(proxies=None, **x509) -
自版本3.3以后已弃用.
用于打开和读取URL的基类。除非你需要使用
http:
,ftp:
或file:
以外的方案支持openobjects,你可能想要使用FancyURLopener
.默认情况下,
URLopener
类发送一个User-Agent标题urllib/VVV
,VVV是个urllib
版本号。应用程序可以定义自己的User-Agent通过子类化URLopener
要么FancyURLopener
并设置类属性version
在子类定义中适当的字符串值.可选proxies参数应该是字典映射方案名称toproxy URL,其中空字典完全关闭代理。它的默认值是
None
,在这种情况下,如果存在,将使用环境代理设置,如上面urlopen()
的定义所讨论的//在x509,可以在使用
https:
方案时使用客户端的身份验证。关键字key_file和cert_file支持提供SSL密钥和证书;两者都需要支持客户端身份验证.URLopener
如果服务器返回错误代码,对象将引发OSError
异常.open
(fullurl, data=None)-
使用适当的协议打开fullurl。此方法设置缓存和代理信息,然后使用其输入参数调用适当的open方法。如果方案无法识别,
open_unknown()
叫data参数和data //urlopen()
.
open_unknown
(fullurl, data=None)-
的参数含义相同@Otridable接口打开未知网址类型.
retrieve
(url, filename=None, reporthook=None, data=None)-
检索url并把它放在filename。返回值是一个元组,由一个本地文件名和
email.message.Message
对象组成,包含响应头(对于远程URL)或None
(对于本地URL)。然后打电话者必须打开并阅读filename的内容。如果没有给出filename并且URL引用了alocal文件,则返回输入文件名。如果URL是非本地的并且filename如果没有给出,则文件名是tempfile.mktemp()
的输出,其后缀与inputURL的最后一个路径组件的后缀相匹配。如果reporthook如果给出,它必须是一个接受三个数字参数的函数:一个块号,读入的最大大小块和下载的总大小(如果未知,则为-1)。它将在开始时调用一次,并在从网络中读取每个数据块之后调用。reporthook被忽略为本地URL如果url使用
http:
方案标识符,则可以选择data参数指定POST
请求(通常请求类型为GET
)。data参数必须采用标准application/x-www-form-urlencoded格式;参见urllib.parse.urlencode()
function.
version
-
Variable,指定开启者对象的用户代理。要获得
urllib
告诉服务器它是一个特定的用户代理,在调用baseconstructor之前在asubclass中将其设置为类变量或在构造函数中设置.
- class
urllib.request.
FancyURLopener
(…) -
自版本3.3以后不推荐使用.
FancyURLopener
子类URLopener
为以下HTTP响应代码提供默认处理:301,302,303,307和401.对于上面列出的30xresponse代码,Locationheader用于获取实际的URL。对于401响应代码(需要身份验证),执行基本HTTP身份验证。对于30x响应代码,递归受到maxtries属性,默认为10.对于所有其他响应代码,调用方法
http_error_default()
,你可以在子类中覆盖以适当地处理错误.注意
根据 RFC 2616 未经用户确认,不得自动重定向,301和302对POST请求的响应。Inreality,浏览器允许自动重定向这些响应,将POST更改为GET和
urllib
再现这种行为.构造函数的参数与
URLopener
.注意
执行基本身份验证时,
FancyURLopener
实例调用prompt_user_passwd()
方法。默认实现向用户询问控制终端上所需的信息。如果需要,子类可以使用此方法来支持更合适的行为.FancyURLopener
class提供了一个额外的方法,应该重载以提供适当的行为:prompt_user_passwd
(host, realm)-
返回在指定安全领域中给定主机上验证用户所需的信息。返回值应为元组
(user,password)
,可用于基本认证.实施提示在终端上提供此信息;应用程序应该覆盖此方法以在localenvironment中使用适当的交互模型.
urllib.request
限制
-
目前,仅支持以下协议:HTTP(版本0.9和1.0),FTP,本地文件和数据URL。
更改版本3.4:添加了对数据URL的支持。
-
的缓存功能
urlretrieve()
已被禁用,直到有人找到时间来破解到期时间标题的正确处理. -
应该有一个函数来查询特定的URL是否在缓存中.
-
为了向后兼容,如果是URL似乎指向本地文件,但无法打开文件,使用FTP协议重新解释URL。这有时会导致令人困惑的错误信息.
-
urlopen()
和urlretrieve()
功能会在等待网络连接建立时造成任意长时间的延迟。这意味着很难使用这些函数构建交互式Web客户端而不使用线程 -
//
urlopen()
或urlretrieve()
返回的数据是服务器的原始数据。这可以是二进制数据(例如图像),纯文本(例如)HTML。HTTP协议在replyheader中提供类型信息,可以通过查看Content-Type标题来检查。如果返回的数据是HTML,你可以使用模块html.parser
来解析它. -
处理FTP协议的代码无法区分文件和内容。尝试读取指向无法访问的文件的URL时,这可能会导致意外行为。如果URL以
/
结尾,则认为它引用了一个目录并将进行相应的处理。但是,如果试图读取文件会导致550错误(意味着无法找到URL或通常出于权限原因而无法访问该URL),则该路径将被视为adirectory,以便处理URL指定目录时的情况但尾随/
已被取消。当您尝试获取其读取权限使其无法访问的文件时,这可能会导致误导性结果;FTPcode将尝试读取它,失败并出现550错误,然后为不可读文件执行目录列表。如果需要细粒度控制,可以考虑使用ftplib
模块,子类化FancyURLopener
,或者更改_urlopener来满足你的需要.
urllib.response
– 使用的响应类urllib
urllib.response
模块定义了定义像接口这样的最小文件的函数和类,包括read()
和readline()
。典型的响应对象是一个addinfourl实例,它定义了一个info()
方法,并返回头和geturl()
返回由该模块定义的url.Functions的方法由urllib.request
module.
评论被关闭。