广告
返回顶部
首页 > 资讯 > 后端开发 > Python >python requests 高级用法
  • 577
分享到

python requests 高级用法

高级pythonrequests 2023-01-31 01:01:58 577人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

本篇文档涵盖了 Requests 的一些高级特性。 会话对象会话对象让你能够跨请求保持某些参数。它也会在同一个 Session 实例发出的所有请求之间保持 cookie, 期间使用 urllib3 的 connection pooling

本篇文档涵盖了 Requests 的一些高级特性。

 

会话对象

会话对象让你能够跨请求保持某些参数。它也会在同一个 Session 实例发出的所有请求之间保持 cookie, 期间使用 urllib3 的 connection pooling 功能。所以如果你向同意主机发送多个请求,底层的 tcp 连接将会被重用,从而带来显著的性能提升。 (参见 Http persistent connection).

会话对象具有主要的 Requests api 的所有方法。

我们来跨请求保持一些 cookie:

会话也可用来为请求方法提供缺省数据。这是通过为会话对象的属性提供数据来实现的:

任何你传递给请求方法的字典都会与已设置会话层数据合并。方法层的参数覆盖会话的参数。

不过需要注意,就算使用了会话,方法级别的参数也不会被跨请求保持。下面的例子只会和第一个请求发送 cookie ,而非第二个:

如果你要手动为会话添加 cookie,就是用 Cookie utility 函数 来操纵 Session.cookies

会话还可以用作前后文管理器:

这样就能确保 with 区块退出后会话能被关闭,即使发生了异常也一样。

从字典参数中移除一个值

有时你会想省略字典参数中一些会话层的键。要做到这一点,你只需简单地在方法层参数中将那个键的值设置为 None ,那个键就会被自动省略掉。

包含在一个会话中的所有数据你都可以直接使用。学习更多细节请阅读 会话 API 文档。

 

请求与响应对象

任何时候调用 requests.*() 你都在做两件主要的事情。其一,你在构建一个 Request 对象, 该对象将被发送到某个服务器请求或查询一些资源。其二,一旦 requests 得到一个从 服务器返回的响应就会产生一个 Response 对象。该响应对象包含服务器返回的所有信息, 也包含你原来创建的 Request 对象。如下是一个简单的请求,从 Wikipedia 的服务器得到 一些非常重要的信息:

如果想访问服务器返回给我们的响应头部信息,可以这样做:

然而,如果想得到发送到服务器的请求的头部,我们可以简单地访问该请求,然后是该请求的头部:

 

准备的请求 (Prepared Request)

当你从 API 或者会话调用中收到一个 Response 对象时,request 属性其实是使用了PreparedRequest。有时在发送请求之前,你需要对 body 或者 header (或者别的什么东西)做一些额外处理,下面演示了一个简单的做法:

由于你没有对 Request 对象做什么特殊事情,你立即准备和修改了 PreparedRequest 对象,然后把它和别的参数一起发送到 requests.* 或者 Session.*

然而,上述代码会失去 Requests Session 对象的一些优势, 尤其 Session 级别的状态,例如 cookie 就不会被应用到你的请求上去。要获取一个带有状态的 PreparedRequest, 请用Session.prepare_request() 取代 Request.prepare() 的调用,如下所示:

 

SSL 证书验证

Requests 可以为 https 请求验证 SSL 证书,就像 WEB 浏览器一样。要想检查某个主机的 SSL 证书,你可以使用 verify 参数:

在该域名上我没有设置 SSL,所以失败了。但 GitHub 设置了 SSL:

对于私有证书,你也可以传递一个 CA_BUNDLE 文件的路径给 verify。你也可以设置REQUEST_CA_BUNDLE 环境变量。

如果你将 verify 设置为 False,Requests 也能忽略对 SSL 证书的验证。

默认情况下, verify 是设置为 True 的。选项 verify 仅应用于主机证书。

你也可以指定一个本地证书用作客户端证书,可以是单个文件(包含密钥和证书)或一个包含两个文件路径的元组:

如果你指定了一个错误路径或一个无效的证书:

警告

本地证书的私有 key 必须是解密状态。目前,Requests 不支持使用加密的 key。

 

响应体内容工作流

默认情况下,当你进行网络请求后,响应体会立即被下载。你可以通过 stream 参数覆盖这个行为,推迟下载响应体直到访问 Response.content 属性:

此时仅有响应头被下载下来了,连接保持打开状态,因此允许我们根据条件获取内容:

你可以进一步使用 Response.iter_content 和 Response.iter_lines 方法来控制工作流,或者以 Response.raw 从底层 urllib3 的 urllib3.HTTPResponse <urllib3.response.HTTPResponse读取。

如果你在请求中把 stream 设为 True,Requests 无法将连接释放回连接池,除非你 消耗了所有的数据,或者调用了 Response.close。 这样会带来连接效率低下的问题。如果你发现你在使用stream=True 的同时还在部分读取请求的 body(或者完全没有读取 body),那么你就应该考虑使用 contextlib.closing (文档), 如下所示:

 

流式上传

Requests支持流式上传,这允许你发送大的数据流或文件而无需先把它们读入内存。要使用流式上传,仅需为你的请求体提供一个类文件对象即可:

 

块编码请求

对于出去和进来的请求,Requests 也支持分块传输编码。要发送一个块编码的请求,仅需为你的请求体提供一个生成器(或任意没有具体长度的迭代器):

 

POST 多个分块编码的文件

你可以在一个请求中发送多个文件。例如,假设你要上传多个图像文件到一个 HTML 表单,使用一个多文件 field 叫做 “images”:

要实现,只要把文件设到一个元组的列表中,其中元组结构为 (fORM_field_name, file_info):

 

事件挂钩

Requests有一个钩子系统,你可以用来操控部分请求过程,或信号事件处理。

可用的钩子:

response:
从一个请求产生的响应

你可以通过传递一个 {hook_name: callback_function} 字典给 hooks 请求参数 为每个请求分配一个钩子函数:

callback_function 会接受一个数据块作为它的第一个参数。

若执行你的回调函数期间发生错误,系统会给出一个警告。

若回调函数返回一个值,默认以该值替换传进来的数据。若函数未返回任何东西, 也没有什么其他的影响。

我们来在运行期间打印一些请求方法的参数:

 

自定义身份验证

Requests 允许你使用自己指定的身份验证机制。

任何传递给请求方法的 auth 参数的可调用对象,在请求发出之前都有机会修改请求。

自定义的身份验证机制是作为 requests.auth.AutHBase 的子类来实现的,也非常容易定义。Requests 在 requests.auth 中提供了两种常见的的身份验证方案: HTTPBasicAuth 和HTTPDigestAuth 。

假设我们有一个web服务,仅在 X-Pizza 头被设置为一个密码值的情况下才会有响应。虽然这不太可能,但就以它为例好了。

然后就可以使用我们的PizzaAuth来进行网络请求:

 

流式请求

使用 requests.Response.iter_lines() 你可以很方便地对流式 API (例如 Twitter 的流式 API) 进行迭代。简单地设置 stream 为 True 便可以使用 iter_lines() 对相应进行迭代:

警告

iter_lines() 不保证重进入时的安全性。多次调用该方法 会导致部分收到的数据丢失。如果你要在多处调用它,就应该使用生成的迭代器对象:

 

代理

如果需要使用代理,你可以通过为任意请求方法提供 proxies 参数来配置单个请求:

你也可以通过环境变量 HTTP_PROXY 和 HTTPS_PROXY 来配置代理。

若你的代理需要使用HTTP Basic Auth,可以使用 http://user:passWord@host/ 语法:

要为某个特定的连接方式或者主机设置代理,使用 scheme://hostname 作为 key, 它会针对指定的主机和连接方式进行匹配。

注意,代理 URL 必须包含连接方式。

SOCKS

除了基本的 HTTP 代理,Request 还支持 SOCKS 协议的代理。这是一个可选功能,若要使用, 你需要安装第三方库。

你可以用 pip 获取依赖:

安装好依赖以后,使用 SOCKS 代理和使用 HTTP 代理一样简单:

 

HTTP动词

Requests 提供了几乎所有HTTP动词的功能:GET、OPTIONS、HEAD、POST、PUT、PATCH、DELETE。以下内容为使用 Requests 中的这些动词以及 Github API 提供了详细示例。

我将从最常使用的动词 GET 开始。HTTP GET 是一个幂等方法,从给定的 URL 返回一个资源。因而,当你试图从一个 web 位置获取数据之时,你应该使用这个动词。一个使用示例是尝试从 Github 上获取关于一个特定 commit 的信息。假设我们想获取Requests的commit a050faf 的信息。我们可以这样去做:

我们应该确认 GitHub 是否正确响应。如果正确响应,我们想弄清响应内容是什么类型的。像这样去做:

可见,GitHub 返回了 JSON 数据,非常好,这样就可以使用 r.json 方法把这个返回的数据解析成 Python 对象。

到目前为止,一切都非常简单。嗯,我们来研究一下 GitHub 的 API。我们可以去看看文档,但如果使用 Requests 来研究也许会更有意思一点。我们可以借助 Requests 的 OPTIONS 动词来看看我们刚使用过的 url 支持哪些 HTTP 方法。

额,这是怎么回事?毫无帮助嘛!原来 GitHub,与许多 API 提供方一样,实际上并未实现 OPTIONS 方法。这是一个恼人的疏忽,但没关系,那我们可以使用枯燥的文档。然而,如果 GitHub 正确实现了 OPTIONS,那么服务器应该在响应头中返回允许用户使用的 HTTP 方法,例如:

转而去查看文档,我们看到对于提交信息,另一个允许的方法是 POST,它会创建一个新的提交。由于我们正在使用 Requests 代码库,我们应尽可能避免对它发送笨拙的 POST。作为替代,我们来玩玩 GitHub 的 Issue 特性。

本篇文档是回应 Issue #482 而添加的。鉴于该问题已经存在,我们就以它为例。先获取它。

Cool,有 3 个评论。我们来看一下最后一个评论。

嗯,那看起来似乎是个愚蠢之处。我们发表个评论来告诉这个评论者他自己的愚蠢。那么,这个评论者是谁呢?

好,我们来告诉这个叫 Kenneth 的家伙,这个例子应该放在快速上手指南中。根据 GitHub API 文档,其方法是 POST 到该话题。我们来试试看。

额,这有点古怪哈。可能我们需要验证身份。那就有点纠结了,对吧?不对。Requests 简化了多种身份验证形式的使用,包括非常常见的 Basic Auth。

太棒了!噢,不!我原本是想说等我一会,因为我得去喂我的猫。如果我能够编辑这条评论那就好了!幸运的是,GitHub 允许我们使用另一个 HTTP 动词 PATCH 来编辑评论。我们来试试。

非常好。现在,我们来折磨一下这个叫 Kenneth 的家伙,我决定要让他急得团团转,也不告诉他是我在捣蛋。这意味着我想删除这条评论。GitHub 允许我们使用完全名副其实的 DELETE 方法来删除评论。我们来清除该评论。

很好。不见了。最后一件我想知道的事情是我已经使用了多少限额(ratelimit)。查查看,GitHub 在响应头部发送这个信息,因此不必下载整个网页,我将使用一个 HEAD 请求来获取响应头。

很好。是时候写个 Python 程序以各种刺激的方式滥用 GitHub 的 API,还可以使用 4995 次呢。

 

响应头链接字段

许多 HTTP API 都有响应头链接字段的特性,它们使得 API 能够更好地自我描述和自我显露。

GitHub 在 API 中为 分页 使用这些特性,例如:

Requests 会自动解析这些响应头链接字段,并使得它们非常易于使用:

 

传输适配器

从 v1.0.0 以后,Requests 的内部采用了模块化设计。部分原因是为了实现传输适配器(Transport Adapter),你可以看看关于它的最早描述。传输适配器提供了一个机制,让你可以为 HTTP 服务定义交互方法。尤其是它允许你应用服务前的配置。

Requests 自带了一个传输适配器,也就是 HTTPAdapter。 这个适配器使用了强大的 urllib3,为 Requests 提供了默认的 HTTP 和 HTTPS 交互。每当 Session 被初始化,就会有适配器附着在Session 上,其中一个供 HTTP 使用,另一个供 HTTPS 使用。

Request 允许用户创建和使用他们自己的传输适配器,实现他们需要的特殊功能。创建好以后,传输适配器可以被加载到一个会话对象上,附带着一个说明,告诉会话适配器应该应用在哪个 web 服务上。

这个 mount 调用会注册一个传输适配器的特定实例到一个前缀上面。加载以后,任何使用该会话的 HTTP 请求,只要其 URL 是以给定的前缀开头,该传输适配器就会被使用到。

传输适配器的众多实现细节不在本文档的覆盖范围内,不过你可以看看接下来这个简单的 SSL 用例。更多的用法,你也许该考虑为requests.adapters.BaseAdapter 创建子类。

示例: 指定的 SSL 版本

Requests 开发团队刻意指定了内部库(urllib3)的默认 SSL 版本。一般情况下这样做没有问题,不过是不是你可能会需要连接到一个服务节点,而该节点使用了和默认不同的 SSL 版本。

你可以使用传输适配器解决这个问题,通过利用 HTTPAdapter 现有的大部分实现,再加上一个ssl_version 参数并将它传递到 urllib3 中。我们会创建一个传输适配器,用来告诉 urllib3 让它使用 SSLv3:

Header 排序

在某些特殊情况下你也许需要按照次序来提供 header,如果你向 headers 关键字参数传入一个OrderedDict,就可以向提供一个带排序的 header。然而,Requests 使用的默认 header 的次序会被优先选择,这意味着如果你在 headers 关键字参数中覆盖了默认 header,和关键字参数中别的 header 相比,它们也许看上去会是次序错误的。

如果这个对你来说是个问题,那么用户应该考虑在 Session 对象上面设置默认 header,只要将Session 设为一个定制的 OrderedDict 即可。这样就会让它成为优选的次序。

--结束END--

本文标题: python requests 高级用法

本文链接: https://www.lsjlt.com/news/184748.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • python requests 高级用法
    本篇文档涵盖了 Requests 的一些高级特性。 会话对象会话对象让你能够跨请求保持某些参数。它也会在同一个 Session 实例发出的所有请求之间保持 cookie, 期间使用 urllib3 的 connection pooling...
    99+
    2023-01-31
    高级 python requests
  • python Requests 初级
    一、介绍    Requests 是用Python语言编写,基于 urllib,但是它比 urllib 更加方便,可以节约我们大量的工作,完全满足 HTTP 测试需求。Requests 的哲学是以 PEP 20 的习语为中心开发的,所以它比...
    99+
    2023-01-31
    python Requests
  • Python中第三方库Requests库的高级用法详解
    一、Requests库的安装 利用 pip 安装,如果你安装了pip包(一款Python包管理工具,不知道可以百度哟),或者集成环境,比如Python(x,y)或者anaconda的话,就可以直接使用pi...
    99+
    2022-06-04
    第三方 详解 高级
  • python requests用法总结
    python requests用法总结requests是一个很实用的Python HTTP客户端库,编写爬虫和测试服务器响应数据时经常会用到。可以说,Requests 完全满足如今网络的需求本文全部来源于官方文档:   http://doc...
    99+
    2023-01-31
    python requests
  • Python中requests库的用法详解
    目录一、requests库安装请求响应二、发送get请求1、一个带参数的get请求:2、响应json3、添加头信息headers4、添加和获取cookie信息三、发送post请求1、...
    99+
    2022-11-11
  • python requests自定义方法
    今天改造一个iis6 put上传漏洞的一个脚本,以前使用http.client完成,但个人觉得有一些麻烦,就想用第三方库requests来实现,却发现requests中并没有move方法查了一下,发现requests.requests可以自...
    99+
    2023-01-31
    自定义 方法 python
  • Python的requests参数及方法
    介绍 Python的requests模块是一个常用的HTTP库,用于发送HTTP请求和处理响应。下面是requests模块的一些常用参数和方法的介绍: 安装 要使用requests模块,首先需要安装它...
    99+
    2023-10-25
    python 开发语言
  • Python的高级用法有哪些
    本篇内容主要讲解“Python的高级用法有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python的高级用法有哪些”吧!Lambda 函数Lambda 函数是一种比较小的匿名函数&...
    99+
    2023-06-16
  • requests基本用法
    requests比起urllib更加方便简单,有了它,cookies,登陆验证,代理设置等操作都很容易解决.安装requestspip3 install requests基本用法import requests r =&...
    99+
    2023-01-30
    requests
  • python利用requests和thr
      利用爬到的数据,基于Django搭建的一个最新电影信息网站:    n1celll.xyz   今天想利用所学知识来爬取电影天堂所有最新电影信息,用到的模块:     requests:用于获取网页信息     re:获取网页中具体想...
    99+
    2023-01-31
    python requests thr
  • Python requests用法和django后台处理详解
    目录1、requests 的常见用法1.1、提交查询1.2、提交表格1.3、在提交时附加文件:1.4、保持状态1.5、查看结果2、django 的处理2.1、params 传入的参数...
    99+
    2022-11-13
  • python的一些高级语法
    1.python 可迭代对象的写法a.循环版-迭代器通过实现类的属性方法实现class Fab(object):     def __init__(self, max):         self.max = max         sel...
    99+
    2023-01-31
    语法 高级 python
  • Python 正则表达式的高级用法
    对于Python来说,学习正则就要学习模块re的使用方法。本文将展示一些大家都应该掌握的高级技巧。 编译正则对象 re.compile函数根据一个模式字符串和可选的标志参数生成一个正则表达式对象。该对象拥有...
    99+
    2022-06-04
    高级 正则表达式 Python
  • python高级内置函数用法实例
    1、enumerate返回针对序列类型的可迭代对象的枚举对象。 2、eval取出字符串中的内容。 将str中有效的表达式返回计算结果。 3、exec运行编译后的字符串。 4、filt...
    99+
    2022-11-12
  • golang 高级用法
    Go 是一种现代的、开源的编程语言,其设计初衷是为了提高程序员的工作效率和代码可读性。Go 具有简单易学、高效快速、并发支持等特点,备受程序员青睐。然而,除了基本语言特性和语法之外,很多人对 Go 的高级用法并不熟悉。本文将介绍 Go 的一...
    99+
    2023-05-16
  • 解决Python requests 报错方法集锦
    python版本和ssl版本都会导致 requests在请求https网站时候会出一些错误,最好使用新版本。 1 Python2.6x use requests 一台老Centos机器上跑着古老的应用,加了...
    99+
    2022-06-04
    报错 集锦 方法
  • 离线安装python的requests库方法
    目录前言1、下载安装包1.1 检查requests模块所需依赖包1.2 下载requests所需依赖包1.3 下载requests包2、安装2.1 安装requests所需依赖包2....
    99+
    2022-11-13
  • python requests post如何使用
    本篇内容主要讲解“python requests post如何使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“python requests post如...
    99+
    2023-07-05
  • python利用requests模拟ht
    一、通过requests发送请求之前一直使用urllib以及urllib2模拟http请求发送,在实际场景中,我们需要造自己定义好的header、body等等,使用urllib很麻烦,很偶然的机会,接触到了requests,可以通过发送xm...
    99+
    2023-01-31
    python requests ht
  • Python之requests的使用(一)
    目录⭐️ requests的使用(一)🌟1.准备工作✨pip 安装✨验证安装🌟2.实例引入🌟3.get()请求✨基本实例🌟4.post()请求🌟5.响应🌟总结⭐️ requests的...
    99+
    2023-05-15
    Python requests的使用 requests使用 Python requests
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作