Python处理HTTP请求之requests指北

时间:2022-07-25
本文章向大家介绍Python处理HTTP请求之requests指北,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

如果你需要在Python中进行HTTP请求的处理,有很多种方式可以使用。比较原始的有Python的内置库urllib、也有比较高级一点的第三方模块aiohttp

除此之外,还有最为人所熟知的requests。它虽然是一个第三方模块,但是按照目前的情形来看,已经成为了事实上的Python HTTP请求标准库。它简单的API,直观的调用方式,深得新老程序员的喜爱,可以说是80%的爬虫入门第一站。

今天,咱们就再来认识认识它。

一、获取requests

requests的安装很简单,直接使用pip工具即可进行安装:

pip install requests 

二、发送GET请求

GET请求是我们最常使用的HTTP请求,大部分的网页都是通过GET请求进行响应的。

GET请求表示请求方(浏览器、程序、爬虫……)正尝试从指定的资源(URL)上获取数据。

使用requests发出GET请求是一件很简单的事情,只需要两步:

  1. 引入requests
  2. 调用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还提供了POSTPUTDELETEHEADPATCHOPTIONS请求方法,使用方法也与GET请求方法一样。

七、消息主体

GET请求方法中,我们一般将参数以查询字符串的形式传递给 URL 链接。但是在POSTPUT等方法中,如果我们需要传输大量的数据(比如图片上传、文件上传、修改文档等)给网站服务器,就需要将其单独携带在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