如果你需要在Python
中进行HTTP
请求的处理,有很多种方式可以使用。比较原始的有Python
的内置库urllib
、也有比较高级一点的第三方模块aiohttp
。
除此之外,还有最为人所熟知的requests
。它虽然是一个第三方模块,但是按照目前的情形来看,已经成为了事实上的Python HTTP请求标准库。它简单的API,直观的调用方式,深得新老程序员的喜爱,可以说是80%的爬虫入门第一站。
今天,咱们就再来认识认识它。
一、获取requests
requests
的安装很简单,直接使用pip
工具即可进行安装:
pip install requests
二、发送GET
请求
GET
请求是我们最常使用的HTTP请求,大部分的网页都是通过GET
请求进行响应的。
GET
请求表示请求方(浏览器、程序、爬虫……)正尝试从指定的资源(URL)上获取数据。
使用requests
发出GET
请求是一件很简单的事情,只需要两步:
引入
requests
调用
requests.get()
方法
例如:
import requests
requests.get('http://mrdoc.zmister.com')
下面,我们以觅道文档的示例站点(http://mrdoc.zmister.com) 为例,对requests
的使用进行演示。
简单发出一个GET请求
获取请求的响应状态码
不存在的404页面
上面两个示例分别请求了两个网址,返回了两个不同的status_code
。这是HTTP请求的状态码。
在HTTP请求中,状态码有5个大类:
1xx:表示信息;
2xx:表示请求被接收;
3xx:表示请求被重定向了;
4xx:表示客户端错误;
5xx:表示服务器错误;
我们遇到得最多的应该是2xx
;如果有些强制登录,打开网页会自动跳转到登录页面,这时候就会有3xx
;访问服务器上不存在的网页,一般都会404
;最后如果网站所在的服务挂掉了,妥妥的5xx
。
在初期,我们可以通过HTTP的状态码来判断请求是否成功。
三、处理响应
在发出HTTP请求之后,我们需要对网站服务器返回的响应进行处理。
requests
提供了3种响应形式供我们选择和使用:
.content
:原始的响应主体字节;.text
:经过编码后的响应主体字符串;.json()
:经过JSON处理的响应主体;
下面,我们通过一个觅道文档的文集列表API接口,通过requests
来获取其请求的响应:
获取原始的响应主体
获取编码后的响应字符串
获取json()化的响应
四、查询字符串参数
很多时候,我们请求的URL
需要附带很多的查询参数,比如百度搜索的网址:
通过requests
进行请求,我们当然也可以直接在URL字符串中把所有的参数填充进去,然后用字符串的format()
方法对字符串进行格式化,比如这样:
url = "https://www.baidu.com/s?ie={}&f={}&rsv_bp={}&tn={}&wd={}"
虽然可行,但是却不美观,也不便于排错。面对这样的查询字符串参数,我们可以使用params
参数来指定需要添加的查询字符串。
五、请求头
使用requests
进行数据采集的读者应该对请求头再熟悉不过了。请求头在某种程度上,相当于HTTP请求的身份证,网站服务器可以通过检查请求头中的一些参数,来识别请求是否合法、判断该返回的响应是什么类型的。
爬虫通常都会对请求头进行伪装,以顺利地获取到HTTP请求的响应。
在requests
中添加请求头的方法和设置查询字符串参数的方法类似,直接指定headers
参数即可。
import requests
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 6.2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2915.92 Safari/537.36'
}
url = 'https://www.baidu.com'
r = requests.get(url,headers=headers)
六、其他的请求方法
除了常用的GET
方法,requests
还提供了POST
、PUT
、DELETE
、HEAD
、PATCH
和OPTIONS
请求方法,使用方法也与GET
请求方法一样。
七、消息主体
在GET
请求方法中,我们一般将参数以查询字符串的形式传递给 URL 链接。但是在POST
和PUT
等方法中,如果我们需要传输大量的数据(比如图片上传、文件上传、修改文档等)给网站服务器,就需要将其单独携带在HTTP请求中。
requests
提供了2种参数来支持我们在HTTP请求中传输消息主体:
data
:接受一个字典、列表、元组、字节和类文件对象;json
:接受一个json
参数,请求将会序列化这个数据,并添加一个请求头;
八、检查请求
在一些情况下,我们需要对发出的HTTP请求进行检查,以确认我们的请求参数是正确的,而不仅仅只是发出请求就听天由命了。
在requests
的请求中,我们可以检查请求头、请求链接、请求的消息主体等消息。
下面,我们通过著名的HTTP测试网站httbin.org
,来演示一下requests
模块的检查请求功能。
九、认证
对于一些需要进行HTTP认证的场景,requests
模块提供了auth
参数用来指定HTTP认证的用户名和密码,以进行自动化地HTTP认证。
其使用方法和指定请求头参数类似。
十、请求超时
并非每一个本地到互联网Web服务的连接都是顺畅无阻的,由于线路或是目标站点服务器的问题,有些URL的请求可能会经常超时。
为防止服务器不能及时响应,大部分对外部服务器的请求都应该带着 timeout
参数,用来指定如果超多多久服务器没响应,则终止请求。
十一、会话
在大多数时候,我们每一个HTTP请求都是独立互不依赖和影响。但是有的时候,我们发出的HTTP请求又是有依赖的,不同的请求之间,需要保持一些相同的参数,比如认证信息和Cookie。
requests
模块提供了Session()
会话的功能供我们实现上述需求。
十二、总结
上面总结了十一条有关requests
模块的使用,requests
模块的功能不止于此,其他的注入文件上传、SSL证书验证、设置代理、请求会话等功能也都是很常用的。
在此只做抛砖引玉,有关requests
模块更加丰富的功能,更加全面的介绍,可以前往其官网查阅文档,地址为:https://requests.readthedocs.io