Requests库发送HTTP请求

一、requests库简介

requests 库是 Python 中最流行和最简单的 HTTP 请求库,它提供了简洁优雅的 API,能够轻松地发送各种类型的 HTTP 请求。本章将详细介绍 requests 库的基本用法。

1.1 安装requests库

1
pip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple
说明
使用 pip 工具安装 Python 第三方库 requests 的命令,其中通过-i参数指定了使用清华大学镜像源来加速下载。

二、GET请求详解

2.1 基本GET请求

最简单的 GET 请求只需要传入 URL:

1
2
3
4
5
6
import requests

# 示例1:演示GET请求(HTTP请求方法演示-中的接口)
response = requests.get('http://student_demo.xuexiqu.cn/method/get?param1=hello&param2=world')
print(response.status_code)  # 打印响应状态码
print(response.json())       # 打印json格式的响应内容

requests.get() 是 Python requests 库中用于发送 HTTP GET 请求的方法。

【课堂练习】GET请求练习1:发送基本GET请求

根据示例1中学到的GET请求方法,完成以下任务:

  1. 打开 学生信息管理系统(V0版本),找到获取学生列表的请求接口;
  2. 使用 requests 库发送 get 请求;
  3. 获取并打印响应状态码及 JSON 格式的响应内容。

2.2 GET请求两种参数传递方式

2.2.1 查询参数

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
import requests

# 示例1:演示GET查询参数(HTTP请求方法演示-中的接口)

# 方法1:使用 params 字典参数
params = {
    'param1': '测试参数1',
    'param2': '测试参数2'
}
# 发送GET请求
url = 'http://student_demo.xuexiqu.cn/method/get'
response = requests.get(url, params=params)
print(response.url)  # 打印完整的请求URL
print(response.status_code)  # 打印HTTP响应状态码
print(response.json())  # 打印响应的JSON数据

# 方法2:手动拼接 url 参数
url = "http://student_demo.xuexiqu.cn/method/get?param1=测试参数1&param2=测试参数2"
response = requests.get(url)
print(response.url)
print(response.status_code)
print(response.json())
【课堂练习】GET请求练习2:查询参数

根据示例1中学到的带查询参数的GET请求方法,完成以下任务:

  1. 打开 学生信息管理系统(V0版本),找到搜索学生的请求接口;
  2. 使用 requests 库发送 get 请求,搜索所有姓名中包含"李"的学生;
  3. 获取并打印:完整的请求 URL、响应状态码及 JSON 格式的响应内容。

要求:参照方法1的代码格式,使用 params 参数传递搜索条件。

2.2.2 路径参数

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
import requests

# 示例1:演示GET路径参数(HTTP请求方法演示-中的接口)
param1 = 'user'
param2 = 'info'
response = requests.get(f'http://student_demo.xuexiqu.cn/method/get/{param1}/{param2}')
print(response.url)
print(response.status_code)
print(response.json())

# 示例2:获取特定学生信息(学生信息管理系统(V0版本)-中的接口)
student_id = '00001'
response = requests.get(f'http://student_demo.xuexiqu.cn/students/list/{student_id}')
print(response.url)
print(response.status_code)
print(response.json())
【课堂练习】GET请求练习3:路径参数
复制上面的代码,运行截图即可。

2.3 GET请求设置请求头

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
import requests

headers = {
    'Host': 'student_demo.xuexiqu.cn',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36',
    'Accept': 'application/json'
}

# 示例1:演示GET请求(HTTP请求方法演示-中的接口)
params = {
    'param1': '测试参数1',
    'param2': '测试参数2'
}
response = requests.get('http://student_demo.xuexiqu.cn/method/get', headers=headers, params=params)
print(response.url)
print(response.status_code)
print(response.json())
【课堂练习】GET请求练习4:设置请求头

根据示例1中学到的带请求头的 GET 请求方法,完成以下任务:

  1. 打开 学生信息管理系统(V0版本),找到获取学生列表的请求接口;
  2. 使用 requests 库发送 get 请求,设置以下请求头信息:
    • Host: student_demo.xuexiqu.cn
    • User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36
    • Accept-language: zh-CN,zh;q=0.9
    • Referer: http://student_demo.xuexiqu.cn/
  3. 获取并打印:完整的请求 URL、响应状态码及JSON 格式的响应内容。

三、POST请求详解

3.1 表单数据提交(application/x-www-form-urlencoded

1
2
3
4
5
6
# 示例1:演示Form-Urlencoded(HTTP请求方法演示-中的接口)
data = {
    'param1': '表单参数1',
    'param2': '表单参数2'
}
response = requests.post('http://student_demo.xuexiqu.cn/method/post/form-urlencoded', data=data)
【课堂练习】POST请求练习1:表单数据提交
复制上面的代码,运行截图即可。

3.2 JSON数据提交

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
import requests

# 示例1:演示JSON请求(HTTP请求方法演示-中的接口)
json_data = {
    'name': '李明',
    'age': 22,
    'class': '计算机科学',
    'gender': '男'
}
response = requests.post('http://student_demo.xuexiqu.cn/method/post/json', json=json_data)
print(response.url)
print(response.status_code)
print(response.json())
【课堂练习】POST请求练习2:JSON数据提交

根据示例1中学到的 POST 请求方法,完成以下任务:

  1. 打开 学生信息管理系统(V0版本),找到添加新学生的请求接口;
  2. 使用 requests 库发送 post 请求,添加一名新学生,信息如下:
    • 学号:‘99999’
    • 姓名:‘王芳’
    • 年龄:19
    • 班级:‘计算机2302班’
    • 性别:‘女’
    • 家乡:‘上海’
  3. 获取并打印:完整的请求 URL、响应状态码及JSON 格式的响应内容。

如果提示“该学号已存在”,则换一个任意数字的学号,再发送请求。

3.3 文件上传

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
import requests

# 示例1:演示文件上传(HTTP请求方法演示-中的接口)
data = {
    'param1': '文件描述1',
    'param2': '文件描述2'
}

files = {
    'file': open('example.txt', 'r'),

}
response = requests.post('http://student_demo.xuexiqu.cn/method/post/multipart', data=data, files=files)
print(response.url)
print(response.status_code)
print(response.json())
【课堂练习】POST请求练习3:文件上传
复制上面的代码,运行截图即可。

四、响应处理

4.1 响应属性

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
import requests

# 示例1:演示GET请求(HTTP请求方法演示-中的接口)
params = {
    'param1': '测试参数1',
    'param2': '测试参数2'
}
response = requests.get('http://student_demo.xuexiqu.cn/method/get', params=params)

# 状态码
print(response.status_code)

# 响应头
print(response.headers)

# 文本内容
print(response.text)

# JSON内容
print(response.json())
response.text 和 response.json() 的主要区别

response.text:

  • 返回类型:字符串(str)
  • 内容:原始的响应文本内容
  • 编码:会自动处理字符编码
  • 适用场景:任何文本格式(HTML、XML、纯文本等)

response.json():

  • 返回类型:字典(dict)或列表
  • 内容:将JSON格式的响应文本解析为Python数据结构
  • 要求:响应内容必须是有效的JSON格式
  • 适用场景:API接口返回的JSON数据

关键区别:

特性 response.text response.json()
返回类型 字符串 字典/列表
内容格式 原始文本 解析后的数据结构
错误处理 总是成功 如果不是JSON会报错
内存使用 较小 可能较大(解析后)
注意
如果响应不是有效的JSON格式,使用 response.json() 会抛出 json.decoder.JSONDecodeError 异常。
【课堂练习】响应处理练习1:响应属性
复制上面的代码,运行截图即可。

4.2 状态码处理

将状态码处理分为手动检查和自动检查两种方式:

方式一:手动检查状态码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
import requests

# 示例1:演示GET请求(HTTP请求方法演示-中的接口)
params = {
    'param1': '测试参数1',
    'param2': '测试参数2'
}
response = requests.get('http://student_demo.xuexiqu.cn/method/get')
# response = requests.get('http://student_demo.xuexiqu.cn/method/get', params=params)

# 手动检查状态码
if response.status_code == 200:
    print("请求成功")
    print(response.json())
elif response.status_code == 400:
    print("请求参数错误")
elif response.status_code == 404:
    print("资源未找到")
elif response.status_code == 500:
    print("服务器内部错误")
else:
    print(f"请求失败,状态码:{response.status_code}")
【课堂练习】响应处理练习2:手动检查状态码
复制上面的代码,运行截图即可。

方式二:使用 raise_for_status() 自动检查

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
import requests

# 示例1:演示GET请求(HTTP请求方法演示-中的接口)
params = {
    'param1': '测试参数1',
    'param2': '测试参数2'
}

try:
    response = requests.get('http://student_demo.xuexiqu.cn/method/get')
    # response = requests.get('http://student_demo.xuexiqu.cn/method/get', params=params)

    # 自动检查状态码 - 如果状态码不是200,会抛出异常
    response.raise_for_status()

    print("请求成功")
    print(response.json())

except requests.exceptions.HTTPError as err:
    print(f"HTTP错误:{err}")
【课堂练习】响应处理练习3:使用 raise_for_status() 自动检查状态码
复制上面的代码,运行截图即可。

两种方式的区别

手动检查状态码:

  • 需要逐个判断状态码
  • 更灵活,可以针对不同状态码执行不同操作
  • 代码相对冗长

raise_for_status() 自动检查:

  • 自动检查状态码是否为成功状态(200-299)
  • 如果不是成功状态码,自动抛出 HTTPError 异常
  • 代码更简洁,结合异常处理更健壮
  • 适合统一处理所有错误情况

五、会话和Cookie管理

Cookie,中文常译为“小型文本文件”或“曲奇文件”,是由网站服务器创建并发送到你的浏览器(如 Chrome、Firefox)的一小段数据。浏览器会将这些数据存储在你的本地电脑上。

一个简单的比喻: 当你去一家咖啡店时,店员给你一张会员卡,上面盖了章。下次你再光临时,出示这张卡片,店员就知道你之前消费过,可以享受累积的优惠。

  • 网站就像是咖啡店。
  • 你的浏览器就是你。
  • Cookie就是那张会员卡。

Cookie 的核心作用是让网站能够“记住”你和你的一些信息,从而提供更个性化、更便捷的浏览体验。具体来说,它的作用可以分为以下几类:

1. 会话管理 (Session Management):这是 Cookie 最基础、最重要的作用。

  • 保持用户登录状态:当你登录一个网站(如邮箱、社交媒体)时,服务器会发送一个 Cookie 到你的浏览器,其中包含一个唯一的会话 ID。之后你浏览该网站的其他页面时,浏览器都会把这个 Cookie 发回给服务器。服务器通过这个 ID 就知道“哦,是你,已经登录过了”,无需你在每个页面都重新输入密码。
  • 购物车信息:在网上购物时,即使你跳转到其他页面或关闭浏览器再回来,之前添加到购物车的商品依然还在,这也是 Cookie 的功劳。

2. 个性化设置 (Personalization):网站利用 Cookie 记住你的个人偏好。

  • 语言/主题设置:你选择了网站的语言为中文或使用了深色模式,下次访问时会自动应用这些设置。
  • 页面布局:某些新闻网站可以记住你自定义的版块排序。

3. 跟踪与分析 (Tracking & Analytics):网站和第三方服务(如 Google Analytics)使用 Cookie 来记录用户的浏览行为。

  • 网站分析:分析用户来自哪里,在网站上停留了多久,浏览了哪些页面等,以帮助网站优化内容和体验。
  • 广告投放:这是最常见也最受争议的一点。广告商利用 Cookie 跟踪你在不同网站上的行为,构建你的兴趣画像,从而向你展示更相关(或者说更精准)的广告。

5.3 Cookie示例

一、未登录状态(无法获取数据)

1
2
3
4
5
6
7
8
import requests

# 直接尝试访问需要登录的接口
response = requests.get('http://student_demo_v1.xuexiqu.cn/student/search?query=王&class=人工智能技术2024级01班')

print("=== 未登录状态 ===")
print("状态码:", response.status_code)
print("响应内容:", response.text)
【课堂练习】Cookie管理示例1:未登录状态
复制上面的代码,运行截图即可。

二、登录后状态(成功获取数据)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
import requests

# 创建会话并登录
session = requests.Session()
login_data = {"username": "20240070", "password": "20240070"}
login_response = session.post('http://student_demo_v1.xuexiqu.cn/login', json=login_data)

print("=== 登录结果 ===")
print("登录状态码:", login_response.status_code)
print("登录响应:", login_response.text)

# 使用同一个会话访问数据
print("\n=== 登录后访问数据 ===")
search_response = session.get('http://student_demo_v1.xuexiqu.cn/student/search?query=王&class=人工智能技术2024级01班')
print("搜索状态码:", search_response.status_code)
print("搜索响应:", search_response.text)
代码功能说明

代码功能说明:

  1. 使用requests.Session创建持久会话,后续请求共用同一TCP连接与Cookie。
  2. 向/login接口POST账号20240070、密码20240070的JSON数据,完成登录并自动保存返回的Cookie。
  3. 打印登录响应的状态码与正文,用于确认登录是否成功。
  4. 复用已登录的session,向/student/search接口发起GET请求,查询姓名含“王”且班级为“人工智能技术2024级01班”的学生信息。
  5. 打印搜索响应的状态码与正文,展示登录后的查询结果。
【课堂练习】Cookie管理示例2:登录状态
复制上面的代码,运行截图即可。

三、对比总结

状态 认证方式 数据获取 结果
未登录 无认证信息 ❌ 失败 返回错误,无数据
已登录 会话保持Cookie ✅ 成功 返回真实学生数据

六、学生信息管理系统:requests实战案例

6.1 系统简介

系统地址: 学生信息管理系统 (V1版本)

系统简介:学生信息管理系统-V1版本,引入了用户登录机制,通过 Cookie 实现身份认证,用户必须登录才能访问学生列表和个人信息。 登录后,学生仅能查看和修改自己的信息,并提供了密码修改功能,系统通过在每次请求中携带身份凭证(Cookie)来确保数据访问的安全性和权限的精确控制。

在本实战案例中,我们将使用 requests 库完成 学生信息管理系统 (V1版本) 的 API 调用。

6.2 登录实现

【课堂练习】学生信息管理系统V1-练习1:登录

请使用 Python 的 requests 库完成用户登录功能的代码实现。要求向指定 URL 发送 POST 请求,携带用户名和密码信息,并获取服务器返回的响应。

具体要求如下:

  1. 打开: 学生信息管理系统 (V1版本)

  2. 找到“登录”的接口,使用 apifox 调用该接口,保证该接口可以正常调用和返回;

  3. 使用 requests 库发送上面的请求,并使用 JSON 携带用户名和密码信息;

  4. 打印响应状态码、cookies 信息和 JSON 响应内容。

  5. 将 完整代码 和 运行结果截图 提交到讨论区。

6.3 查询学生列表

【课堂练习】学生信息管理系统V1-练习2:复用session查询学生列表

请使用 Python 的 requests 库完成 查询学生列表 功能的代码实现。需要复用登录的 session 调用 查询学生列表 的接口。

方式1:复用登录的 session 查询学生列表

具体要求如下:

  1. 打开:学生信息管理系统 (V1版本)
  2. 找到"查询学生列表"的接口,使用 apifox 调用该接口,保证该接口可以正常调用和返回;
  3. 先创建 Session 对象维持会话状态,向登录接口发送 POST 请求,携带用户名和密码(参考上面的:登录后状态(成功获取数据));
  4. 使用同一个 Session 对象发送"查询学生列表"的请求;
  5. 打印响应状态码和 JSON 响应内容。
  6. 将 完整代码 和 运行结果截图 提交到讨论区。
【课堂练习】学生信息管理系统V1-练习3:添加Cookie请求头查询学生列表

请使用 Python 的 requests 库完成 查询学生列表 功能的代码实现。在调用 查询学生列表 接口时需要手动添加 Cookie 请求头。

方式2:添加 Cookie 请求头查询学生列表

具体要求如下:

  1. 打开:学生信息管理系统 (V1版本)
  2. 找到"查询学生列表"的接口,使用 apifox 调用该接口,保证该接口可以正常调用和返回;
  3. 在请求头中手动添加有效的 Cookie 信息(包含 sessionid);
  4. 使用 requests 库发送"查询学生列表"的 GET 请求,并在请求头中携带 Cookie;
  5. 打印响应状态码和 JSON 响应内容;
  6. 将 完整代码 和 运行结果截图 提交到讨论区。

提示:

  • 需要先通过登录获取有效的 Cookie;
  • Cookie 格式:'Cookie': 'sessionid=你的实际sessionid值'

6.4 搜索学生

【课堂练习】学生信息管理系统V1-练习4:带参数搜索学生信息

请使用 Python 的 requests 库完成 搜索学生信息 功能的代码实现。在调用 搜索学生 接口时需要携带查询参数和认证信息。

具体要求如下:

  1. 打开:学生信息管理系统 (V1版本)
  2. 找到"搜索学生"的接口,使用 apifox 调用该接口,保证该接口可以正常调用和返回;
  3. 在请求中设置查询参数(如搜索关键词)和请求头信息;
  4. 在请求头中携带有效的 Cookie 信息(包含 sessionid)进行身份认证;
  5. 设置合适的请求头信息,包括 User-Agent、Accept 等;
  6. 发送 GET 请求到搜索接口,并打印 响应状态码 和 JSON 响应内容;
  7. 将 完整代码 和 运行结果截图 提交到讨论区。

提示:

  • 搜索接口需要查询参数来指定搜索条件
  • 需要有效的 sessionid 进行身份验证

6.5 修改密码

【课堂练习】学生信息管理系统V1-练习5:修改用户密码

请使用 Python 的 requests 库完成 修改用户密码 功能的代码实现。在调用 修改密码 接口时需要携带认证信息和请求参数。

具体要求如下:

  1. 打开:学生信息管理系统 (V1版本)
  2. 找到"修改密码"的接口,使用 apifox 调用该接口,保证该接口可以正常调用和返回;
  3. 准备修改密码的 JSON 数据,包括原密码和新密码;
  4. 在请求头中携带有效的 Cookie 信息(包含 sessionid)进行身份认证;
  5. 设置合适的请求头信息,包括 User-Agent、Content-Type、Accept 等;
  6. 发送 POST 请求到修改密码接口,并打印响应状态码和 JSON 响应内容;
  7. 将 完整代码 和 运行结果截图 提交到讨论区。

提示:

  • 修改密码接口需要使用 POST 方法
  • 请求体需要包含原密码和新密码的 JSON 数据
  • Content-Type 需要设置为 application/json
  • 需要有效的 sessionid 进行身份验证

6.6 修改个人信息

【课堂练习】学生信息管理系统V1-练习6:修改个人信息

请使用 Python 的 requests 库完成 修改个人信息 功能的代码实现。在调用 修改个人信息 接口时需要携带认证信息和请求参数。

具体要求如下:

  1. 打开:学生信息管理系统 (V1版本)
  2. 找到"修改个人信息"的接口,使用 apifox 调用该接口,保证该接口可以正常调用和返回;
  3. 准备修改个人信息的 JSON 数据,包括姓名、年龄、性别、籍贯等信息;
  4. 在请求头中携带有效的 Cookie 信息(包含 sessionid)进行身份认证;
  5. 设置合适的请求头信息,包括 User-Agent、Content-Type、Accept 等;
  6. 使用 PUT 方法发送请求到修改个人信息接口(注意URL中包含学生ID);
  7. 打印响应状态码和 JSON 响应内容;
  8. 将 完整代码 和 运行结果截图 提交到讨论区。

提示:

  • 修改个人信息接口需要使用 PUT 方法
  • URL 中需要包含要更新的学生ID
  • 请求体需要包含学生信息的 JSON 数据
  • Content-Type 需要设置为 application/json
  • 需要有效的 sessionid 进行身份验证

6.7 退出登录

【课堂练习】学生信息管理系统V1-练习7:退出登录

请使用 Python 的 requests 库完成 用户退出登录 功能的代码实现。在调用 退出登录 接口时需要携带认证信息。

具体要求如下:

  1. 打开:学生信息管理系统 (V1版本)
  2. 找到"退出登录"的接口,使用 apifox 调用该接口,保证该接口可以正常调用和返回;
  3. 在请求头中携带有效的 Cookie 信息(包含 sessionid)进行身份认证;
  4. 设置合适的请求头信息,包括 User-Agent、Accept 等;
  5. 使用 POST 方法发送请求到退出登录接口;
  6. 打印响应状态码和 JSON 响应内容;
  7. 将 完整代码 和 运行结果截图 提交到讨论区。

提示:

  • 退出登录接口需要使用 POST 方法
  • 需要有效的 sessionid 进行身份验证才能成功退出
  • 退出登录后,该 sessionid 将失效

七、总结

7.1 requests 库的核心优势

requests 库是 Python 中最流行的 HTTP 请求库,其设计理念是"人性化"和"简单易用"。以下是 requests 库的主要优势:

  1. 简洁的 API 设计

    • 极大地简化了 HTTP 请求的复杂性
    • 提供直观的方法,如 requests.get()requests.post()
    • 减少了编写网络请求代码的样板代码
  2. 强大的功能支持

    • 支持多种 HTTP 方法:GET、POST、PUT、DELETE 等
    • 灵活的参数传递(查询参数、路径参数、请求头、Cookie)
    • 内置 JSON 解析和文件上传功能
    • 自动处理 Cookie 和会话管理
  3. 异常处理与状态码管理

    • raise_for_status() 方法简化错误检查
    • 丰富的响应属性(status_codeheaderstextjson()
    • 灵活的错误处理机制

7.2 最佳实践

  1. 请求参数管理

    • 优先使用 paramsjson 参数,避免手动拼接 URL
    • 使用字典管理请求参数,提高代码可读性
    • 对于复杂的请求,提前准备参数字典
  2. 异常处理

    1
    2
    3
    4
    5
    6
    7
    8
    
    try:
        response = requests.get(url)
        response.raise_for_status()
        data = response.json()
    except requests.exceptions.RequestException as e:
        print(f"请求发生错误:{e}")
    except ValueError as e:
        print(f"JSON解析错误:{e}")
  3. 会话管理

    • 对于需要保持状态的场景,使用 requests.Session()
    • 复用同一个 Session 对象可以节省连接开销
    • 自动管理 Cookie 和持久连接
0%