Requests库

Requests 是什么?

Requests 库 是用来发送HTTP请求,接收HTTP响应的一个Python库。

Requests库经常被用来 爬取 网站信息。 我们用它发起HTTP请求到网站,从HTTP响应消息中提取信息。


Requests库也经常被用来做 网络服务系统的Web API 接口测试。因为Web API 接口的消息基本上都是通过HTTP协议传输的。


Python中构建HTTP请求的库有很多,其中 Requests 库最为广泛使用,因为它使用简便,功能强大。

Requests库的官方网站在这里: Requests官方网站

如果读者阅读英文文档有困难,可以看中文文档

使用 Requests库

Requests库不是Python标准库,而是第三方开发的。 所以需要我们安装一下。

安装第三方库,前面的课程学过,使用包管理工具 pip。

执行命令 pip install requests 就可以了。

Requests可以很方便的发送HTTP请求给服务器。

比如

import requests

response = requests.get('http://mirrors.sohu.com/')
print(response.text)

我们使用 request库里面的get方法就可以发起一个http 的get请求。 里面的参数就是http请求的url,这里 就是 http://mirrors.sohu.com/

我们常见的http请求的方法 除了 get, 还有 post、put、delete等。

发送这些请求的方法也是调用同名的函数 post、put、delete 等。

那么我们的程序怎么获得 服务端的响应消息呢?

这些 get、post、put、delete 函数被用,发送http消息给 服务端后,都会返回一个Requests库里面定义的一个 Response 类的实例对象。 这个对象代表着响应消息。

上面的例子中 response.text 使用了这个对象的 text 属性。就返回了http响应消息体中的文本内容。

大家运行一下上面的程序看看,就可以打印出搜狐服务器返回的html内容。

构造url参数

什么是url参数?

比如:

https://www.baidu.com/s?wd=iphone&rsv_spt=1

问号后面的部分 wd=iphone&rsv_spt=1 就是 url 参数。

每个参数之间是用 & 隔开的。

上面的例子中 有两个参数 wd 和 rsv_spt, 他们的值分别为 iphone 和 1 。


使用Requests发送HTTP请求,url里面的参数,通常可以直接写在url里面,比如

response = requests.get('https://www.baidu.com/s?wd=iphone&rsv_spt=1')

但是有的时候,我们的url参数里面有些特殊字符,比如 参数的值就包含了 & 这个符号。

那么我们可以把这些参数放到一个字典里面,然后把字典对象传递给 Requests请求方法的 params 参数,如下

urlpara = {
    'wd':'iphone&ipad'
    'rsv_spt':'1'
}

response = requests.get('https://www.baidu.com/s',params=urlpara)

构造HTTP消息体

当我们进行API 接口测试的时候, 根据接口规范,构建的http请求,通常需要构建消息体。

http 的 消息体就是一串字节,里面包含了一些信息。这些信息可能是文本,比如html网页作为消息体,也可能是视频、音频等信息。

消息体可能很短 ,只有一个字节, 比如字符 a。 也可能很长,有几百兆个字节,比如一个视频文件。

最常见的消息体格式当然是 表示网页内容的 HTML。

Web API接口中,常见的HTTP消息体格式有3种 UrlEncoded ,json , XML。

HTML 格式消息体

前面说了,消息体就是存放信息的地方,信息的格式完全取决设计者的需要。

如果设计者决定用HTML格式传输一段信息,用Requests库,只需要这样

payload = '''
<!DOCTYPE html>
<html lang="zh-cn">
<head>
	<meta charset="UTF-8">
    <title>工作报告</title>
</head>
<body>
    <h1>总体情况:良好<h1>
	<p>完成进度 30%</p>
	<p>遗留问题:暂无</p>
</body>
</html>
'''
r = requests.post("http://httpbin.org/post", data=payload)
print(r.text)

Requests库的post方法,参数data指明了,消息体中的数据是什么。

如果传入的是字符串类型,像上面的例子这样,Requests就会把这个字符串编码为字节串放到http消息体中,发送出去。


如果作为系统开发的设计者,觉得发送这样一篇报告,只需要核心信息就可以了,不需要这样麻烦的HTML格式,也可以直接用纯文本,像这样

payload = '''
 工作报告 
 总体情况:良好 
 完成进度 30% 
 遗留问题:暂无
'''
r = requests.post("http://httpbin.org/post", data=payload)
print(r.text)

所以,如果就是一些字符信息,我们可以自行构建任何消息体格式。

UrlEncoded 格式消息体

这种格式的消息体就是一种 键值对的格式存放数据,如下所示

key1=value1&key2=value2

Requests发送这样的数据,当然可以直接把这种格式的字符串传入到data参数里面。

但是,这样写的话,如果参数中本身就有特殊字符,比如等号,就会被看成参数的分隔符,就麻烦了。

我们还有更方便的方法:只需要将这些键值对的数据填入一个字典。

然后使用post方法的时候,指定参数 data 的值为这个字典就可以了,如下

payload = {'key1': 'value1', 'key2': 'value2'}

r = requests.post("http://httpbin.org/post", data=payload)
print(r.text)

如果我们用工具抓包就可以发现 发送的http请求如下

白月黑羽Python3教程

json 格式消息体

这种格式的消息体就是json 格式的字符串。

我们当然可以使用json库的dumps方法,如下

import json

payload = {
    'name1': 'value1',
    'name2': ['value1','value2','value3']
}

r = requests.post("http://httpbin.org/post", data=json.dumps(payload))

也可以将 数据对象 直接 传递给post方法的 json参数,如下

payload = {
    'name1': 'value1',
    'name2': ['value1','value2','value3']
}


r = requests.post("http://httpbin.org/post", json=payload)

构造HTTP消息头

有时候,我们需要自定义一些http的消息头

每个消息头也就是一种 键值对的格式存放数据,如下所示

user-agent: my-app/0.0.1
auth-type: jwt-token

Requests发送这样的数据,只需要将这些键值对的数据填入一个字典。

然后使用post方法的时候,指定参数 headers 的值为这个字典就可以了,如下

headers = {
    'user-agent': 'my-app/0.0.1', 
    'auth-type': 'jwt-token'
}

r = requests.post("http://httpbin.org/post", headers=headers)
print(r.text)

如果我们用工具抓包就可以发现 发送的http请求如下

白月黑羽Python3教程

解析响应

API 响应的消息体格式,通常以json居多。

如果我们要将json格式的消息体直接转为 python里面的对象,可以使用 Response对象的 json方法,该方法会返回消息体json解码后的Python对象。

如下:

r = requests.post("http://httpbin.org/post", data={1:1,2:2})
print(r.json())


使用 Requests 进行 WEB API 自动化的时候,经常会涉及到cookie的操作。

一个常见的场景就是登陆服务系统,服务端在响应的cookie里面会放入 session ID。

后续的http请求必须在请求消息的cookies中带上这个session ID 字段。

使用 Requests 操作 cookies 非常的方便,如下例所示

import requests

# 登录API
res = requests.post('http://oneserver.com/api/user/loginreq',
                    data={'username':'abc','password':'12345'})
# 显示响应中所有的cookie
print(res.cookies.get_dict())

# 取出某个cookie的值,比如sessionid的值,保存到变量中
sessionid = res.cookies['sessionid']

# 如果后续请求需要设置某些cookie,就放入字典传给cookies参数
cookies = {
    'sessionid': sessionid
}
res = requests.get('http://oneserver.com/api/users/111',
                   cookies=cookies)

print(res.json())


扫码分享给朋友,一起学更有动力哦




上一页 下一页




课后练习

去做练习