在Python中进行网络爬虫或是开发Web应用,经常要使用到HTTP协议,而HTTP协议的请求和响应都是通过Request对象来完成的。在Python中,通过使用第三方库requests支持HTTP协议的请求和响应,requests的底层实现就是通过Request对象来实现的。
本文将深入剖析Python中的Request对象,介绍它的常见用法,帮助读者更深入了解如何进行HTTP请求与响应的处理。
一、Request对象的简要介绍
Request对象是requests库的重要组成部分,每次使用requests库进行HTTP请求时,都会创建一个Request对象。Request对象包含了HTTP请求的所有信息,例如请求头、请求体和请求参数等。
requests库提供了许多方法来创建Request对象,常用的有:
```python
import requests
# GET请求
response = requests.get(url, params=None, **kwargs)
# POST请求
response = requests.post(url, data=None, json=None, **kwargs)
# PUT请求
response = requests.put(url, data=None, **kwargs)
# DELETE请求
response = requests.delete(url, **kwargs)
```
其中,**kwargs代表另外一些可选参数,例如headers、timeout等。
不同的请求方法会对应不同的Request对象,例如GET请求对应的就是requests.models.Request对象,POST请求对应的是requests.models.PreparedRequest对象,不同的对象对应的属性及方法也不同。
二、Request对象的常见属性和方法
1. 属性
Request对象的常见属性有:
- url: 请求的URL地址。
- method: 请求方法,如GET、POST等。
- headers: 请求头信息。
- params: 请求参数。
- data: 请求体数据。
- cookies: 请求cookies信息。
- auth: 请求认证信息。
- hooks: 请求钩子。
- timeout: 请求超时时间。
- proxies: 请求代理。
常见的属性使用方法如下:
```python
import requests
response = requests.get('http://www.baidu.com')
request = response.request
print(request.url) # 打印请求的URL地址
print(request.method) # 打印请求方法
print(request.headers) # 打印请求头信息
print(request.params) # 打印请求参数
print(request.data) # 打印请求体数据
print(request.cookies) # 打印请求cookies信息
print(request.auth) # 打印请求认证信息
print(request.hooks) # 打印请求钩子
print(request.timeout) # 打印请求超时时间
print(request.proxy) # 打印请求代理信息
```
2. 方法
Request对象的常见方法有:
- prepare(): 根据Request对象的属性,准备一个PreparedRequest对象。
- send(): 发送请求,并返回一个Response对象。
- copy(): 复制Request对象。
常见的方法使用方法如下:
```python
import requests
# 创建Request对象
url = 'http://www.baidu.com'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}
request = requests.Request('GET', url, headers=headers)
# 准备一个PreparedRequest对象
prepared_request = request.prepare()
# 发送请求,返回一个Response对象
session = requests.Session()
response = session.send(prepared_request)
# 复制Request对象
new_request = request.copy()
```
三、Request对象的应用场景
Request对象在HTTP请求和响应处理中的应用非常广泛,以下将介绍Request对象的几种应用场景。
1. 发送POST请求
发送POST请求一般需要提交一个表单数据或者JSON数据,可以通过给request的data或者json参数赋值并使用post方法来发送POST请求,例如:
```python
import requests
import json
url = 'http://httpbin.org/post'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}
data = {'name': '小明', 'age': 18}
json_data = json.dumps(data)
response = requests.post(url, data=data, headers=headers)
print(response.status_code)
print(response.text)
response = requests.post(url, json=json_data, headers=headers)
print(response.status_code)
print(response.text)
```
在这个例子中,我们分别使用了data和json这两种方式来发送POST请求,data方式发送的是表单数据,json方式发送的是JSON数据,返回的响应内容中可以看到提交的数据。
2. 发送GET请求
发送GET请求一般需要附带一些参数,可以通过给request的params参数赋值并使用get方法来发送GET请求,例如:
```python
import requests
url = 'http://httpbin.org/get'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}
params = {'name': '小明', 'age': 18}
response = requests.get(url, params=params, headers=headers)
print(response.status_code)
print(response.text)
```
在这个例子中,我们将请求参数以字典的形式存储在params变量中,使用params参数发送GET请求后,在返回的响应内容中可以看到请求的参数。
3. 请求重试
请求重试是在网络不稳定或是请求耗时较长的情况下,我们可以在请求失败后进行多次重试,直至请求成功。requests库提供了重试机制,可以在Session对象中设置重试次数和重试时间间隔。
```python
import requests
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.retry import Retry
url = 'http://www.baidu.com'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}
# 创建Session对象
session = requests.Session()
retry = Retry(total=3, backoff_factor=0.1)
adapter = HTTPAdapter(max_retries=retry)
session.mount('http://', adapter)
# 发送请求
response = session.get(url, headers=headers)
print(response.status_code)
print(response.text)
```
在这个例子中,创建了一个Session对象,然后通过重试机制,在请求失败后进行多次重试。
4. 发送文件
发送文件可以通过给request的files参数赋值并使用post方法来发送POST请求,例如:
```python
import requests
url = 'http://httpbin.org/post'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}
files = {'file': open('test.webp', 'rb')}
response = requests.post(url, files=files, headers=headers)
print(response.status_code)
print(response.text)
```
在这个例子中,我们将文件以字典的形式存储在files变量中,使用files参数发送POST请求后,在返回的响应内容中可以看到上传的文件。
五、总结
本文详细介绍了Python中的Request对象及其常见用法,Request对象是HTTP请求和响应处理中的核心对象,不同的HTTP请求方法会对应不同的Request对象,Request对象的属性和方法也各不相同。
这些知识点对于进行爬虫或是Web应用开发都是至关重要的,希望本文的介绍能够帮助读者更深入了解如何使用Request对象进行HTTP请求与响应的处理。