文章目录
一. 什么是Requests库
Requests 库是⽤Python语⾔编写,基于urllib,采⽤Apache2 Licensed开源协议的 HTTP 库。它⽐ urllib 更加⽅便,可以节约我们⼤量的⼯作,完全满⾜HTTP测试需求。
可以说Requests最大的特性就是其风格的简单直接优雅。无论是请求方法,还是响应结果的处理,还有cookies,url参数,post提交数据,都体现出了这种风格。
Requests目前基本完全满足web请求的所有需求,以下是Requests的特性:
- Keep-Alive & 连接池
- 国际化域名和 URL
- 带持久 Cookie 的会话
- 浏览器式的 SSL 认证
- 自动内容解码
- 基本/摘要式的身份认证
- 优雅的 key/value Cookie
- 自动解压
- Unicode 响应体
- HTTP(S) 代理支持
- 文件分块上传
- 流下载
- 连接超时
- 分块请求
- 支持
.netrc
Request库的官方文档:https://requests.readthedocs.io/zh_CN/latest/
二. 安装Requests库
requests 库能通过 pip 来安装:
$ python -m pip install requests
或者
$pip install requests
你也可以在github上下载最新的源码,解压之后进入目录进行安装:
$git clone git:https://github.com/psf/requests.git
$python setup.py install
三. Requests库的基本应用
(一)发送请求
1. 实例引入
urllib 库中的 urlopen() 方法实际上是以GET方式请求网页,而 requests 中相应的方法就是 get()方法。下面通过实例来看一下:
import requests
response = requests.get('http://www.baidu.com/')
print(type(response))
print(type(response.text))
print(type(response.cookies))
# 运行结果:
<class 'requests.models.Response'>
<class 'str'>
<class 'requests.cookies.RequestsCookieJar'>
这里我们调用 get() 方法实现与 urlopen() 相同的操作,得到一个 response 对象,然后分别输出 Response 的类型、响应体的类型以及Cookies的类型。
通过运行结果可以发现,它的返回类型是 requests.models.Response
,响应体的类型是字符串 str
,Cookies 的类型是 RequestsCookieJar
。
当然,除了get()方法,还有post()、put()、delete()等请求方法:
r = requests.post('http://httpbin.org/post’)
r = requests.put(’http://httpbin.org/put’)
r = requests.delete('http://httpbin.org/delete')
r = requests.head (’http://httpbin.org/get’)
r = requests.options(’http://httpbin.org/get')
2. GET请求
HTT 中最常见的请求之一就是 GET 请求,下面我们详细了解一下利用 requests 构建 GET 请求的方法。
在构建GET请求之前,我们要了解get()方法的调用格式:
requests.get(url, params=None, **kwargs):
该方法有三个参数:
- url:必选参数,该参数指定了发送请求的目标URL
- params:可选参数,它是发送请求时传递给Request对象的参数,其数据类型可以是字典、列表、元组或者字节型数据
- **kwargs:可选参数
(1)最基本的GET请求
首先,构建一个最简单的 GET 请求,请求的链接为 /httpbin.org/ ,该 网会判断如果客户端发起的是 GET 请求的话,它返回相应的请求信息:
import requests
response = requests.get('http://httpbin.org/get')
print(response.text)
# 运行结果:
{
"args": {
},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.24.0",
"X-Amzn-Trace-Id": "Root=1-5f60973e-1787830a4f06ee8a3dec1d86"
},
"origin": "221.207.18.109",
"url": "http://httpbin.org/get"
}
可以发现,我们成功发起了 GET 请求,返回结果中包含请求头、URL 和 IP 等信息。
(2)带参数的GET请求
对于 GET 请求,如果要附加额外的信息,一般怎样添加呢?比如现在想添加两个参数,其中 name=germey,age=22:
import requests
data = {
'name':'germey',
'age':22
}
response = requests.get("http://httpbin.org/get", params=data)
print(response.text)
# 运行结果:
{
"args": {
"age": "22",
"name": "germey"
},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.24.0",
"X-Amzn-Trace-Id": "Root=1-5f6098ac-247285d09016a318f68ecbb0"
},
"origin": "221.207.18.109",
"url": "http://httpbin.org/get?name=germey&age=22"
}
通过运行结果可以判断,请求的链接自动被构造成了:http://httpbin.org/get?name=germey&age=22。当然,我们也可以直接将参数放到请求URL中发送请求:
response = requests.get("http://httpbin.org/get?name=germey&age=22")
(3)解析JSON
响应体的类型实际上是 str 类型,但是它很特殊,是 JSON
格式的数据。所以,如果想直接解析返回结果,得到一个字典格式的话,可以直接调用 json() 方法,示例如下:
import requests
import json
response = requests.get("http://httpbin.org/get")
print(type(response.text))
print(response.json())
print(type(response.json()))
# 运行结果:
<class 'str'>
{
'args': {
}, 'headers': {
'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Host': 'httpbin.org', 'User-Agent': 'python-requests/2.24.0', 'X-Amzn-Trace-Id': 'Root=1-5f609a2f-86ba9d38d21e0034d01fcebc'}, 'origin': '221.207.18.109', 'url': 'http://httpbin.org/get'}
<class 'dict'>
可以发现,调用 json() 方法,就可以将返回结果是 JSON
格式的字符串转化为字典。或者是用json.loads()也可以将 JSON
格式的返回结果转换为字典格式:
import requests
import json
response = requests.get("http://httpbin.org/get")
res_dict = json.loads(response.text)
print(type(res_dict))
print(res_dict)
# 运行结果:
<class 'dict'>
{
'args': {
}, 'headers': {
'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Host': 'httpbin.org', 'User-Agent': 'python-requests/2.24.0', 'X-Amzn-Trace-Id': 'Root=1-5f609cce-0bcd2d0ee79f7a4f3b9f4a9c'}, 'origin': '221.207.18.109', 'url': 'http://httpbin.org/get'}
(4)抓取二进制数据
如果想抓取图片、音频、 视频等文件,应该怎么办呢?图片、音频、视频这些文件本质上都是由二进制码组成的,由于有特定的保存格式和对应的解析方式, 我们才可以看到这些形形色色的多媒体。所以,想要抓取它们,就要拿到它们的二进制码。下面以 GitHub
站点图标为例来看一下:
import requests
response = requests.get("https://github.com/favicon.ico")
print(type(response.text), type(response.content))
print(response.text)
print(response.content)
# 运行结果:
<class 'str'> <class 'bytes'>
# response.text的运行内容略
b'\x00\x00\x01\x00\x02\x00\x10\x10\x00\x00\x01\x00......''
从运行结果我们可以发现,text的内容在打印时发生了乱码,而content的内容以二进制码打印显示。
然后,我们将刚刚爬取的图片保存到本地: