Python 网络请求:requests 发送 GET/POST 请求
在 Python 自动化任务中,与网站服务器进行数据交互是必不可少的一环。requests 库因其简洁强大的 API,成为处理 HTTP 请求的首选工具。本文将直接演示如何使用 requests 库发送 GET 和 POST 请求,处理参数、Headers 以及响应数据。
准备工作
在使用前,需确保已安装 requests 库。
- 打开终端或命令行工具。
- 输入以下命令并执行,完成安装:
pip install requests
发送 GET 请求
GET 请求通常用于从服务器获取数据。
1. 基础请求
向指定 URL 发送请求并获取响应内容。
- 引入
requests模块。 - 定义目标 URL 变量,例如
https://httpbin.org/get。 - 调用
requests.get()方法传入 URL。 - 打印服务器返回的状态码和文本内容。
import requests
url = 'https://httpbin.org/get'
response = requests.get(url)
# 查看状态码,200 表示成功
print(f"状态码: {response.status_code}")
# 查看响应内容的文本形式
print(f"响应内容: {response.text}")
2. 携带参数发送请求
当 URL 需要携带查询参数(如 ?name=value)时,推荐使用 params 参数,库会自动处理编码。
- 准备一个包含参数键值对的字典。
- 调用
requests.get()时,将字典赋值给params参数。
import requests
url = 'https://httpbin.org/get'
payload = {'key1': 'value1', 'key2': 'value2'}
# 发送带参数的 GET 请求
response = requests.get(url, params=payload)
# 打印实际请求的 URL(requests 自动拼接了参数)
print(f"实际请求 URL: {response.url}")
3. 添加请求头
某些网站为了防止被爬虫访问,会检查请求头中的 User-Agent。
- 构造一个包含头部信息的字典。
- 调用
requests.get()时,将字典赋值给headers参数。
import requests
url = 'https://httpbin.org/get'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}
response = requests.get(url, headers=headers)
print(response.text)
发送 POST 请求
POST 请求通常用于向服务器提交数据,如表单提交或上传文件。
1. 发送表单数据
模拟 HTML 表单提交,数据会被编码为 application/x-www-form-urlencoded 格式。
- 准备表单数据字典。
- 调用
requests.post()方法,将字典赋值给data参数。
import requests
url = 'https://httpbin.org/post'
form_data = {'username': 'admin', 'password': '123456'}
response = requests.post(url, data=form_data)
# 打印服务器返回的表单数据部分
print(response.text)
2. 发送 JSON 数据
在前后端分离的 API 交互中,通常使用 JSON 格式传输数据。
- 准备 Python 字典数据。
- 调用
requests.post()方法,将字典赋值给json参数。requests会自动将其序列化为 JSON 字符串并添加正确的Content-Type头。
import requests
url = 'https://httpbin.org/post'
json_data = {'id': 100, 'content': '这是一条测试数据'}
response = requests.post(url, json=json_data)
# 打印响应的 JSON 数据
print(response.json())
响应处理与进阶技巧
获取响应后,通常需要提取特定信息或处理异常情况。
1. 解析 JSON 响应
大多数现代 API 返回的都是 JSON 格式。
- 确认响应成功(状态码为 200)。
- 调用
response.json()方法,将 JSON 字符串转为 Python 字典。
import requests
url = 'https://httpbin.org/get'
response = requests.get(url)
if response.status_code == 200:
# 直接解析为字典
data = response.json()
print(data['headers']['Host'])
else:
print("请求失败")
2. 设置超时与异常处理
网络请求可能会因为连接问题而挂起,必须设置超时时间。
- 设置
timeout参数,单位为秒。可以是连接时间与读取时间的元组,也可以是单一数值。 - 使用
try-except捕获可能发生的异常。
import requests
from requests.exceptions import RequestException
url = 'https://httpbin.org/delay/5' # 该接口会延迟 5 秒返回
try:
# 设置超时时间为 3 秒,超过则抛出异常
response = requests.get(url, timeout=3)
print("请求成功")
except RequestException as e:
print(f"发生错误: {e}")
为了更直观地理解请求处理流程,以下展示了从发起请求到处理响应的逻辑路径:
graph TD
A[开始] --> B{请求类型}
B -- GET --> C[构建 URL 与 Params]
B -- POST --> D{数据类型}
C --> E[添加 Headers]
D -- 表单 --> F[构建 data 字典]
D -- JSON --> G[构建 json 字典]
F --> E
G --> E
E --> H[设置 Timeout 并发送]
H --> I{请求是否成功}
I -- 是 --> J[解析 JSON 或 Text]
I -- 否 --> K[捕获异常]
J --> L[结束]
K --> L
常用属性对比
以下列出了 Response 对象中最常用的属性和方法,方便查阅。
| 属性/方法 | 描述 | 返回类型 |
|---|---|---|
response.status_code |
HTTP 状态码(如 200, 404, 500) | int |
response.text |
响应内容的字符串形式(自动解码) | str |
response.content |
响应内容的二进制形式(字节) | bytes |
response.json() |
将 JSON 响应内容解析为 Python 字典 | dict/list |
response.headers |
服务器返回的响应头信息 | dict |
response.cookies |
服务器返回的 Cookie 信息 | RequestsCookieJar |
实战演练:模拟登录查询
假设有一个需要登录才能查看数据的网站,我们将演示完整的登录与查询流程。
- 定义登录接口 URL 和查询数据接口 URL。
- 构造登录所需的 POST 数据(用户名密码)。
- 使用
Session对象保持会话(自动处理 Cookie)。 - 发起登录请求。
- 验证登录成功后,使用同一 Session 发起数据查询请求。
import requests
# 使用 Session 可以在多个请求之间保持 Cookie
session = requests.Session()
login_url = 'https://httpbin.org/post'
data_url = 'https://httpbin.org/cookies'
# 1. 模拟登录
login_data = {'username': 'user', 'password': 'pass'}
headers = {'User-Agent': 'My-Agent/1.0'}
# 发送登录请求
session.post(login_url, data=login_data, headers=headers)
# 2. 设置 Session 的 Cookie(模拟登录成功服务器返回的 Cookie)
session.cookies.set('login_session', 'abc123xyz')
# 3. 携带登录状态访问需要权限的接口
response = session.get(data_url)
print("查询结果:")
print(response.json())
暂无评论,快来抢沙发吧!