You are here:  Home » Python » – 用于打开URL的可扩展库 – Internet协议和支持(Python教程)(参考资料)

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

源代码: Lib / urllib / request.py


urllib.request模块定义了有助于在复杂世界中打开URL(主要是HTTP)的函数和类 – 基本和摘要式身份验证,重定向,cookie等等.

也可以看看

推荐使用Requests包用于更高级别的HTTP客户端界面.

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

urllib.request.urlopenurl, data=None, [timeout, ] *, cafile=None, capath=None, cadefault=False, context=None

打开网址url,可以是字符串或Request对象.

data必须是指定要发送到服务器的附加数据的对象,或者None如果不需要这样的数据。详见Request

urllib.request模块使用HTTP / 1.1并包含Connection:closeHTTP请求中的标题.

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

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

可选的cafilecapath参数为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.

的文档中指定由遗产URLopenerFancyURLopener类显式处理的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:cafilecapath中加入

在版本3.2中更改:现在支持HTTPS虚拟主机(如果ssl.HAS_SNI为真).

版本3.2中的新功能:data可以是一个可迭代的对象.

在版本3.3中更改:cadefault已添加.

在版本3.4.3中更改:context已添加.

自版本3.6:cafile, capathcadefault以来已弃用而不赞成使用context。请改用ssl.SSLContext.load_cert_chain(),或者让ssl.create_default_context()为您选择系统的可信任CA证书.

urllib.request.install_openeropener

安装OpenerDirectorinstance作为默认的全局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.pathname2urlpath

转换路径名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.Requesturl, 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"如果dataNone"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错误响应的默认处理程序的类;所有的回应都变成了HTTPErrorexceptions.

class urllib.request.HTTPRedirectHandler

一个处理重定向的类.

class urllib.request.HTTPCookieProcessorcookiejar=None

一个处理HTTP Cookies的类.

class urllib.request.ProxyHandlerproxies=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_authenticatedupdate_authenticated方法(参见 HTTPPasswordMgrWithPriorAuth对象),那么处理程序将使用is_authenticated给定URI的结果,以确定是否使用请求输入身份验证凭据。如果is_authenticated为URI返回True,则发送凭据。如果is_authenticatedFalse,则不发送凭证,然后如果接收到401响应,则使用认证凭证重新发送请求。如果验证成功,则调用update_authenticated来设置is_authenticated True对于URI,以便后续请求URI或其任何超级URI将自动包含身份验证凭据.

新版本3.5:添加is_authenticated support.

class urllib.request.HTTPBasicAuthHandlerpassword_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.HTTPSHandlerdebuglevel=0, context=None, check_hostname=None

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

在版本3.2中更改:contextcheck_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.dataNone,或"POST"如果不是。这只对HTTP请求有意义.

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

Request.add_headerkey, val)的值

在请求中添加另一个标头。除了HTTP处理程序之外,所有处理程序都会忽略标头,并将它们添加到发送到服务器的标头列表中。请注意,不能有多个带有相同名称的标头,以后的调用将覆盖以前的调用以防key碰撞。目前,这不会丢失HTTP功能,因为所有标头在使用时都会超过曾经有一个(特定于标题)的方法,只使用一个标题来获得相同的功能.

Request.add_unredirected_header (key, header )

添加一个不会添加到重定向请求的标题.

Request.has_header(header)

返回实例是否具有指定标题(检查常规和非重定向).

Request.remove_headerheader

从请求实例中删除命名标题(包括常规标题和未标题标题).

版本3.4.

Request.get_full_url中的新内容(

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

更改版本3.4.

返回Request.full_url

Request.set_proxyhost, type

通过连接到代理服务器来准备请求。hosttype将替换实例的那些,实例的选择器将是构造函数中给出的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_handlerhandler

handler应该是BaseHandler。搜索以下方法,并将其添加到可能的链中(注意HTTP错误是特殊情况).

  • protocol_open() – 表示处理程序知道如何打开protocolURLs.
  • http_error_type()– 表示处理程序知道如何使用HTTP错误代码来处理HTTPerrors type.
  • protocol_error()– 表示处理程序知道如何处理错误(非_httpprotocol.
  • protocol_request()– 表示处理程序知道如何预处理protocol requests
  • protocol_response() – 表示处理程序知道如何处理protocol响应.
OpenerDirector.openurl, data=None [, timeout]

打开给定的url(可以是请求对象或字符串),可选地通过给定的data。提出的参数,返回值和异常与urlopen()(它只是在当前安装的全局open()上调用OpenerDirector方法)。Theoptional timeout参数指定阻塞操作(如连接尝试)的超时秒数(如果未指定,将使用全局defaulttimeout设置)。超时功能实际上只适用于HTTP,HTTPS和FTP连接).

OpenerDirector.errorproto, *args

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

返回的值和异常与urlopen().

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

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

  1. 使用名为protocol_request()有那种方法要求预处理请求.

  2. 处理程序的方法名为protocol_open()被召唤来处理请求。当一个处理程序返回非_时,此阶段结束None值(即响应),或引发异常(通常是URLError)。允许异常传播.

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

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

  3. 每个处理程序都有一个名为protocol_response()那个方法叫做后处理响应.

BaseHandler Objects

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

BaseHandler.add_parentdirector

添加导演为父母.

BaseHandler.close

删除任何父母.

以下属性和方法只能用于BaseHandler.

引用的类

已经采用了约定protocol_request()protocol_response()方法名为*Processor;所有其他名称*Handler.

BaseHandler.parent

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

BaseHandler.default_open (req

这个方法notBaseHandler,但子类应该定义它,如果他们想要捕获所有的URL .

这个方法,如果实现,将由父亲调用OpenerDirector。它应该返回一个类似文件的对象,如open() OpenerDirectorNone的返回值所述。它应该提升URLError,除非a真正特别的事情发生(例如,MemoryError不应该映射到URLError).

这个方法将在任何协议特定的打开方法之前调用.

BaseHandler.protocol_open (req )

这个方法notBaseHandler,但如果他们想要使用给定的协议来处理URL,则子类应该定义它.

这个方法,如果定义,将由父亲调用OpenerDirector。返回值应与default_open().

BaseHandler.unknown_openreq

这个方法是notBaseHandler中定义的,但是子类应该定义它,如果他们想要捕获所有没有特定注册处理程序的URL来打开它.

这个方法,如果实现,将由parentOpenerDirector。返回值应与default_open().

BaseHandler.http_error_defaultreq, fp, code, msg, hdrs

这个方法是not在中定义BaseHandler但是,如果子类打算为其他未处理的HTTPerrors提供一个catch-all,则应该重新设置它。它会被OpenerDirector得到错误,通常不应该在其他情况下调用.

req将是一个Request对象,fp将是一个类似文件的对象,带有HTTP错误体,code将是错误的三位数代码,msg将是用户可见的代码说明,而hdrs将是一个带有错误标题的映射对象.

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

BaseHandler.http_error_nnnreq, fp, code, msg, hdrs

nnn的返回值和异常应该是三位数的HTTP错误代码。这个方法也没有定义BaseHandler,但是当发生代码nnn的HTTP错误时,将在asubclass实例上调用(如果存在).

子类应该覆盖此方法来处理特定的HTTP错误.

引发的参数,返回值和异常应该与http_error_default().

BaseHandler.protocol_requestreq

相同。这个方法是notBaseHandler但是,如果子类想要预先处理给定协议的请求,则应该定义它.

这个方法,如果定义的话,将被父级调用OpenerDirector.req将是Request宾语。返回值应为Request宾语。

BaseHandler.protocol_responsereq, 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:网址。这个方法由theparent OpenerDirector获得HTTP’永久移动’响应时

HTTPRedirectHandler.http_error_302req, fp, code, msg, hdrs

和一样http_error_301(),但要求’发现’的回应.

HTTPRedirectHandler.http_error_303req, fp, code, msg, hdrs

和一样http_error_301(),但要求’看到其他’的回应.

HTTPRedirectHandler.http_error_307req, fp, code, msg, hdrs

和一样http_error_301(),但要求’临时重定向’响应.

HTTPCookieProcessor对象

HTTPCookieProcessor实例有一个属性:

HTTPCookieProcessor.cookiejar

http.cookiejar.CookieJar其中存放饼干.

ProxyHandler对象

ProxyHandler.protocol_openrequest

ProxyHandler会有一个方法protocol_open()每一个protocol在中有代理proxies在构造函数中给出的字典。该方法将修改通过代理的请求,通过调用request.set_proxy(),并调用链中的下一个处理程序来实际执行协议.

HTTPPasswordMgr对象

这些方法可以在HTTPPasswordMgrHTTPPasswordMgrWithDefaultRealm对象上找到

HTTPPasswordMgr.add_password// (realm, uri, user, passwd

uri可以是单个URI或一系列URI。realm, userpasswd必须是字符串。当(user, passwd)的认证和任何给定URI的超级URI被给出时,这会导致realm用作身份验证令牌.

HTTPPasswordMgr.find_user_password (realm, authuri)

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

对于HTTPPasswordMgrWithDefaultRealm物品,领域None如果给出realm没有匹配的用户/密码.

HTTPPasswordMgrWithPriorAuth对象

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

HTTPPasswordMgrWithPriorAuth.add_passwordrealm, 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_passwordrealm, authuri

HTTPPasswordMgrWithDefaultRealm对象

HTTPPasswordMgrWithPriorAuth.update_authenticatedself, uri, is_authenticated=False

更新给定is_authenticated或listof URI的uri标志.

HTTPPasswordMgrWithPriorAuth.is_authenticated (self, authuri

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

AbstractBasicAuthHandler Objects

AbstractBasicAuthHandler.http_error_auth_reqedauthreq, host, req, headers

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

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

HTTPBasicAuthHandler对象

HTTPBasicAuthHandler.http_error_401req, fp, code, msg, hdrs

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

ProxyBasicAuthHandler对象

ProxyBasicAuthHandler.http_error_407req, fp, code, msg, hdrs

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

AbstractDigestAuthHandler对象

AbstractDigestAuthHandler.http_error_auth_reqedauthreq, host, req, headers

authreq应该是头部的名称,其中包含请求中包含的有关realmis的信息,host应该是要验证的主机,req应该是(失败的)Request对象,而headers应该是错误的头文件

HTTPDigestAuthHandler对象

HTTPDigestAuthHandler.http_error_401req, fp, code, msg, hdrs

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

ProxyDigestAuthHandler对象

ProxyDigestAuthHandler.http_error_407req, fp, code, msg, hdrs

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

HTTPHandler对象

HTTPHandler.http_openreq

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

HTTPSHandler对象

HTTPSHandler.https_openreq

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

FileHandler Objects

FileHandler.file_openreq

如果没有主机名,则在本地打开文件,或者主机名是"localhost".

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

DataHandler Objects

DataHandler.data_openreq

读取一个数据URL。这种URL包含URLitself中编码的内容。数据URL语法在 RFC 2397 中指定。此实现在base64编码数据URL中标记空格,因此URL可以包含在它来自的任何源文件中。但即使有些浏览器没有注意到base64编码数据URL末尾缺少填充,这种实现会在这种情况下提升ValueError

FTPHandler Objects

FTPHandler.ftp_openreq

打开req指示的FTP文件。登录总是使用emptyusername和password.

CacheFTPHandler对象

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

CacheFTPHandler.setTimeoutt

设置连接超时到t秒.

CacheFTPHandler.setMaxConns (m

设置最大缓存连接数m.

UnknownHandler Objects

UnknownHandler.unknown_open

举起URLErrorexception.

HTTPErrorProcessor Objects

HTTPErrorProcessor.http_responserequest, response

处理HTTP错误响应

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

对于非200错误代码,这只是将作业传递给protocol_error_code()处理程序方法,通过OpenerDirector.error()。最后,HTTPDefaultErrorHandler将如果没有其他处理程序处理错误,则HTTPError举起

HTTPErrorProcessor.https_responserequest, 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)

这是使用PUT执行Request请求的示例

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-TypeHost)当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")...

以下示例在以下示例中不使用代理all,覆盖环境设置:

>>> 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//verthe 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:方案标识符,可以给出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.URLopenerproxies=None, **x509

自版本3.3以后已弃用.

用于打开和读取URL的基类。除非你需要使用http:, ftp:file:以外的方案支持openobjects,你可能想要使用FancyURLopener.

默认情况下,URLopener类发送一个User-Agent标题urllib/VVVVVV是个 urllib版本号。应用程序可以定义自己的User-Agent通过子类化URLopener要么 FancyURLopener并设置类属性version在子类定义中适当的字符串值.

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

//在x509,可以在使用https:方案时使用客户端的身份验证。关键字key_filecert_file支持提供SSL密钥和证书;两者都需要支持客户端身份验证.

URLopener如果服务器返回错误代码,对象将引发OSError异常.

openfullurl, data=None

使用适当的协议打开fullurl。此方法设置缓存和代理信息,然后使用其输入参数调用适当的open方法。如果方案无法识别,open_unknown()data参数和data // urlopen().

open_unknownfullurl, 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()方法。默认实现向用户询问控制终端上所需的信息。如果需要,子类可以使用此方法来支持更合适的行为.

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

prompt_user_passwdhost, 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.

评论被关闭。