Requests库发送HTTP请求
一、requests库简介
requests 库是 Python 中最流行和最简单的 HTTP 请求库,它提供了简洁优雅的 API,能够轻松地发送各种类型的 HTTP 请求。本章将详细介绍 requests 库的基本用法。
1.1 安装requests库
|
|
-i参数指定了使用清华大学镜像源来加速下载。二、GET请求详解
2.1 基本GET请求
最简单的 GET 请求只需要传入 URL:
|
|
requests.get() 是 Python requests 库中用于发送 HTTP GET 请求的方法。
根据示例1中学到的GET请求方法,完成以下任务:
- 打开 学生信息管理系统(V0版本),找到获取学生列表的请求接口;
- 使用 requests 库发送 get 请求;
- 获取并打印响应状态码及 JSON 格式的响应内容。
2.2 GET请求两种参数传递方式
2.2.1 查询参数
|
|
根据示例1中学到的带查询参数的GET请求方法,完成以下任务:
- 打开 学生信息管理系统(V0版本),找到搜索学生的请求接口;
- 使用 requests 库发送 get 请求,搜索所有姓名中包含"李"的学生;
- 获取并打印:完整的请求 URL、响应状态码及 JSON 格式的响应内容。
要求:参照方法1的代码格式,使用 params 参数传递搜索条件。
2.2.2 路径参数
|
|
2.3 GET请求设置请求头
|
|
根据示例1中学到的带请求头的 GET 请求方法,完成以下任务:
- 打开 学生信息管理系统(V0版本),找到获取学生列表的请求接口;
- 使用 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/
- 获取并打印:完整的请求 URL、响应状态码及JSON 格式的响应内容。
三、POST请求详解
3.1 表单数据提交(application/x-www-form-urlencoded)
|
|
3.2 JSON数据提交
|
|
根据示例1中学到的 POST 请求方法,完成以下任务:
- 打开 学生信息管理系统(V0版本),找到添加新学生的请求接口;
- 使用 requests 库发送 post 请求,添加一名新学生,信息如下:
- 学号:‘99999’
- 姓名:‘王芳’
- 年龄:19
- 班级:‘计算机2302班’
- 性别:‘女’
- 家乡:‘上海’
- 获取并打印:完整的请求 URL、响应状态码及JSON 格式的响应内容。
如果提示“该学号已存在”,则换一个任意数字的学号,再发送请求。
3.3 文件上传
|
|
四、响应处理
4.1 响应属性
|
|
response.text:
- 返回类型:字符串(str)
- 内容:原始的响应文本内容
- 编码:会自动处理字符编码
- 适用场景:任何文本格式(HTML、XML、纯文本等)
response.json():
- 返回类型:字典(dict)或列表
- 内容:将JSON格式的响应文本解析为Python数据结构
- 要求:响应内容必须是有效的JSON格式
- 适用场景:API接口返回的JSON数据
关键区别:
| 特性 | response.text |
response.json() |
|---|---|---|
| 返回类型 | 字符串 | 字典/列表 |
| 内容格式 | 原始文本 | 解析后的数据结构 |
| 错误处理 | 总是成功 | 如果不是JSON会报错 |
| 内存使用 | 较小 | 可能较大(解析后) |
response.json() 会抛出 json.decoder.JSONDecodeError 异常。4.2 状态码处理
将状态码处理分为手动检查和自动检查两种方式:
方式一:手动检查状态码
|
|
方式二:使用 raise_for_status() 自动检查
|
|
两种方式的区别
手动检查状态码:
- 需要逐个判断状态码
- 更灵活,可以针对不同状态码执行不同操作
- 代码相对冗长
raise_for_status() 自动检查:
- 自动检查状态码是否为成功状态(200-299)
- 如果不是成功状态码,自动抛出
HTTPError异常 - 代码更简洁,结合异常处理更健壮
- 适合统一处理所有错误情况
五、会话和Cookie管理
5.1 什么是 Cookie?
Cookie,中文常译为“小型文本文件”或“曲奇文件”,是由网站服务器创建并发送到你的浏览器(如 Chrome、Firefox)的一小段数据。浏览器会将这些数据存储在你的本地电脑上。
一个简单的比喻: 当你去一家咖啡店时,店员给你一张会员卡,上面盖了章。下次你再光临时,出示这张卡片,店员就知道你之前消费过,可以享受累积的优惠。
- 网站就像是咖啡店。
- 你的浏览器就是你。
- Cookie就是那张会员卡。
5.2 Cookie 的主要作用
Cookie 的核心作用是让网站能够“记住”你和你的一些信息,从而提供更个性化、更便捷的浏览体验。具体来说,它的作用可以分为以下几类:
1. 会话管理 (Session Management):这是 Cookie 最基础、最重要的作用。
- 保持用户登录状态:当你登录一个网站(如邮箱、社交媒体)时,服务器会发送一个 Cookie 到你的浏览器,其中包含一个唯一的会话 ID。之后你浏览该网站的其他页面时,浏览器都会把这个 Cookie 发回给服务器。服务器通过这个 ID 就知道“哦,是你,已经登录过了”,无需你在每个页面都重新输入密码。
- 购物车信息:在网上购物时,即使你跳转到其他页面或关闭浏览器再回来,之前添加到购物车的商品依然还在,这也是 Cookie 的功劳。
2. 个性化设置 (Personalization):网站利用 Cookie 记住你的个人偏好。
- 语言/主题设置:你选择了网站的语言为中文或使用了深色模式,下次访问时会自动应用这些设置。
- 页面布局:某些新闻网站可以记住你自定义的版块排序。
3. 跟踪与分析 (Tracking & Analytics):网站和第三方服务(如 Google Analytics)使用 Cookie 来记录用户的浏览行为。
- 网站分析:分析用户来自哪里,在网站上停留了多久,浏览了哪些页面等,以帮助网站优化内容和体验。
- 广告投放:这是最常见也最受争议的一点。广告商利用 Cookie 跟踪你在不同网站上的行为,构建你的兴趣画像,从而向你展示更相关(或者说更精准)的广告。
5.3 Cookie示例
一、未登录状态(无法获取数据)
|
|
二、登录后状态(成功获取数据)
|
|
代码功能说明:
- 使用requests.Session创建持久会话,后续请求共用同一TCP连接与Cookie。
- 向/login接口POST账号20240070、密码20240070的JSON数据,完成登录并自动保存返回的Cookie。
- 打印登录响应的状态码与正文,用于确认登录是否成功。
- 复用已登录的session,向/student/search接口发起GET请求,查询姓名含“王”且班级为“人工智能技术2024级01班”的学生信息。
- 打印搜索响应的状态码与正文,展示登录后的查询结果。
三、对比总结
| 状态 | 认证方式 | 数据获取 | 结果 |
|---|---|---|---|
| 未登录 | 无认证信息 | ❌ 失败 | 返回错误,无数据 |
| 已登录 | 会话保持Cookie | ✅ 成功 | 返回真实学生数据 |
六、学生信息管理系统:requests实战案例
6.1 系统简介
系统地址: 学生信息管理系统 (V1版本)。
系统简介:学生信息管理系统-V1版本,引入了用户登录机制,通过 Cookie 实现身份认证,用户必须登录才能访问学生列表和个人信息。 登录后,学生仅能查看和修改自己的信息,并提供了密码修改功能,系统通过在每次请求中携带身份凭证(Cookie)来确保数据访问的安全性和权限的精确控制。
在本实战案例中,我们将使用 requests 库完成 学生信息管理系统 (V1版本) 的 API 调用。
6.2 登录实现
请使用 Python 的 requests 库完成用户登录功能的代码实现。要求向指定 URL 发送 POST 请求,携带用户名和密码信息,并获取服务器返回的响应。
具体要求如下:
-
打开: 学生信息管理系统 (V1版本);
-
找到“登录”的接口,使用 apifox 调用该接口,保证该接口可以正常调用和返回;
-
使用 requests 库发送上面的请求,并使用 JSON 携带用户名和密码信息;
-
打印响应状态码、cookies 信息和 JSON 响应内容。
-
将 完整代码 和 运行结果截图 提交到讨论区。
6.3 查询学生列表
请使用 Python 的 requests 库完成 查询学生列表 功能的代码实现。需要复用登录的 session 调用 查询学生列表 的接口。
方式1:复用登录的 session 查询学生列表
具体要求如下:
- 打开:学生信息管理系统 (V1版本);
- 找到"查询学生列表"的接口,使用 apifox 调用该接口,保证该接口可以正常调用和返回;
- 先创建 Session 对象维持会话状态,向登录接口发送 POST 请求,携带用户名和密码(参考上面的:登录后状态(成功获取数据));
- 使用同一个 Session 对象发送"查询学生列表"的请求;
- 打印响应状态码和 JSON 响应内容。
- 将 完整代码 和 运行结果截图 提交到讨论区。
请使用 Python 的 requests 库完成 查询学生列表 功能的代码实现。在调用 查询学生列表 接口时需要手动添加 Cookie 请求头。
方式2:添加 Cookie 请求头查询学生列表
具体要求如下:
- 打开:学生信息管理系统 (V1版本);
- 找到"查询学生列表"的接口,使用 apifox 调用该接口,保证该接口可以正常调用和返回;
- 在请求头中手动添加有效的 Cookie 信息(包含 sessionid);
- 使用 requests 库发送"查询学生列表"的 GET 请求,并在请求头中携带 Cookie;
- 打印响应状态码和 JSON 响应内容;
- 将 完整代码 和 运行结果截图 提交到讨论区。
提示:
- 需要先通过登录获取有效的 Cookie;
- Cookie 格式:
'Cookie': 'sessionid=你的实际sessionid值'。
6.4 搜索学生
请使用 Python 的 requests 库完成 搜索学生信息 功能的代码实现。在调用 搜索学生 接口时需要携带查询参数和认证信息。
具体要求如下:
- 打开:学生信息管理系统 (V1版本);
- 找到"搜索学生"的接口,使用 apifox 调用该接口,保证该接口可以正常调用和返回;
- 在请求中设置查询参数(如搜索关键词)和请求头信息;
- 在请求头中携带有效的 Cookie 信息(包含 sessionid)进行身份认证;
- 设置合适的请求头信息,包括 User-Agent、Accept 等;
- 发送 GET 请求到搜索接口,并打印 响应状态码 和 JSON 响应内容;
- 将 完整代码 和 运行结果截图 提交到讨论区。
提示:
- 搜索接口需要查询参数来指定搜索条件
- 需要有效的 sessionid 进行身份验证
6.5 修改密码
请使用 Python 的 requests 库完成 修改用户密码 功能的代码实现。在调用 修改密码 接口时需要携带认证信息和请求参数。
具体要求如下:
- 打开:学生信息管理系统 (V1版本);
- 找到"修改密码"的接口,使用 apifox 调用该接口,保证该接口可以正常调用和返回;
- 准备修改密码的 JSON 数据,包括原密码和新密码;
- 在请求头中携带有效的 Cookie 信息(包含 sessionid)进行身份认证;
- 设置合适的请求头信息,包括 User-Agent、Content-Type、Accept 等;
- 发送 POST 请求到修改密码接口,并打印响应状态码和 JSON 响应内容;
- 将 完整代码 和 运行结果截图 提交到讨论区。
提示:
- 修改密码接口需要使用 POST 方法
- 请求体需要包含原密码和新密码的 JSON 数据
- Content-Type 需要设置为 application/json
- 需要有效的 sessionid 进行身份验证
6.6 修改个人信息
请使用 Python 的 requests 库完成 修改个人信息 功能的代码实现。在调用 修改个人信息 接口时需要携带认证信息和请求参数。
具体要求如下:
- 打开:学生信息管理系统 (V1版本);
- 找到"修改个人信息"的接口,使用 apifox 调用该接口,保证该接口可以正常调用和返回;
- 准备修改个人信息的 JSON 数据,包括姓名、年龄、性别、籍贯等信息;
- 在请求头中携带有效的 Cookie 信息(包含 sessionid)进行身份认证;
- 设置合适的请求头信息,包括 User-Agent、Content-Type、Accept 等;
- 使用 PUT 方法发送请求到修改个人信息接口(注意URL中包含学生ID);
- 打印响应状态码和 JSON 响应内容;
- 将 完整代码 和 运行结果截图 提交到讨论区。
提示:
- 修改个人信息接口需要使用 PUT 方法
- URL 中需要包含要更新的学生ID
- 请求体需要包含学生信息的 JSON 数据
- Content-Type 需要设置为 application/json
- 需要有效的 sessionid 进行身份验证
6.7 退出登录
请使用 Python 的 requests 库完成 用户退出登录 功能的代码实现。在调用 退出登录 接口时需要携带认证信息。
具体要求如下:
- 打开:学生信息管理系统 (V1版本);
- 找到"退出登录"的接口,使用 apifox 调用该接口,保证该接口可以正常调用和返回;
- 在请求头中携带有效的 Cookie 信息(包含 sessionid)进行身份认证;
- 设置合适的请求头信息,包括 User-Agent、Accept 等;
- 使用 POST 方法发送请求到退出登录接口;
- 打印响应状态码和 JSON 响应内容;
- 将 完整代码 和 运行结果截图 提交到讨论区。
提示:
- 退出登录接口需要使用 POST 方法
- 需要有效的 sessionid 进行身份验证才能成功退出
- 退出登录后,该 sessionid 将失效
七、总结
7.1 requests 库的核心优势
requests 库是 Python 中最流行的 HTTP 请求库,其设计理念是"人性化"和"简单易用"。以下是 requests 库的主要优势:
-
简洁的 API 设计
- 极大地简化了 HTTP 请求的复杂性
- 提供直观的方法,如
requests.get()、requests.post() - 减少了编写网络请求代码的样板代码
-
强大的功能支持
- 支持多种 HTTP 方法:GET、POST、PUT、DELETE 等
- 灵活的参数传递(查询参数、路径参数、请求头、Cookie)
- 内置 JSON 解析和文件上传功能
- 自动处理 Cookie 和会话管理
-
异常处理与状态码管理
raise_for_status()方法简化错误检查- 丰富的响应属性(
status_code、headers、text、json()) - 灵活的错误处理机制
7.2 最佳实践
-
请求参数管理
- 优先使用
params和json参数,避免手动拼接 URL - 使用字典管理请求参数,提高代码可读性
- 对于复杂的请求,提前准备参数字典
- 优先使用
-
异常处理
1 2 3 4 5 6 7 8try: 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}") -
会话管理
- 对于需要保持状态的场景,使用
requests.Session() - 复用同一个 Session 对象可以节省连接开销
- 自动管理 Cookie 和持久连接
- 对于需要保持状态的场景,使用