python requests官方中文文档( 高级用法 Requests 2.18.1 文档 )

所需积分/C币:50 2018-08-13 23:24:55 4.35MB PDF
收藏 收藏 4
举报

python requests官方中文文档,进阶用法。本文档覆盖了requests库的一些高级特性
2018/5127 高级用法一 Requests218.1文档 *f do something prepped. body do something th prepped. headers resp= s send(prepped, strcam=strcam, ify=verify proxies=proxies cert=cert timeout=timeout print(resp. status code) SSL证书验证 Requests可以为HTPS请求验证SSL证书,航像web浏览器一样。SSL验证默认是开启的,如果证书验证失败, Requests会抛 出 SSLError: >>>requests.get('https://requestb.in') requests. exceptions. SSLError: hostname request. in'doesn't match either of *.herokuapp com,'herokuapp com 在该域名上我没有设置SSL,所以失败了。但 Github设置了SSL >>>requests.gethttps://github.comverify=true) <Response [200]> 你可以为 verify传入 CA BUNDLE文件的路径,或者包含可信仨CA让书文件的文件夹路径 >>>requests.get('https://github.com',verify=/path/to/certfile') 或者将其保持在会话中 s= requests. Session() s verify =/path/to/certfile 注解 如果 verify设为文作夹路径,文件夹必须通过 Open SSL提供的 C rehash工具处理。 你还可以通过 REQUESTS CA BUNDLE环境变量定义可信任CA列表 如果你将 verify设置为 False, Requests也能忽略对SSL证书的验证 >>>requests.gethttps://kennethreitz.org',verify-false) <Response [2001> 默认情况下, verify是设置为True的。选项 verify仅应用于上证书 #对于私有证书,你也可以传递个 CA BUNDLE文件的路径给 verify。你也可以设置 REQUEST_CA_ BUNDLE坏境变量 客户端证书 你也可以指定一个本地证书用作客户端证书,可以是单个文件(包含密钥和证书)或一个包含两个文件路径的元组 >>>requests.get(https://kennethreitz.org',cert=(/path/client.cert','/path/client.key')) <Response [2001> 或者保持在会话中 s= requests. Session U v: latest v s cert ='/path/client cert http://docs.python-requests,org/zhCn/lAtest/user/advanced.htrml#advance 3 2018/5127 高级用法一 Requests218.1文档 如果你指定了一个错误路径或一个无效的证书 >>>requests.get(https://kennethreitz.org',cert=/wrong_path/client.pem') SSLError: [Errno 336265225 ssl C: 347: error: 140B0009: SSL routines: SSL CTX use Privatekey file: PEM lib 警告 本地证书的私有ke必须是解密状态。目前, Requests不支持使用力密的key CA证书 Requests默认附带了一套它信任的根证书,米自于 Mozilla trust store。然而它们在每次 Requests更新时才会更新。这意味着如果 你固定使用某一版本的 Requests,你的证书有可能已经太旧了。 从 Requests2.4.0版之后,如果系统中装了 certifi包, Requests会试图使用它里边的证书。这样用户就可以在不修改代码的情况 下更新他们的可信任证书。 为了安全起见,我们建议你经常更新ceri! 响应体内容工作流 默认情况下,当你走行网络请求后,响应体会立即被下载。你可以通过 stream参数覆盖这个行为,推迟下载响应体直到访问 Response. content属性: tarballurl=https://github.com/kennethreitz/requests/tarball/master requests get(tarball_ url, stream=True) 此时仅有响应头被下载下来了,连接保持打开状态,因此允许我们根据条件获取内容: if int(r headers[ content-length ])< TOO-_LONG: content r content 你可以进一步使用 Response. iter content和 Response.iter_1ines方法米控制」T作流,或者以 Response,raw从底层 urllib3的 ur11b3. HttpreSponSe<ur1b3. response. HttprEspoNse读取未解码的相应体。 如果你在请求中扣streεm设为True,Reqμests无法将连接释放冋连接池,除非你消耗了所有的数据,或者调用了 Response,c1ose。这样会带来连接效率低下的问题。如果你发现你在使用 stream-True的同还在部分读取请求的body(或者 完全没有读取bod),那么你魷应该考虑使用with语句发送请求,这样可以保证请求一定会被关闭: withrequestsgethttp://httpbin.org/get',stream=true)asr: #在此处速购应。 保持活动状态(持久连接) 好消息归功于 urllib3,同一会话内的持久连接是完全白动处理的!同一会话内你发出的任何请求都会白动复用恰当的连接! 注意:只有所有的响应体数捱被读取完毕连接才会被释放为连接池;所以确保将 stream设置为 False或读取 Response对象的 content属性。 流式上传 Requests支持流式上传,这允许你发送大的数据流或文件而无需先把它们读入内存。要使用流式上传,仅需为你的请求体提供 个类文件对象即可 with open('massive-body')as f: requestspost('http://some.url/streamed',data=f) U v: latest v http://docs.python-requests,org/zhCn/lAtest/user/advanced.htrml#advance 4/12 2018/5127 高级用法— Requests218.1文档 警告 我们强烈建议你用二进制模式( binary mode)打开文件。这是因为 requests可能会为你提供 header中的 Content Length,在这种情况下该值会被设为文件的字节数。如果你用文本模式打开文件,就可能碰到错误。 块编码请求 对」出去和进来的请求, Requests也支持分块传输编码。要发送一个块编码的请求,仅需为你的请求体提供一个生成器(或任意 没有具体长度的迭代器) def geno yield hi ield there requestspost('http://some.url/chunked',data=geno) 对于分块的编码请求,我们最好使用 Response,iter_ content()对其数据进行迭代。在理想情况下,你的 request会设置 stream=True,这样你就可以通过调用 iter content并将分块大小参数设为None,从而进行分块的迭代。如果你要设置分块的 最大体积,你可以把分块大小参数设为仨意整数。 POST多个分块编码的文件 你可以在一个请求中发送多个文件。例如,假设你要上传多个图像文件到一个HTML表单,使用一个多文件 field叫做" images <input type="file"name="images" multiple="true required=true"/> 要实现,只要把文件设到一个元组的列表中,其中元组结构为( form field name,file_info) >>>url=http://httpbin.org/post >>>multiple files = (images,(foo. png, open( foo. png,'rb'),image/png)) ('images',(bar. png, open(bar. png,'rb),'image/png) >>>r=requests. post(url, files=multiple_files) >>>r text files:i images: 'data: image/png; base64,iVBORW...) Content-Type:multipart/form-data; boundary= 3131623adb2043caaeb5538cc7aa0b3a 放土 警告 我们强烈建议你用二进制模式( binary mode)打开文件。这是因为 requests可能会为你提供 header中的 Content Length,在这种情况下该值会被设为文件的字节数。如果你用文本模式打开文件,就可館碰到错误。 事件挂钩 Requests有一个钩了系统,你可以用米操控部分请求过程,或信号事件处理 叮用的钩了 response: 从一个请求产生的听应 你可以通过传递一个{ hook name:ca1 Lback function}字典给hoks请求参数为每个请求分配一个钩」函数 U v: latest v hooks=dict(response=print url http://docs.python-requests,org/zhCn/lAtest/user/advanced.htrml#advance 5/12 2018/5127 高级用法一 Requests218.1文档 callback function会接受一个数据块作为它的第一个参数 def print url(r, *args, **kwargs) print(r url) 若执行你的回调函数期问发生错误,系统会给出一个警告 若回调函数返回一个值,默认以该值替换传进来的教据。若函数未返囗仨何东西,也没有什么其他的影响。 我们来在运行期间打印一些清求方法的参数 >>>requests.get(http://httpbin.org',hooks-dict(response-printurl)) http://httpbin.org <Response [2001> 自定义身份验证 Requests允许你使用自己指定的身份验证机制。 任何传递给请求方法的auth参数的可调用对象,在请求发出之前都有机会修改请求 自定义的身份验证机制是作为 requests. auth, AuthBase的子类来实现的,也非常容易定义。 Requests在 requests,auh中提供 了两种常见的的身份验证方案: HttpbaSicaUth和 HttpdIgeStauTh。 假设我们有一个wb服务,仅在X-Piz头被设置为一个密码值的情况下才会有响应。虽然这不太可能,但就以它为例好了。 from requests. auth import authBase class PizzaAuth (Auth Base ): AttachesHTTPPizzaAuthenticationtothegivenRequestobject def init(self, username ): setup any auth-related data here self username username def call(self, r) t modify and return the request r headers[x-Pizza]= selfusername return r 然后就可以使用我们的 PizzaAuth米进行网络请求 >>>requests.get('http://pizzabin.org/admin',auth=pizzaauth('kenneTh')) <Response [2001> 流式请求 使用 Response,iter_ lines()你可以很方便地对流式APⅠ(例如 Twitter的流式API)进行迭代。简单地设置 stream为True便 可以使用iter1nes对相应进行迭代 import js import requests r=requests.get('http://httpbin.org/stream/20,stream=true) for line in r,iter lines(: tf filter out keep-alive new lines if line decoded line line decode( utf-8) print (ison loads(decoded line)) 当使用 decode unicode=Tτe在 Response,iter_ lines()或 Response. iter content()中时,你需要提供一个回退编码方式,以防 服务器没有提供默认回退编码,从而导致错误 v: latest r=requests.get('http://httpbin.org/stream/20,stream=true) http://docs.python-requests,org/zhCn/lAtest/user/advanced.htrml#advance 6/12 2018/5127 高级用法一 Requests2.18.1文档 if r encoding is None r encoding =utf-8 for line in r. iter lines(decode unicode=True) if linc print(ison loads(line)) 警告 iter_1ines不保记重进入时的安全性。多次调用该方法会导致部分收到的数据丢失。如果你要在多处调用它,就应该 使用生成的代器对象 lines =riter lines( #保存第一行以供后面夜用,者直接跳过 first line next (lines) for line in lines print(line 代理 如果需要使用代理,你可以通过为任意请求方法提供 proxies参数来配置单个请求: import requests proxies = i http":http://10.10.1.10:3128 https:http://10.10.1.10:1080 requests.get(http://example.org",proxies=proxies) 你也可以通过环境变量 Http Proxy和 Https Proxy来配置代理。 s export Http ProxY="Http: //10.10.1.10: 3128 s export Https ProxY="hTtp: //10.10.1.10: 1080 s python >〉 import requests >>>requests.get(http://example.org") 若你的代理需要使用 TP Basic auth,可以使用htt: user: password@mst/语法: proxies= t http":http://user:pass@10.10.1.10:3128/ 要为某个特定的连接方式或者主机设置代理,使用 schene:/ hostname作为key,它会针对指定的主机和连接方式进行匹配 proxies=ihttp://10.20.1.128:http://10.10.1.10:5323 注意,代理URL必须包含连接方式。 SOCKS 2.10.0新饭功能 狳了基本的HIP代玛, Request还支持 SOCKS协议的代理。这是一个可选功能,若要仗用,你需要安装第三方库。 你可以用pip获取依赖 U v: latest v http://docs.python-requests,org/zhCn/lAtest/user/advanced.htrml#advance 7/12 2018/5127 高级用法一 Requests218.1文档 s pip install requests [socks] 安装好依赖以后,使用 SOCKS代理和使用HTIP代理一样简单: proxies =i that socks5: //user: pass(host: port https:socks5://user:pass(host:port 合规性 Requests符合所有相关的规范和RFC,这样不会为用户造成不必要的困难。但这种对规范的考虑导致一些行为对于不熟悉相关 规范的人米说看似有点奇怿。 编码方式 当你收到一个响应时, Requests会猜测响应的编码方式,用于在你调用 Response,text方法时对响应进行解码。 Requests首先在 HITP头部检测是否存在指定的编码方式,如果不存在,则会使用 charade米尝试猜测编码方式。 只有当HTP头部不存在明确指定的字符集,并且 Content-Typ头部字毁包含text值之时, Requests才不去猜测编码方式 在这种情况下,RFC2616指定默认字符集必须是I50-8859-1。 Requests逆从这一抚范。如果你需要一种不同的编码方式,你 叮以手动设置 Response. encoding属性,或使用原始的 Response. content HTTP动词 Requests提供了几乎所有HT动词的功能:(H:T、 OPTIONS、HEAD)、PO)ST、PT、AT(H、 DELETE。以下内容为使用 Requests中的这些动词以及 Github api提供了洋细示例 我将从最常使用的动词GET开始。 Http Get是一个幂等方法,从给定的URL返回一个资源。因而,当你试图从一个web位 置获取数据之时,你应该使用这个动词。一个使用示例是尝试从 Github上获取关于一个特定 commit的信息。假设我们想获取 Requests的 commit a50faf的信息。我们可以这样去做 >> import requests >>>r=requests.get(https://api.github,com/repos/requests/requests/git/commits/a050faf084662f3a352dd1a941f2c7 我们应该确认( iit hub是否王确响应。如果正确响应,我们想弄清响应内容是什么类型的。像这样去做: >>>if(r status code = requests codes. ok): print r headers[ content-type] application/json; charset=utf-8 可见, Github返回了JsON数据,非常好,这样就可以使用r,json方法把这个返回的数据解析成 Python对象。 >>>commit data=r json ( >>print commit data keys() [u'committer,u'author,u'url',utree,u'sha', u'parents',u'message'] >>>print commit data[u'committer '] fu' date: u2012-05-10T11: 10: 50-07: 00,u'email: u me@kennethreitz, com,uname: u Kenneth Reitz'] >>>print commit_data[u'message'] makin histe 到目前为止,一切都非常简单。嗯,我们来研究一下 Github的API我们可以去看看文档,但如果使用 Requests来研究也许会 更有意思一点。我们可以借助 Requests的 OPTIONS动词来看看我们刚使用过的url支持哪些HTP方法。 >>>verbs requests. options(. url) >> verbs status code 59 U v: latest http://docs.python-requests,org/zhCn/lAtest/user/advanced.htrml#advance 8/12 2018/5127 高级用法一 Requests2.18.1文档 额,这是怎么回事?毫无帮助嘛!原来 Github,与许多AP提供方一样,实际上并未实现 OPTIONS方法。这是一个恼人的疏 忽,但没关系,那我们可以使用枯燥的文档。然而,如果 Github正确实现了○ PTIONS,那么服务器应该在响应头中返回允许 用户使用的HTTP方法,例如 >>>verbs-requestsoptions(http://a-good-website.com/api/cats') >> print verbs. headers[ allowI GET HEAD POST, OPTIONS 码库,我们应尽可能避免对它发送笨批的PTn作为替代,我们来玩玩(itib的1sNc.的 转而去查看文档,我们看到对于提交信息,另一个允许的方法是POST,它会创建一个新的提交。由于我们正在使用 Requests代 本篇文档是回应lsse#482而添加的。鉴丁该问趣己经存在,我们就以它为例。先获取它。 >>>r=requests.get('https://api.github.com/requests/kennethreitz/requests/issues/482') >>>r. status code 290 >>>issue json loads(r text) >>>print(issue[u'title'1) Featureanyhttpverbindocs >>>print(issue [u comments D) Cool,有3个评论。我们来看一下最后一个评论 >>>r=requests get(. url +u/comments >>>r status code 289 >>>comments =r json() >>> print comments[a].keys() Lu'body, u'uri, created_at,u' updated _at,uuser >>>print comments[2I[u body '] Probably in the advanced" section 嗯,那看起来似乎是个愚蠢之处。我们发表个评论来告诉这个评论老他自己的愚蠢。那么,这个评论者是谁呢? >>>print comments[2[uuser I[u'login '] kennethreitz 好,我们来告诉这个叫 Kenneth的家伙,这个例子应该放在快速上手指南屮。根据 GitHub api文档,其方法是POST到该话 题。我们来试试看。 >>>body = json dumps(lu"body": u" Sounds great! I'll get right on it! " y) >>url=uhttps://api.github.com/repos/requests/requests/issues/482/comments >>>r=requests. post(url=url, data=body) >>>r. status code 484 颔,这有点古怪哈。可能我们需要验证身份。那就有点纠结了,对吧?不对。 Requests简化了多种身份验证形式的使用,包括非 常常见的 Basic auth >>>from requests auth import HttpbAsicAutH >>>auth=httpbasicauth(fake@example.com','notareal_password) >>>r=requests. post(url=url, data=body, auth=auth >>>r status code 221 >>>content =r json() >> print(content[body Sounds great! I ll get right on it 太棒了!噢,不!我原本是想说等我一会,囚灲我得去喂我的猫。如果我能够编辑这条评论那就好了!幸运的是, CE lAtest+ 我们使用另一个HTTP动词PATCH来编辑评论。我们来试试。 http://docs.python-requests,org/zhCn/lAtest/user/advanced.htrml#advance 9/12 2018/5127 高级用法一 Requests218.1文档 >>>print(content[u"id"]) 584413 >>>url=u"https://api.github.com/repos/requests/requests/issues/comments/5804413"cat."3) >>>body json dumps([u"body": u"Sounds great! I'll get right on it once I feed my >>>r= requests. patch (url=url, data=body, auth=auth) >>>r. status code 非常好。现在,我们釆折磨一下这个叫 Kenneth的家伙,我次定要让他急得团团转,也不告诉他是我在捣蛋。这意味着我想删 狳这条评论。 Github允许我们使用完全名副其实的 DELETE方沄来删除评论。我们来清除该评论 >>>r=requests. delete(url=url, auth=auth) >>>r. status code 284 >>>r headers['status] 204 No Content 很好。不见了。最后件我想知道的事情是我凵经使用了多少狠额( ratelimit)。查查看, Github在响应头部发送这个信息,因 此不必下载整个网页,我将使用一个HEAD请求来获取响应头 >>>r=requests. head(url=url, auth=auth) print r headers x-ratelimit-remaining: 4995 x-ratelimit-limit:5000 很好。是时候写个 Python程序以各和刺激的方式滥用 Github的AP,还可以使用4995次呢 定制动词 有时候你会碰到一些服务器,处于某些原因,它们允许或者要求用户使用上述HTTP动词之外的定制动词。比如说WEBDAV服 务器会要求你使用MK(XOL方法。别担心, Requests一样可以搞定它们。你可以使用内建的. request方法,例如 >>>r=requests. request( MKcol, url, data-data) >>>r. status code 200 Assuming your call was correct 这样你就可以使用服务器要求的任意方法动词了 响应头链接字段 许多 Http Api都有响应头链接字段的特性,它们使得API能够更好地自我描述和自我显露。 Github在API中为分页使用这些特性,例如: >>>url=https://api.github.com/users/kennethreitz/repos?page=1&per_page=10 >>>r=requests. head(url=url) >>>r headers[ link'I <https://api.github.com/users/kennethreitz/repos?page=2&perpage=l0>;rel="next",<https://api.github.com/user Requests会自动解析这些响应头链接字段,并使得它们非常易于使用: >>>rlinks["next"] furl:'https://api.github.com/users/kennethreitz/repos?page=2&perpage=10,'r next >>>rlinks["last"] furl:https://api.github.com/users/kennethreitz/repos?page=7&perpage=10,rel:last 传输适配器 U v: latest v http://docs.python-requests,org/zhCn/lAtest/user/advanced.htrml#advance 10/12

...展开详情
试读 12P python requests官方中文文档( 高级用法 Requests 2.18.1 文档 )
立即下载 低至0.43元/次 身份认证VIP会员低至7折
    抢沙发
    一个资源只可评论一次,评论内容不能少于5个字
    关注 私信 TA的资源
    上传资源赚积分,得勋章
    最新推荐
    python requests官方中文文档( 高级用法 Requests 2.18.1 文档 ) 50积分/C币 立即下载
    1/12
    python requests官方中文文档( 高级用法 Requests 2.18.1 文档 )第1页
    python requests官方中文文档( 高级用法 Requests 2.18.1 文档 )第2页
    python requests官方中文文档( 高级用法 Requests 2.18.1 文档 )第3页
    python requests官方中文文档( 高级用法 Requests 2.18.1 文档 )第4页

    试读已结束,剩余8页未读...

    50积分/C币 立即下载 >