Python界的网络神器,Requests
来自公众号 : DeveloperPython
开门见山,今天的主角是 Python 中的一个网络库「Requests」。上面这张图是 Requests 的 Logo。
是不是逼格十足呢。
那么,我为什么推荐 Requests 呢?
一句话,学会使用 Requests 这个网络请求库之后,我感觉我的生命被延长了。总结为一个字就是----爽。就是这么简单。
我相信有一部分读者已经熟悉它,并且一直在使用。
Requests 算是 urllib2 等等网络请求库的理想替代品,简洁明了的API,简直就是Pythoneer的最爱。
Requests 也是一个很 「Pythonic」 的网络库,在使用它的同时我们更需要去学习它的代码和设计。所以我着手深入学习 Requests 用法和源码,并将总结分享出来。
最后说下,Requests 是 Python 大神 Kenneth Reitz 的巨作。
这位大神,简直就是完美程序员的化身。大学时候他已经在Python界有着鼎鼎大名。其次,还是一个大胖子到男神完美蜕变的代表。
多的不说了,本篇文章先安利下 「Requests」 的基础知识。
(本篇内容略长,建议耐心看完)
01、安装
利用pip进行安装:
- pip install requests
利用easy_install安装:
- easy_install requests
以上两种方法均可以安装成功。
这里提一下,利用 pip 和 easy_install 来安装 Python 组件的时候,都是将组件库的源码下载到 site-packages 中,因为这个目录是默认被添加到 sys.path 的,所以我们不需要手动添加组件库的路径。
02、引入 Requests
先来个例子熟悉下 Requests:
以上代码是通过 Get 协议请求我的个人博客,并打印出返回的结果类型、编码格式、内容、cookies和状态码。
运行结果:
是不是很清晰呢?
03、基本的网络请求
Requests 支持所有的 Http 网络请求,例如:
就是这么简单,这么直接。
同时,requests.models.Response 是每一种请求的返回类型。后面会介绍这个类。
那么我们先来熟悉下 Requests 中 Get 和 Post 请求:
先说下Get请求
Get 请求算是 Requests 中最基础的一种网络请求。
那么,肯定有人会问,“Get 请求不是有请求参数吗”,别急,Requests 当然也提供了方法。
很简单,对 params 参数进行赋值:
如上,get 函数提供了 params 参数,我们可以将请求数据组装为字典{}然后设置进去。打印结果如下:
「JSON解析」
如果 Get 接口返回的是 JSON 字符串,那么我们可以使用 Requests 提供的 json() 函数。通过 r.json() 直接拿到解析JSON后的结果。
「头信息 Headers」
有时候,我们的请求也要携带头信息 headers,Requests 同样提供了 headers 参数,和 params 一样,是一个字典类型的参数。
「原始套接字数据」
其次,还有 bool 类型的 stream 参数。如果指定 stream=True,那么就可以直接通过 r.raw 拿到原始的套接字数据,区别于 r.text。
接下来说Post请求
Post 和 Get 最大的区别就是将请求数据放到了 body中。
Requests 为我们提供了 data 这个参数,用来设置 Post 请求中 body 的数据。
如上,我们可以直接将表单数据 Post 上去。
「JSON格式的请求参数」
但在实际请求中,有时候 Post 的数据并不只是表单,而是一个 JSON 格式的数据。那么我们就需要通过 json.dumps() 来讲表单数据序列化。
也就是:
「文件上传」
同时,Requests 也提供了文件上传的功能。
通过上述代码中指定 files 参数,我们就可以将 a.txt 上传到服务器。
「流式上传」
其次,最实用的一个功能,流式上传,这就允许我们无需将大文件或流读到内存中。
针对流式上传,我们只需要提供一个类对象就行。
04、Cookies
有时候,我们需要从请求响应中拿到 Cookies,那么可以直接通过 cookies 变量来获取。
可以看到,cookies 是一个 list 的变量,这样我们也就可以直接通过 name 拿到对应的cookie。
05、会话状态
[图片上传中。。。(15)]
上面的例子,其实要实现的是在请求 index 的时候,拿到对应的 cookies 等信息然后在 login 中使用。
但这种写法得到 cookies 将是空的,因为 index 请求和 login 请求完全是独立的两个操作。
那么,我们如何将请求 index 后响应的 cookies 等等的信息拿到 login 中使用呢?
有人会说,先请求 index 然后拿到 response 中的数据,再次组装传入 login 中。但是这样一来,你无法确定 Login 都需要哪些状态信息,其次,维护起来比较麻烦。
所以,这里引出了 Session() 这个函数。
这样就可以将当前的所有请求放到一个 Session(会话)中执行,所有的操作也就相当于在一个浏览器中进行,状态也得到了维护。
06、超时配置
在进行网络请求的时候,我们可能需要针对请求设置对应的超时时间。
Requests 提供了 timeout 参数来满足我们这个需求。
当然,timeout 仅对连接过程有效,与响应体的下载无关。
简单的来说,就是 timeout 只限制了请求时间,就算返回的 response 内容很大,下载需要一定时间,那也不会被限制。
07、SSL证书校验
SSL 是和 HTTPS 挂钩的,现在遍地都是 https 的网站。Requests 提供了验证 HTTPS 中 SSL 证书的功能,也就类似于浏览器一样。
verify 参数。
这样的话,该请求就会校验当前 SSL 的有效性,如果 SSL 无效,那么会打印:
requests.exceptions.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:590)
所以,针对此类证书校验不通过,我们可以手动将 verify 改为 False,跳过验证 SSL,这样就可以正常请求。
08、代理
Requests 提供了 proxies 参数来设置代理,这样我们可以将任意请求代理到我们指定的地址上。
同时,也可以设置 HTTP_PROXY 和 HTTPS_PROXY 这两个环境变量来实现全局代理。
export HTTP_PROXY="http://127.0.0.1:8880"
export HTTPS_PROXY="http://127.0.0.1:9990"
通过以上方法,可以很方便的设置代理。不过,这样将会是全局生效。
08、总结
以上是 Requests 中最基础的知识点。针对平时 Python 网络开发中的需求,完全够用了。
如果要学习更多的,直接参考官方文档API:
http://docs.python-requests.org/en/master/api/
中文:
http://docs.python-requests.org/zh_CN/latest/user/quickstart.html
Requests 封装的如此之美,那么它的内部实现和架构到底是怎么样的呢?
后面我将会针对部分源代码进行分析和总结。
最后说下,这两天拿到了两张北京站的微信公开课的门票,包含 「微信小程序」 和 「微信无现金工坊」。时间是6月14号,由于我在杭州,14号也有其他事,所以有需要的北京小伙伴,可以留言告诉我,我把门票给你们。
长摁‘识别二维码’,一起进步
生活不止眼前的苟且,还有手下的代码、
和嘴上的扯淡
——
个人博客: http://xiyoumc.0x2048.com/
Github:https://www.github.com/xiyouMc