Requests:让HTTP服务人类。
本文中的有些内容来自官方网站,也有一部分是我的理解,算是个笔记版本吧。
1、requests是什么
写了一些爬虫,从urllib库转到requests库,到目前为止,个人感觉requests库是最简单易用的HTTP库,以下这段话来自requests官网:
Requests 唯一的一个非转基因的 Python HTTP 库,人类可以安全享用。
警告:非专业使用其他 HTTP 库会导致危险的副作用,包括:安全缺陷症、冗余代码症、重新发明轮子症、啃文档症、抑郁、头疼、甚至死亡。
字里行间透露着requests库的自信,它确实做到了。
以下为Requests库的功能特性,完全满足今日web的需求:
Keep-Alive & 连接池
国际化域名和 URL
带持久 Cookie 的会话
浏览器式的 SSL 认证
自动内容解码
基本/摘要式的身份认证
优雅的 key/value Cookie
自动解压
Unicode 响应体
HTTP(S) 代理支持
文件分块上传
流下载
连接超时
分块请求
支持
2、安装及更新2.1 安装
最简单的安装方式是pip安装,只需执行以下一条指令:
也可以通过git使用源码安装,需要执行以下两条指令:
2.2 更新
使用pip进行更新:
3、使用3.1 发送请求
我们以网站作为测试目标,该网站专门为HTTP客户端提高测试服务。
使用该库要在文件开始部分导入Requests模块:
HTTP的请求类型有POST,GET,PUT,DELETE,HEAD 以及 OPTIONS,其中POST和GET是最常使用的,用requests实现这几种请求代码如下:
我们得到了一个名为的Response对象,我们可以从这个对象中获取想要的信息,例如状态码(r.status_code)、文本内容(r.text)等。
3.2 传递URL参数
经常可以看到一些网址中有一个, 后面还跟着几个参数,这种URL其实传递了某种数据,例如。Requests允许使用params关键字参数,以一个字符串字典来提供这些参数。如果想传递和到,那么可以使用如下代码:
执行结果为:
注:字典中值为None的键不会被添加到URL的查询字符串中。
还可以将一个列表作为值传入:
执行结果为:
3.3 响应内容3.3.1 文本响应内容
在3.1中已经提到Response对象包含很多信息,其中为服务器响应内容:
执行结果为:
Requests可以自动对大多数unicode字符集无缝解码。
请求发出后,Requests会基于HTTP头部对响应的编码做出有根据的推测。我们可以通过得到编码,也可以使用属性改变编码。
3.3.2 二进制响应内容
上面获得的是响应内容的文本,我们也可以以字节的方式访问请求响应体,对于非文本请求,Requests会自动解码和传输编码的响应内容。
3.3.3 JSON响应内容
Requests内置一个JSON解码器,使用方法如下:
如果JSON解码失败,会抛出一个异常。需要注意的是,成功调用并不意味着响应成功,因为某些服务器会在失败的响应中包含一个JSON对象,这种JSON会被解码返回。如果要判断请求是否成功,我们可以使用或者检查是否和预期相同。
3.3.4 原始响应内容
有时候我们可能需要获取服务器的原始套接字响应,那么我们应该使用,使用时要确保在初始请求中设置了:
执行结果如下:
4、定制请求头
请求某些服务器时需要加上请求头,Requests的请求接口有一个名为的参数,只需传给它一个字典即可:
注意: 定制 header 的优先级低于某些特定的信息源,例如:
如果在 中设置了用户认证信息,使用 headers= 设置的授权就不会生效。而如果设置了 参数, 的设置就无效了。
如果被重定向到别的主机,授权 header 就会被删除。
代理授权 header 会被 URL 中提供的代理身份覆盖掉。
在我们能判断内容长度的情况下,header 的 Content-Length 会被改写。
更进一步讲,Requests 不会基于定制 header 的具体情况改变自己的行为。只不过在最后的请求中,所有的 header 信息都会被传递进去。
注意: 所有的 header 值必须是 、bytestring 或者 unicode。尽管传递 unicode header 也是允许的,但不建议这样做。
5、响应状态码
我们可以响应状态码得知此次请求的结果,一般为请求成功, Requests还附带了一个内置的状态码查询对象:
执行结果为:
如果发送了一个错误请求(一个 4XX 客户端错误,或者 5XX 服务器错误响应),我们可以通过 来抛出异常:
执行结果为:
6、响应头
不只请求会有请求头,响应也有响应头:
执行结果:
可以看出该服务器响应头为Python字典形式,但是这个字典比较特殊:它是仅为HTTP头部而生的,是大小写不敏感的。我们可以以任意大小写形式来访问响应头字段,由上面的例子也可以看出。
7、超时
requests在发送请求时可以附带一个timeout参数,如果服务器在timeout秒内没有应答,将会引发一个异常,更精确地说,是在timeout秒内没有从基础套接字上接收到任何字节的数据时。如果我们不使用这个参数,我们的程序可能会永远失去响应。
这样就可以得到一个超时异常:
8、错误与异常
遇到网络问题(如:DNS 查询失败、拒绝连接等)时,Requests 会抛出一个 异常。
如果 HTTP 请求返回了不成功的状态码, 会抛出一个 异常。
若请求超时,则抛出一个 异常。
若请求超过了设定的最大重定向次数,则会抛出一个 异常。
所有Requests显式抛出的异常都继承自 。
9、 代理
某些网站对同一IP的访问频率和次数做了限制,如果想要突破这些限制,频繁替换代理是一种最简单的解决办法。Requests库也为我们提供了代理的使用,只要在发送请求时指定proxies参数即可:
如果使用的代理需要使用HTTP Basic Auth,可以使用语法:
如果要为某个特定主机设置代理,使用作为key,它会为指定的主机进行匹配代理:
至此,Requests库的常用功能介绍完毕,如果想要进阶功能的使用教程,请移步官方网站:
Requests高级用法
领取专属 10元无门槛券
私享最新 技术干货