urllib.request- 用于打开URL的可扩展库文档说明

原创 创建时间:2019-09-11 访问量:11 赞:0 踩:0

urllib.request- 用于打开URL的可扩展库

源代码: Lib / urllib / request.py


urllib.request模块定义了有助于在复杂世界中打开URL(主要是HTTP)的功能和类 - 基本和摘要认证,重定向,cookie等。

也可以看看

 

建议Requests包用于更高级别的HTTP客户端界面。

urllib.request模块定义了以下功能:

urllib.request.urlopenurldata = Nonetimeout*cafile = Nonecapath = Nonecadefault = Falsecontext = None 

打开URL url,可以是字符串或 Request对象。

data必须是指定要发送到服务器的其他数据的对象,或者None如果不需要此类数据。详情Request 请见。

urllib.request模块使用HTTP / 1.1并Connection:close在其HTTP请求中包含标头。

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

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

可选的cafilecapath参数为HTTPS请求指定一组可信CA证书。 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

对于遗留URLopenerFancyURLopener显式处理的FTP,文件和数据URL以及请求 ,此函数返回一个urllib.response.addinfourl对象。

引发URLError协议错误。

请注意,None如果没有处理程序处理请求,则可能会返回(尽管默认安装的global OpenerDirector用于UnknownHandler确保永远不会发生这种情况)。

此外,如果检测到代理设置(例如,当*_proxy 环境变量如http_proxy已设置), ProxyHandler默认安装并确保通过代理处理请求。

urllib.urlopenPython 2.6及更早版本的遗留函数已经停止使用; urllib.request.urlopen()对应旧的urllib2.urlopen通过传递字典参数来完成的代理处理urllib.urlopen可以通过使用ProxyHandler对象来获得 

在版本3.2中更改:添加了cafilecapath

版本3.2中已更改:如果可能,现在支持HTTPS虚拟主机(即,如果 ssl.HAS_SNI为true)。

版本3.2中的新功能:数据可以是可迭代的对象。

在版本3.3中更改:添加了cadefault

版本3.4.3中已更改:已添加上下文

从版本3.6 开始不推荐使用:不推荐使用cafilecapathcadefault来支持上下文ssl.SSLContext.load_cert_chain()改为使用,或者 ssl.create_default_context()为您选择系统的可信CA证书。

urllib.request.install_opener开场白

安装OpenerDirector实例作为默认的全局开启工具。只有在你想让urlopen使用那个开启器时才需要安装开启器。否则,只需打电话OpenerDirector.open()而不是 urlopen()代码不检查是否真实 OpenerDirector,任何具有适当接口的类都可以工作。

urllib.request.build_openerhandler... 

返回一个OpenerDirector实例,它按照给定的顺序链接处理程序。handler s可以是实例,也可以是BaseHandler子类BaseHandler(在这种情况下,必须可以在没有任何参数的情况下调用构造函数)。以下类的实例将在前面的处理程序 S,除非处理器小号含有它们,将它们的它们的实例或亚类:ProxyHandler(如果检测到代理设置), ,UnknownHandlerHTTPHandler, HTTPDefaultErrorHandlerHTTPRedirectHandler, FTPHandlerFileHandlerHTTPErrorProcessor

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

一个BaseHandler子类,还可以改变其handler_order 属性,修改其在处理程序列表中的位置。

urllib.request.pathname2url路径

将路径名路径路径的本地语法转换为URL路径组件中使用的表单。这不会产生完整的URL。将使用该quote()函数引用返回值

urllib.request.url2pathname路径

将路径组件路径从百分比编码的URL 转换为路径的本地语法。这不接受完整的URL。此函数用于 unquote()解码路径

urllib.request.getproxies

此帮助程序函数返回代理服务器URL映射的方案字典。它首先在环境中扫描<scheme>_proxy所有操作系统的名称不区分大小的变量,当它找不到它时,从Mac OS X的Mac OSX系统配置和Windows的Windows系统注册表中查找代理信息。如果小写和大写环境变量都存在(并且不同意),则首选小写。

注意

 

如果REQUEST_METHOD设置了环境变量(通常表示您的脚本在CGI环境中运行),则将忽略环境变量HTTP_PROXY(大写_PROXY)。这是因为客户端可以使用“Proxy:”HTTP标头注入该变量。如果需要在CGI环境中使用HTTP代理,请ProxyHandler显式使用 ,或确保变量名称为小写(或至少为_proxy后缀)。

提供以下课程:

class urllib.request.Requesturldata = Noneheaders = {}origin_req_host = Noneunverifiable = Falsemethod = None 

此类是URL请求的抽象。

url应该是包含有效URL的字符串。

data必须是指定要发送到服务器的其他数据的对象,或者None如果不需要此类数据。目前,HTTP请求是唯一使用数据的请求支持的对象类型包括字节,类文件对象和可迭代。如果没有 Content-Length,也没有Transfer-Encoding报头字段已经被设置,HTTPHandler将根据的类型来设置这些标题数据。 Content-Length将用于发送字节对象,而在中指定 Transfer-Encoding: chunkedRFC 7230,第3.3.1节将用于发送文件和其他迭代。

对于HTTP POST请求方法,数据应该是标准application / x-www-form-urlencoded格式的缓冲区urllib.parse.urlencode()函数采用2元组的映射或序列,并以此格式返回ASCII字符串。在用作数据参数之前,应将其编码为字节

标题应该是字典,并且将被视为 add_header()使用每个键和值作为参数调用。这通常用于“欺骗” User-Agent标头值,浏览器使用标头值来标识自身 - 某些HTTP服务器仅允许来自常见浏览器而非脚本的请求。例如,Mozilla Firefox可能将自己标识为,而 默认的用户代理字符串是 (在Python 2.6上)。"Mozilla/5.0 (X11; U;Linux i686) Gecko/20071127 Firefox/2.0.0.11"urllib"Python-urllib/2.6"

Content-Type如果存在data 参数,则应包含适当的标头如果未提供此标头且数据 不是None,则将添加为默认值。Content-Type: application/x-www-form-urlencoded

接下来的两个参数仅对正确处理第三方HTTP cookie感兴趣:

origin_req_host应该是origin事务的请求主机,如下所定义RFC 2965它默认为http.cookiejar.request_host(self)这是用户启动的原始请求的主机名或IP地址。例如,如果请求是针对HTML文档中的图像,则该请求应该是包含图像的页面请求的请求主机。

无法核实的应表明该请求是否无法核实,如下所述RFC 2965它默认为False无法验证的请求是用户无法选择批准的URL。例如,如果请求是针对HTML文档中的图像,并且用户没有选择批准自动获取图像,则应该这样。

method应该是一个字符串,表示将使用的HTTP请求方法(例如'HEAD')。如果提供,则其值存储在 method属性中并由其使用get_method()默认值是'GET'如果数据None'POST'以其他方式。子类可以通过method在类本身中设置属性来指示不同的默认方法 

注意

 

如果数据对象无法多次传递其内容(例如,只能生成一次内容的文件或可迭代文件),则请求将无法按预期工作,并且会重试HTTP重定向或身份验证请求。数据被发送到头部后马上HTTP服务器。图书馆不支持100次继续期望。

在版本3.3中更改:Request.method参数被添加到Request类。

在版本3.4中更改:默认Request.method可以在班级指示。

版本3.6中已更改:如果Content-Length尚未提供错误数据既不None是字节对象,也不会引发错误回过头来使用分块传输编码。

urllib.request.OpenerDirector

OpenerDirector类打开通过URL BaseHandler链接在一起秒。它管理处理程序的链接以及从错误中恢复。

urllib.request.BaseHandler

这是所有已注册处理程序的基类 - 并且只处理简单的注册机制。

urllib.request.HTTPDefaultErrorHandler

一个定义HTTP错误响应的默认处理程序的类; 所有回复都变成了HTTPError例外。

urllib.request.HTTPRedirectHandler

一个处理重定向的类。

class urllib.request.HTTPCookieProcessorcookiejar = None 

一个处理HTTP Cookie的类。

class urllib.request.ProxyHandlerproxies = None 

导致请求通过代理。如果给出了代理,则它必须是将协议名称映射到代理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()

urllib.request.HTTPPasswordMgr

保留映射数据库 (realm, uri) -> (user, password)

urllib.request.HTTPPasswordMgrWithDefaultRealm

保留映射数据库 一个领域 被认为是一个包罗万象的领域,如果没有其他领域适合的话就会被搜索。(realm,uri) -> (user, password)None

urllib.request.HTTPPasswordMgrWithPriorAuth

其变体HTTPPasswordMgrWithDefaultRealm还有一个映射数据库BasicAuth处理程序可以使用它来确定何时立即发送身份验证凭据,而不是等待响应。uri -> is_authenticated401

版本3.5中的新功能。

class urllib.request.AbstractBasicAuthHandlerpassword_mgr = None 

这是一个mixin类,可以帮助远程主机和代理进行HTTP身份验证。password_mgr,如果给定,应该是兼容的HTTPPasswordMgr有关必须支持的接口的信息,请参阅HTTPPasswordMgr对象一节 如果passwd_mgr还提供is_authenticated和 update_authenticated方法(参见 HTTPPasswordMgrWithPriorAuth对象),则处理程序将使用该 is_authenticated结果中的某个给定URI以确定是否要发送的认证证书与请求。如果is_authenticated 返回TrueURI,则发送凭据。如果is_authenticated 是False,则不发送凭证,然后如果是401收到响应后,将使用身份验证凭据重新发送请求。如果身份验证成功,update_authenticated则调用is_authenticated True为URI 设置 ,以便对URI或其任何超级URI的后续请求将自动包含身份验证凭据。

3.5版中的新功能:添加了is_authenticated支持。

class urllib.request.HTTPBasicAuthHandlerpassword_mgr = None 

处理远程主机的身份验证。password_mgr,如果给定,应该是兼容的HTTPPasswordMgr有关必须支持的接口的信息,请参阅HTTPPasswordMgr对象一节HTTPBasicAuthHandler会ValueError在出现错误的身份验证方案时引发

class urllib.request.ProxyBasicAuthHandlerpassword_mgr = None 

使用代理处理身份验证。password_mgr,如果给定,应该是兼容的HTTPPasswordMgr有关必须支持的接口的信息,请参阅HTTPPasswordMgr对象一节 

class urllib.request.AbstractDigestAuthHandlerpassword_mgr = None 

这是一个mixin类,可以帮助远程主机和代理进行HTTP身份验证。password_mgr,如果给定,应该是兼容的HTTPPasswordMgr有关必须支持的接口的信息,请参阅HTTPPasswordMgr对象一节 

class urllib.request.HTTPDigestAuthHandlerpassword_mgr = None 

处理远程主机的身份验证。password_mgr,如果给定,应该是兼容的HTTPPasswordMgr有关必须支持的接口的信息,请参阅HTTPPasswordMgr对象一节同时添加摘要式身份验证处理程序和基本身份验证处理程序时,始终首先尝试摘要式身份验证。如果摘要式身份验证再次返回40x响应,则会将其发送到基本身份验证处理程序以处理。ValueError当使用Digest或Basic之外的身份验证方案时,此Handler方法将引发此方法 

在3.3版中更改:提升ValueError不支持的身份验证方案。

class urllib.request.ProxyDigestAuthHandlerpassword_mgr = None 

使用代理处理身份验证。password_mgr,如果给定,应该是兼容的HTTPPasswordMgr有关必须支持的接口的信息,请参阅HTTPPasswordMgr对象一节 

urllib.request.HTTPHandler

用于处理HTTP URL打开的类。

class urllib.request.HTTPSHandlerdebuglevel = 0context = Nonecheck_hostname = None 

用于处理HTTPS URL打开的类。 contextcheck_hostname 的含义与in中的含义相同http.client.HTTPSConnection

在版本3.2中更改:添加了contextcheck_hostname

urllib.request.FileHandler

打开本地文件。

urllib.request.DataHandler

打开数据网址。

版本3.4中的新功能。

urllib.request.FTPHandler

打开FTP URL。

urllib.request.CacheFTPHandler

打开FTP URL,保持打开FTP连接的缓存以最大限度地减少延迟。

urllib.request.UnknownHandler

一个全能类来处理未知的URL。

urllib.request.HTTPErrorProcessor

处理HTTP错误响应。

请求对象

以下方法描述了Request公共接口,因此可以在子类中重写所有方法。它还定义了几个可供客户端检查已解析请求的公共属性。

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

请求的原始主机,没有端口。

Request.selector

URI路径。如果Request使用代理,则selector将是传递给代理的完整URL。

Request.data

请求的实体主体,None如果未指定。

在版本3.4中更改Request.data如果之前已设置或计算,则更改现在的值将删除“Content-Length”标题。

Request.unverifiable

boolean,表示请求是否无法验证 RFC 2965

Request.method

要使用的HTTP请求方法。默认情况下,它的值为None,这意味着get_method()它将对要使用的方法进行正常计算。可以通过get_method()Request子类中的类级别设置默认值,或者通过method 参数将值传递给Request构造函数来设置其值(从而覆盖默认计算

版本3.3中的新功能。

版本3.4中已更改:现在可以在子类中设置默认值; 以前它只能通过构造函数参数设置。

Request.get_method

返回表示HTTP请求方法的字符串。如果 Request.method不是None,返回其值,否则返回 'GET'如果Request.dataNone,或者'POST'如果它不是。这仅对HTTP请求有意义。

在版本3.3中更改: get_method现在查看值Request.method

Request.add_headerval 

在请求中添加另一个标头。除了HTTP处理程序之外,所有处理程序都会忽略标头,并将它们添加到发送到服务器的标头列表中。请注意,不能有多个具有相同名称的标头,以后的调用将覆盖以前的调用,以防密钥发生冲突。目前,这并没有丢失HTTP功能,因为所有在多次使用时具有意义的标头都具有(标头特定的)仅使用一个标头获得相同功能的方式。

Request.add_unredirected_header标题

添加不会添加到重定向请求的标头。

Request.has_header标题

返回实例是否具有指定标头(检查常规和未重定向)。

Request.remove_header标题

从请求实例中删除命名标头(包括常规标头和未标准标头)。

版本3.4中的新功能。

Request.get_full_url

返回构造函数中给出的URL。

在版本3.4中更改。

返回 Request.full_url

Request.set_proxy主持人类型

通过连接到代理服务器来准备请求。主机类型将取代这些实例,并且该实例的选择将是在构造函数中给出的原始URL。

Request.get_headerheader_namedefault = None 

返回给定标头的值。如果标头不存在,则返回默认值。

Request.header_items

返回Request标头的元组列表(header_name,header_value)。

版本3.4中已更改:已删除自3.3以来已弃用的请求方法add_data,has_data,get_data,get_type,get_host,get_selector,get_origin_req_host和is_unverifiable。

OpenerDirector对象

OpenerDirector 实例有以下方法:

OpenerDirector.add_handler处理程序

handler应该是一个实例BaseHandler搜索以下方法,并将其添加到可能的链中(请注意,HTTP错误是一种特殊情况)。请注意,在下文中,协议应替换为要处理的实际协议,例如http_response(),HTTP协议响应处理程序。此外,类型应替换为实际的HTTP代码,例如,http_error_404()将处理HTTP 404错误。

  • <protocol>_open()- 表示处理程序知道如何打开协议 URL。

    有关BaseHandler.<protocol>_open()更多信息,请参阅

  • http_error_<type>()- 表示处理程序知道如何使用HTTP错误代码类型处理HTTP错误

    有关BaseHandler.http_error_<nnn>()更多信息,请参阅

  • <protocol>_error()- 表示处理程序知道如何处理来自(非http协议的错误

  • <protocol>_request()- 表示处理程序知道如何预处理 协议请求。

    有关BaseHandler.<protocol>_request()更多信息,请参阅

  • <protocol>_response()- 表示处理程序知道如何后处理协议响应。

    有关BaseHandler.<protocol>_response()更多信息,请参阅

OpenerDirector.openurldata = None [timeout 

打开给定的URL(可以是请求对象或字符串),可选地传递给定的数据引发的参数,返回值和异常与urlopen()(仅open() 在当前安装的全局上调用方法OpenerDirector)相同。可选的timeout参数指定阻塞操作(如连接尝试)的超时(以秒为单位)(如果未指定,将使用全局默认超时设置)。超时功能实际上仅适用于HTTP,HTTPS和FTP连接)。

OpenerDirector.errorproto* args 

处理给定协议的错误。这将使用给定的参数(特定于协议)调用给定协议的已注册错误处理程序。HTTP协议是一种特殊情况,它使用HTTP响应代码来确定特定的错误处理程序; 请参阅http_error_<type>() 处理程序类方法。

提出的返回值和异常与urlopen()

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

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

  1. 具有名为like的方法的每个处理程序<protocol>_request()都调用该方法来预处理请求。

  2. <protocol>_open()调用具有名为like的方法的处理程序来处理请求。当处理程序返回非None 值(即响应)或引发异常(通常 URLError时,此阶段结束允许例外传播。

    实际上,上面的算法首先尝试用于命名的方法 default_open()如果所有这些方法都返回None,则对名为like的方法重复该算法<protocol>_open()如果所有这些方法都返回None,则对于名为的方法重复该算法unknown_open()

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

  3. 具有名为like的方法的每个处理程序<protocol>_response()都调用该方法来对响应进行后处理。

BaseHandler对象

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

BaseHandler.add_parent导演

将导演添加为父级。

BaseHandler.close

删除任何父母。

以下属性和方法只能由派生自的类使用 BaseHandler

注意

 

已采用约定,定义子类 <protocol>_request()<protocol>_response()方法 *Processor所有其他人都被命名*Handler

BaseHandler.parent

有效的OpenerDirector,可用于使用不同的协议打开,或处理错误。

BaseHandler.default_openreq 

这种方法是不是定义的BaseHandler,但子类应该定义它,如果他们想捕获所有的网址。

如果实现了此方法,则父方将调用此方法 OpenerDirector如在的返回值描述了它应该返回一个类文件对象open()OpenerDirector,或None它应该引发URLError,除非发生真正特殊的事情(例如,MemoryError不应映射到 URLError)。

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

BaseHandler.<protocol>_open(req)

这种方法是不是定义的BaseHandler,但子类应该定义它,如果他们想处理与给定协议的URL。

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

BaseHandler.unknown_openreq 

这种方法是不是定义的BaseHandler,但子类应该定义它,如果他们想赶上没有特定注册的处理程序的所有URL将其打开。

如果实现了此方法,则将调用此方法返回值应与for相同 parent OpenerDirectordefault_open()

BaseHandler.http_error_defaultreqfpcodemsghdrs 

这种方法是不是定义的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。 req将是一个Request对象。返回值应该是一个 Request对象。

BaseHandler.<protocol>_response(req, response)

这种方法是不是定义的BaseHandler,但子类应该定义它,如果他们想进行后处理指定协议的响应。

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

HTTPRedirectHandler对象

注意

 

某些HTTP重定向需要此模块的客户端代码执行操作。如果是这种情况,HTTPError则提出。看到RFC 2616有关各种重定向代码的精确含义的详细信息。

HTTPError,如果是HTTPRedirectHandler的呈现是不是HTTP,HTTPS和FTP URL重定向URL异常引发的安全考虑。

HTTPRedirectHandler.redirect_requestreqfpcodemsghdrsnewurl 

返回RequestNone响应重定向。http_error_30*()当从服务器接收重定向时,这由方法的默认实现调用如果应该进行重定向,则返回一个新的Request以允许http_error_30*()执行重定向到newurl否则,HTTPError如果没有其他处理程序应该尝试处理此URL,None引发,或者如果不能,则返回另一个处理程序。

注意

 

此方法的默认实现并未严格遵循 RFC 2616,其中指出301和302对POST请求的响应不得在未经用户确认的情况下自动重定向。实际上,浏览器允许自动重定向这些响应,将POST更改为a GET,默认实现再现此行为。

HTTPRedirectHandler.http_error_301reqfpcodemsghdrs 

重定向到Location:URI:URL。OpenerDirector获取HTTP“永久移动”响应时,父方将调用此方法

HTTPRedirectHandler.http_error_302reqfpcodemsghdrs 

同样的http_error_301(),但要求'发现'的回应。

HTTPRedirectHandler.http_error_303reqfpcodemsghdrs 

同样的http_error_301(),但要求'看到其他'的回应。

HTTPRedirectHandler.http_error_307reqfpcodemsghdrs 

与之相同http_error_301(),但要求“临时重定向”响应。

HTTPCookieProcessor对象

HTTPCookieProcessor 实例有一个属性:

HTTPCookieProcessor.cookiejar

http.cookiejar.CookieJar其中存储Cookie。

ProxyHandler对象

ProxyHandler.<protocol>_open(request)

ProxyHandler将有一个方法<protocol>_open()为每一个 协议,其具有在一个代理的代理在构造给定字典。该方法将修改通过代理的请求,通过调用request.set_proxy(),并调用链中的下一个处理程序来实际执行协议。

HTTPPasswordMgr对象

这些方法都可以在HTTPPasswordMgr和 HTTPPasswordMgrWithDefaultRealm对象。

HTTPPasswordMgr.add_password领域uri用户密码

uri可以是单个URI,也可以是URI序列。领域用户和 密码必须是字符串。当给出对领域的认证和任何给定URI的超级URI时,这导致用作认证令牌(user, passwd)

HTTPPasswordMgr.find_user_password领域authuri 

获取给定领域和URI的用户/密码(如果有)。如果没有匹配的用户/密码,则此方法将返回 (None, None)

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

HTTPPasswordMgrWithPriorAuth对象

此密码管理器扩展HTTPPasswordMgrWithDefaultRealm为支持始终应发送身份验证凭据的跟踪URI。

HTTPPasswordMgrWithPriorAuth.add_passwordrealmuriuserpasswdis_authenticated = False 

领域uri用户密码是 HTTPPasswordMgr.add_password()。 is_authenticated设置is_authenticated给定URI或URI列表标志的初始值如果指定了is_authenticatedTrue则忽略realm

HTTPPasswordMgr.find_user_password领域authuri 

HTTPPasswordMgrWithDefaultRealm对象相同

HTTPPasswordMgrWithPriorAuth.update_authenticatedselfuriis_authenticated = False 

更新is_authenticated给定uri或URI列表标志

HTTPPasswordMgrWithPriorAuth.is_authenticatedselfauthuri 

返回is_authenticated给定URI 标志的当前状态

AbstractBasicAuthHandler对象

AbstractBasicAuthHandler.http_error_auth_reqedauthreqhostreqheaders 

通过获取用户/密码对来处理身份验证请求,然后重新尝试该请求。 authreq应该是头部的名称,其中有关域的信息包含在请求中,主机指定要进行身份验证的URL和路径,req应该是(失败的)Request对象, 标头应该是错误头。

host是权限(例如"python.org")或包含权限组件的URL(例如"http://python.org/")。在任何一种情况下,权限都不能包含userinfo组件(因此,"python.org"并且 "python.org:80"很好,"joe:password@python.org"不是)。

HTTPBasicAuthHandler对象

HTTPBasicAuthHandler.http_error_401reqfpcodemsghdrs 

如果可用,请使用身份验证信息重试请求。

ProxyBasicAuthHandler对象

ProxyBasicAuthHandler.http_error_407reqfpcodemsghdrs 

如果可用,请使用身份验证信息重试请求。

AbstractDigestAuthHandler对象

AbstractDigestAuthHandler.http_error_auth_reqedauthreqhostreqheaders 

authreq应该是标头的名称,其中有关域的信息包含在请求中,主机应该是要进行身份验证的主机,req 应该是(失败的)Request对象,标头应该是错误标头。

HTTPDigestAuthHandler对象

HTTPDigestAuthHandler.http_error_401reqfpcodemsghdrs 

如果可用,请使用身份验证信息重试请求。

ProxyDigestAuthHandler对象

ProxyDigestAuthHandler.http_error_407reqfpcodemsghdrs 

如果可用,请使用身份验证信息重试请求。

HTTPHandler对象

HTTPHandler.http_openreq 

发送HTTP请求,可以是GET或POST,具体取决于 req.has_data()

HTTPSHandler对象

HTTPSHandler.https_openreq 

发送HTTPS请求,可以是GET或POST,具体取决于 req.has_data()

FileHandler对象

FileHandler.file_openreq 

如果没有主机名或主机名,则在本地打开文件 'localhost'

版本3.2中已更改:此方法仅适用于本地主机名。当给出远程主机名时,URLError会引发一个。

DataHandler对象

DataHandler.data_openreq 

读取数据URL。这种URL包含URL本身编码的内容。数据URL语法在。中指定RFC 2397此实现忽略base64编码数据URL中的空格,因此URL可以包含在它来自的任何源文件中。但即使某些浏览器不介意在base64编码数据URL的末尾缺少填充,ValueError在这种情况下此实现也会引发

FTPHandler对象

FTPHandler.ftp_openreq 

打开req指示的FTP文件登录始终使用空用户名和密码完成。

CacheFTPHandler对象

CacheFTPHandler对象是FTPHandler具有以下附加方法的对象:

CacheFTPHandler.setTimeout

将连接超时设置为t秒。

CacheFTPHandler.setMaxConns

将最大缓存连接数设置为m

UnknownHandler对象

UnknownHandler.unknown_open

提出URLError例外。

HTTPErrorProcessor对象

HTTPErrorProcessor.http_response请求回复

处理HTTP错误响应。

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

对于非200错误代码,这只是将作业传递给 http_error_<type>()处理程序方法,通过OpenerDirector.error()最终,如果没有其他处理程序处理错误HTTPDefaultErrorHandler将引发一个HTTPError

HTTPErrorProcessor.https_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<html
xmlns="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对象。这是因为urlopen无法自动确定从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 python
import sys
data = sys.stdin.read()
print('Content-type: text/plain\n\nGot Data: "%s"' % data)

以下是PUT使用Request以下命令执行请求的示例

import urllib.request
DATA = b'some data'
req = urllib.request.Request(url='http://localhost:8080', data=DATA,method='PUT')
with urllib.request.urlopen(req) as f:
    pass
print(f.status)
print(f.reason)

使用基本HTTP身份验证:

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()默认提供许多处理程序,包括a 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.request
req = 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标头Request要改变这个:

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

此外,请记住,传递给(或 时会添加一些标准标头(Content-Length, Content-TypeHost)。Requesturlopen()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之前被编码为字节:

>>>
>>> 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代理,覆盖环境设置:

>>>
>>> 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')
...

传统界面

以下函数和类从Python 2模块移植 urllib(而不是urllib2)。他们可能会在将来的某个时候被弃用。

urllib.request.urlretrieveurlfilename = Nonereporthook = Nonedata = None 

将URL表示的网络对象复制到本地文件。如果URL指向本地文件,则除非提供filename,否则不会复制该对象。返回一个元组,其中filename是可以在其下找到对象的本地文件名,而headers返回的对象方法(对于远程对象)。例外情况与之相同(filename, headers)info()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:scheme标识符, 则可以给出可选的data参数来指定POST请求(通常是请求类型GET)。数据参数必须是在标准bytes对象 应用程序/ x-WWW窗体-urlencoded格式; 看到这个 urllib.parse.urlencode()功能。

urlretrieve()ContentTooShortError当它检测到可用数据量小于预期数量(这是Content-Length标头报告的大小)时 将引发例如,当下载中断时,可能会发生这种情况。

内容长度被视为一个下界:如果有更多的数据读取,读取urlretrieve更多的数据,但如果较少的数据是可用的,它引发异常。

在这种情况下,您仍然可以检索下载的数据,它存储在content异常实例的 属性中。

如果未提供Content-Length标头,则urlretrieve无法检查已下载的数据的大小,只返回它。在这种情况下,您只需假设下载成功。

urllib.request.urlcleanup

清除之前调用可能遗留的临时文件urlretrieve()

class urllib.request.URLopenerproxies = None** x509 

从版本3.3开始不推荐使用。

用于打开和读取URL的基类。除非你需要使用比其他方案来支持开放的对象http:ftp:或者file:,你可能想使用FancyURLopener

默认情况下,URLopener该类发送User-Agent标头urllib/VVV,其中VVVurllib版本号。应用程序可以通过子类化将class属性设置 为子类定义中的相应字符串值来定义自己的User-Agent标头 URLopenerFancyURLopenerversion

可选的proxies参数应该是一个字典映射方案名称到代理URL,其中空字典完全关闭代理。它的默认值是None,在这种情况下,如果存在,将使用环境代理设置,如urlopen()上面定义中所讨论的

x509中收集的附加关键字参数可以在使用该https:方案时用于客户端的认证支持关键字 key_filecert_file以提供SSL密钥和证书; 两者都需要支持客户端身份验证。

URLopenerOSError如果服务器返回错误代码,对象将引发异常。

openfullurldata = None 

使用适当的协议打开fullurl此方法设置缓存和代理信息,然后使用其输入参数调用适当的open方法。如果方案未被识别,open_unknown()则被调用。数据参数的含义相同数据的说法 urlopen()

这种方法会引用fullurl使用quote()

open_unknownfullurldata = None 

用于打开未知URL类型的可覆盖接口。

retrieveurlfilename = Nonereporthook = Nonedata = None 

检索url的内容并将其放在filename中返回值是一个元组,由一个本地文件名和一个email.message.Message包含响应头(对于远程URL)或None(对于本地URL)的对象组成。然后调用者必须打开并读取文件名的内容如果未给出filename且URL引用本地文件,则返回输入文件名。如果URL非本地和 文件名没有给出,则该文件的输出tempfile.mktemp() 与输入URL的最后一个路径成分的后缀匹配的后缀。如果举报如果给出,它必须是一个接受三个数字参数的函数:一个块号,读入的最大大小块和下载的总大小(如果未知,则为-1)。它将在开始时调用一次,并在从网络读取每个数据块之后调用。 本地URL会忽略reporthook

如果url使用http:scheme标识符, 则可以给出可选的data参数来指定POST请求(通常是请求类型GET)。数据参数必须在标准 应用程序/ x-WWW窗体-urlencoded格式; 看到这个 urllib.parse.urlencode()功能。

version

变量,指定opener对象的用户代理。要 urllib告诉服务器它是特定的用户代理,请在子类中将其设置为类变量,或者在调用基础构造函数之前在构造函数中设置它。

class urllib.request.FancyURLopener... 

从版本3.3开始不推荐使用。

FancyURLopener子类URLopener为以下HTTP响应代码提供默认处理:301,302,303,307和401.对于上面列出的30x响应代码,Location头用于获取实际URL。对于401响应代码(需要认证),执行基本HTTP认证。对于30x响应代码,递归受maxtries属性的值限制,默认值为10。

对于所有其他响应代码,将http_error_default()调用该方法,您可以在子类中覆盖该方法以适当地处理错误。

注意

 

根据信件 未经用户确认,不得自动重定向 RFC 2616,301和302对POST请求的响应。实际上,浏览器允许自动重定向这些响应,将POST更改为GET,并urllib重现此行为。

构造函数的参数与。的参数相同URLopener

注意

 

执行基本身份验证时,FancyURLopener实例会调用其prompt_user_passwd()方法。默认实现要求用户提供有关控制终端的所需信息。如果需要,子类可以重写此方法以支持更合适的行为。

FancyURLopener类提供了应该被重载,以提供适当的行为一个额外的方法:

prompt_user_passwd主持人领域

返回在指定安全领域中给定主机上验证用户所需的返回信息。返回值应为元组,可用于基本身份验证。(user, password)

实施提示在终端上提供此信息; 应用程序应重写此方法以在本地环境中使用适当的交互模型。

urllib.request限制

  • 目前,仅支持以下协议:HTTP(版本0.9和1.0),FTP,本地文件和数据URL。

    版本3.4中已更改:添加了对数据URL的支持。

  • 缓存功能urlretrieve()已被禁用,直到有人找到时间来破解到期时间标题的正确处理。

  • 应该有一个函数来查询特定的URL是否在缓存中。

  • 为了向后兼容,如果URL看起来指向本地文件但无法打开文件,则使用FTP协议重新解释URL。这有时会导致令人困惑的错误消息。

  • urlopen()urlretrieve()功能可能会导致任意长时间的延迟,而等待网络连接被建立。这意味着在不使用线程的情况下使用这些函数构建交互式Web客户端很困难。

  • 该数据由归国urlopen()或者urlretrieve()是服务器返回的原始数据。这可以是二进制数据(例如图像),纯文本或(例如)HTML。HTTP协议在回复标头中提供类型信息,可以通过查看Content-Type 标头来检查。如果返回的数据是HTML,则可以使用该模块对其 html.parser进行解析。

  • 处理FTP协议的代码无法区分文件和目录。尝试读取指向无法访问的文件的URL时,这可能会导致意外行为。如果URL以a结尾/,则假定它引用目录并将相应地处理。但是,如果尝试读取文件导致550错误(意味着无法找到或无法访问URL,通常是出于权限原因),则该路径将被视为目录,以便在指定目录时处理该情况通过URL但尾随/已经离开了。当您尝试获取其读取权限使其无法访问的文件时,这可能会导致误导性结果; FTP代码将尝试读取它,失败并出现550错误,然后执行不可读文件的目录列表。如果需要细粒度控制,请考虑使用ftplib模块,子类化FancyURLopener或更改 _urlopener以满足您的需求。

urllib.response- urllib使用的响应类

urllib.response模块定义了定义像接口这样的最小文件的函数和类,包括read()readline()典型的响应对象是addinfourl实例,它定义一个info() 方法并返回头和一个geturl()返回url 方法。模块定义的功能由模块内部使用 urllib.request

评论
 我想说:
==已经到底了==
关注: 粉丝: 积分:
Copyright ©2018 工联信息网——打造最实用且免费的互联网资源共享社区
如有疑问和需求请致邮箱:need@glxxw2018.com
不良信息反馈及建议请致邮箱:accusation@glxxw2018.com
沪ICP备18018158号-1