【PYTHON 基础系列-request 模块介绍】

news2024/11/25 16:07:11

一、requests库简介

使用requests库能快速构建 HTTP 请求,而无需深入了解底层网络协议细节。其API设计直观,使得发送请求就像调用函数一样简单,同时提供了丰富的选项以满足复杂网络交互的需求。这种设计使得无论是初学者还是经验丰富的开发者都能高效地使用 Requests 进行网络编程。

requests的特点如下:

全面的 HTTP 支持: 支持所有 HTTP 方法(GET、POST、PUT、DELETE、PATCH 等),以及常见的 HTTP 特性,如 cookies、重定向、压缩、认证、代理、连接池等。
自动内容处理: 自动解码响应内容,支持 JSON、HTML、XML 等常见格式,并可通过 .text 和 .content 属性直接访问解码后的文本或原始二进制数据。
便捷的请求构建: 可轻松设置请求头、查询参数、请求体、认证信息等,支持多部分表单上传、文件上传、JSON 数据发送等。
灵活的会话管理: 提供 Session 对象,用于维护请求之间的状态(如 cookies、headers),并支持连接池复用,提高性能。
强大的异常处理: 提供明确的异常层次结构,如 requests.exceptions.RequestException、requests.exceptions.HTTPError,便于捕获和处理网络错误、HTTP 状态码异常等。
广泛的兼容性: 支持 Python 2.7 及更高版本的 Python 3.x,与各种操作系统兼容。

Requests 基于 urllib3 模块构建,后者负责底层的网络通信。Requests 采用 Apache2 Licensed 开源协议,这意味着它是一个免费且开放源代码的软件,允许在商业和非商业项目中自由使用、修改和分发。

Requests 的官方文档详尽且易于阅读,提供了丰富的示例和指南,是学习和查阅库功能的首要资源:Requests官方文档

二、安装与导入

安装:

1、PC终端(CMD):

python -m pip install requests

2、PyCharm终端:

pip install requests

导入:

import requests


运行

三、核心组件及其常见属性

1、request

由于requests库主要用于客户端发起HTTP请求,它并不直接暴露一个名为Request的对象供开发者操作,而是提供了requests.Request类作为构建请求的基础,但通常用户更常与requests.Session及其实例方法(如.get()、.post()等)交互。请求构建过程中涉及的属性:

在这里插入图片描述

[请求方法及其区别:
在这里插入图片描述

2、response

当使用requests库收到服务器的响应时,会得到一个requests.Response对象,其常见属性包括:

在这里插入图片描述

布尔值

3、session

requests.Session是一个高级接口,用于管理一系列相关的HTTP请求,并且支持会话保持(如自动处理Cookies)。其主要属性和方法包括:
在这里插入图片描述

四、不同HTTP请求示例

1、GET请求

功能与语义: GET请求用于从服务器获取指定资源。发送GET请求相当于询问服务器:“请给我这个资源。”

参数位置: GET请求的参数通常放在URL的查询字符串中,即URL后面以?开始的部分,参数之间用&分隔,每个参数由键值对组成,键与值之间用等号 (=) 连接。例如:https://example.com/api/resource?param1=value1&param2=value2

缓存: GET请求的响应通常被认为是安全可缓存的。浏览器、代理服务器和其他中间件可能会缓存GET请求的响应结果,以便在未来相同请求时直接使用缓存,而不是再次向服务器请求。

幂等性: GET请求是幂等的,即多次执行相同GET请求(针对同一资源)应始终返回相同的响应结果,不会对服务器状态产生任何影响。

安全性: 相对安全,因为它不改变服务器状态。

示例:

import requests
url_get='https://postman-echo.com/get?key1=value1&key2=value2'
response = requests.get(url_get)
print(response.text)

控制台输出如下:

在这里插入图片描述

设置查询参数示例:

param={
    'key3':'value3',
    'key4':'value4',
    'key5':'value5',
}
response_get_param=requests.get(url_get,params=param)
print(response_get_param.url)
print(response_get_param.text)

控制台输出如下:
在这里插入图片描述

可以看到使用params参数传参,会将参数自动拼接到url上

2、POST请求

功能与语义: POST请求用于向服务器提交数据,主要用于创建新的资源或执行某种操作(更新、删除等,具体取决于API设计)。发送POST请求相当于告诉服务器:“请根据我提供的数据执行某个操作。”

参数位置: POST请求的数据通常放在请求正文中,可以是完整的资源表示(创建资源)或操作指令及关联数据(执行操作)。请求体的格式取决于Content-Type标头,常见的是application/json(JSON格式)或application/xml(XML格式)。

缓存: POST请求的响应通常不应被缓存,因为它们可能改变了服务器状态。

幂等性: POST请求不一定是幂等的,即多次执行相同POST请求可能会产生不同的结果(例如,创建多个新的资源)。但某些情况下,如当POST用于替换资源或执行幂等操作时,它也可以是幂等的。

安全性: POST请求可能引发副作用,因为它不仅用于创建资源,也可能执行非幂等操作。

提交请求体表单数据示例:

通过data参数传递表单编码数据,适用于POST、PUT等请求。数据会被编码为application/x-www-form-urlencoded格式

url_post='https://postman-echo.com/post'
data={
    'key':'value',
    'website':'www.baidu.com'
}
response_post_data=requests.post(url_post,data=data)
print(response_post_data.text)

控制台输出如下:
在这里插入图片描述

发送JSON数据示例:

通过json参数直接传递JSON数据,适用于支持JSON格式请求体的POST、PUT等请求。requests会自动将字典转换为JSON字符串,并设置Content-Type为application/json

json_data={
    'key':'value',
    'website':'www.baidu.com'
}
response_post_json=requests.post(url_post,json=json_data)
print(response_post_json.text)

控制台输出如下:

我们发现使用参数data、json,传参在请求正文中的位置是不一样的,

使用 data 参数时,数据将以 application/x-www-form-urlencoded 格式编码,并以 key=value 形式的字符串放置在请求正文中。
使用 json 参数时,数据将以 JSON 文本格式放置在请求正文中,结构清晰,适合传输复杂的数据结构。

3、上传文件

示例:


import requests
 
url_post='https://postman-echo.com/post'
file_path='./test.txt'
 
# 构建 multipart/form-data 格式的文件数据
files = {'file': open(file_path, 'rb')}
 
# 发起POST请求,携带文件数据
response = requests.post(url_post, files=files)
 
# 检查响应状态码
if response.status_code == 200:
    print("文件上传成功,响应内容:")
    print(response.text)
else:
    print(f"文件上传失败,状态码:{response.status_code}")

控制台输出如下:
在这里插入图片描述

五、Session实现会话管理

使用requests.Session()创建一个会话对象(session),以便在一系列请求之间保持某些状态,如请求头、公共参数、cookies、认证信息、连接池等。以下是使用session对象的示例:

1、通过Session对象设置全局请求头及全局参数

import requests
 
# 创建一个Session对象
session = requests.Session()
 
# 设置全局请求头(适用于所有通过此Session发出的请求)
session.headers.update({
    'User-Agent': 'MyApp/1.0',
    'X-Api-Key': 'your_api_key'
})
 
# 设置共享公共参数
session.params = {
    'param1': 'value1',
    'param2': 'value2'
}
 
# 使用Session对象发起GET请求
response = session.get('https://postman-echo.com/get')
 
# 检查响应状态码
if response.status_code == 200:
    print("GET请求成功,响应内容:")
    print(response.json())
else:
    print(f"GET请求失败,状态码:{response.status_code}")
 
 
# 使用Session对象发起POST请求,携带JSON数据
post_data = {
    "key1": "value1",
    "key2": "value2"
}
response = session.post('https://postman-echo.com/post', json=post_data)
 
# 检查响应状态码
if response.status_code == 200:
    print("POST请求成功,响应内容:")
    print(response.json())
else:
    print(f"POST请求失败,状态码:{response.status_code}")

控制台输出如下:
在这里插入图片描述
可以明显发现,使用Session()对象设置的全局请求头以及全局参数都实现了

2、通过Session对象管理cookie:

import requests
 
session = requests.Session()
# 使用Session对象发起GET请求,获取一个带Set-Cookie响应头的响应
response = session.get('https://postman-echo.com/cookies/set?foo=bar&baz=qux')
 
# 检查响应状态码
if response.status_code == 200:
    print("GET请求成功,响应内容:")
    print(response.json())
 
# 使用Session对象再次发起GET请求,此时Session会自动附上之前接收到的cookies
response = session.get('https://postman-echo.com/cookies')
 
# 检查响应状态码
if response.status_code == 200:
    print("\nCookies检查请求成功,响应内容:")
    print(response.json())
else:
    print(f"Cookies检查请求失败,状态码:{response.status_code}")
 
# 关闭Session(可选,释放资源)
session.close()
在这个示例中:

    首先创建了一个requests.Session()对象,用于管理一系列相关的HTTP请求。
    通过session.headers.update()方法设置了全局请求头。这些头信息将自动应用到通过该Session发出的所有请求上,无需在每次请求时单独设置。
    使用Session对象的get()方法发起一个GET请求,并检查响应状态码。如果状态码为200,说明请求成功,打印响应内容。
    使用Session对象的post()方法发起一个POST请求,携带JSON数据。同样检查响应状态码,如果状态码为200,说明请求成功,打印响应内容。
    (可选)使用session.close()关闭Session,释放相关资源。在实际使用中,尤其是在长生命周期的程序中,确保及时关闭Session以避免资源泄漏。

控制台输出如下:
在这里插入图片描述

希望以上内容能帮助大家有效理解requests模块,同时也建议大家通过开源api网站去强化练习使用requests,具备编写Python程序与各类Web服务进行交互的能力,为进一步学习网络编程、API开发与集成等技术打下坚实基础。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2109714.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Windows系统使用小皮面板搭建Kodcloud结合内网穿透体验私有云盘

文章目录 1.前言2. Kodcloud网站搭建2.1. Kodcloud下载和安装2.2 Kodcloud网页测试 3. cpolar内网穿透的安装和注册4. 本地网页发布4.1 Cpolar云端设置4.2 Cpolar本地设置 5. 公网访问测试6.结语 1.前言 本文主要为大家介绍一款国人自研的在线Web文件管理器可道云,…

计算机毕业设计选题推荐-大学生资助管理系统-Java/Python项目实战

✨作者主页:IT研究室✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

电商知识产权侵权有哪些

知识产权是人类智慧的结晶,是对创造性成果所赋予的法定权利集合。它犹如一座坚固的堡垒,守护着创新者的心血与努力。商标权、著作权、专利权等是其重要组成部分,当品牌成功获得相应登记证书,就如同举起了一面独属于自己的旗帜&…

VUE实现大小缩放轮播图

效果图 <template><view class"swiper-container" ref"root" touchstart"onTouchStart" touchend"onTouchEnd"><view click"evtChangeIndex(index)" class"side" v-for"(item, index) in sta…

AC访问规则--- 设备执行环境

两种设备执行环境&#xff1a; 1.支持使用应用提供商密钥签名的设备应用的设备执行环境。在这种情况下&#xff0c;设备应用&#xff08;即在应用容器中&#xff09;会提供应用提供商的证书。该证书由执行环境的应用安装程序进行验证。访问控制执行器将把此证书用作应用标识符&…

Python异步监控模块,让你的异步应用更智能!

在现代编程中&#xff0c;异步编程变得越来越流行。它让我们可以同时处理多个任务&#xff0c;提高效率。 然而&#xff0c;异步编程也带来了新的挑战&#xff0c;尤其是在调试和监控方面。 今天&#xff0c;我要向大家介绍一个Python异步监控模块—aiomonitor&#xff0c;它…

`GLIBCXX_3.4.29‘ not found,升级至libstdc++.so.6.0.29解决问题,欧拉服务器

背景&#xff1a;openGemini1.2升级为1.3&#xff0c;启动报错/usr/lib64/libstdc.so.6: version GLIBCXX_3.4.29’ not found &#xff0c;所以需要升级一下。 第一步&#xff1a; 执行命令&#xff1a; strings /usr/lib64/libstdc.so.6 | grep GLIBCXX先查看一下自己的GLIB…

06_TensorFlow2数学计算大揭秘:让AI也学会‘加减乘除’,笑料不断,干货满满!

1. 科学计算 Tensorflow2 重新组织了数学计算模块&#xff0c;其提供了数学计算、数值处理的全维度接口&#xff0c;方便了使用者对数据的处理。 2. tf.math 模块常用函数列表 Tensorflow 提供了丰富的数学计算函数&#xff0c;并将这些函数统一到了 tf.math 模块中&#xf…

一文讲清数字化转型规划业务架构、数据架构、技术架构、应用架构

什么是数字化转型的4A架构 数字化转型的4A架构规划是指企业在推进数字化进程中&#xff0c;通过构建业务架构&#xff08;Business Architecture&#xff09;、应用架构&#xff08;Application Architecture&#xff09;、数据架构&#xff08;Data Architecture&#xff09;…

记一次MES项目上线失败总结--数据库层面+代码层面优化方案

难熬三个夜晚&#xff01;&#xff01;&#xff01;按原计划将ERP的生产订单、排程单、牌卡计划、小包装、装箱单等生产数据通过接口的形式同步到MES系统&#xff0c;其中生产订单、排程单和小包装、装箱单的数据量相对较少&#xff0c;合计大概50w条左右的数据&#xff0c;同步…

2024年实体门店和企业怎么做短视频矩阵获客?为什么要做短视频矩阵?一文告诉你短视频矩阵源码系统搭建

短视频矩阵获客是一种基于多个短视频账号&#xff0c;通过不同职能划分和策略组合&#xff0c;实现更高效、更精准的客户获取方式。 一、短视频矩阵是什么&#xff1f; 短视频矩阵是指由多个短视频平台通过某种方式连接在一起&#xff0c;形成一个统一的短视频发布、分享和观…

TriforceAFL部署、使用与原理分析

文章目录 前言1、概述1.1、工作原理1.2、工作流程1.2.1、编译TriforceAFL1.2.2、编译TriforceLinuxSyscallFuzzer1.2.3、初始化资源1.2.3.1、种子初始化1.2.3.2、GuestOS初始化 1.2.4、afl-fuzz调度1.2.5、启动待Fuzz目标 2、安装与使用2.1、安装方法2.1.1、部署系统依赖组件2.…

fpga入门名词(1)

这是第一代FPGA ,在 FPGA&#xff08;现场可编程门阵列&#xff09;设计中&#xff0c;LCA&#xff08;逻辑单元阵列&#xff09;通常由几个关键组件构成&#xff0c;包括 IOB、CLB 和 Interconnect。以下是这些组件的简要说明&#xff1a; 1. IOB&#xff08;Input/Output B…

六款好用的企业防泄密软件推荐|文件防泄密软件哪个好

在当今信息化高速发展的时代&#xff0c;企业数据的安全与防泄密已成为每个企业不可忽视的重要议题。随着业务数据的不断增加和传输渠道的多样化&#xff0c;如何有效防止敏感信息泄露&#xff0c;成为企业管理者面临的一大挑战。幸运的是&#xff0c;市场上涌现出众多优秀的企…

6.1图的基本定义

1.有向图 2.无向图 3.完全图 无向完全图:任意两个顶点都存在边,n个顶点有n(n-1)/2条边 有向完全图:任意两个顶点间都存在方向相反的两条弧,有n(n-1)条边. 4.连通,连通图,连通分量--无向图 连通:顶点v到顶点w有路径存在 连通图:任意两点间都存在路径 连通分量/极大连通子图…

Kafka【十二】消费者拉取主题分区的分配策略

【1】消费者组、leader和follower 消费者想要拉取主题分区的数据&#xff0c;首先必须要加入到一个组中。 但是一个组中有多个消费者的话&#xff0c;那么每一个消费者该如何消费呢&#xff0c;是不是像图中一样的消费策略呢&#xff1f;如果是的话&#xff0c;那假设消费者组…

C++11,可变参数模板,lambda表达式,包装器

可变参数模板 在C11中模板也可以接收多个不定参数&#xff0c;就和int printf(const char *format, ...);函数一般模板也可以接收多个参数&#xff1b; // 可变参数模板 template<class ...Args> void testArgs(Args... args) { } int main() {testArgs(123…

【简单】 猿人学web第一届 第19题 乌拉乌拉

数据接口分析 数据接口为 https://match.yuanrenxue.cn/api/match/19 请求参数只需要携带 页码 cookie 只需要携带 sessionid 请求参数 和 cookie 都没有加密字段&#xff0c;直接用 python 请求 请求失败了 查看协议是 h2 的&#xff0c;再试试 httpx 请求 还是一样的结果…

Creating OpenAI Gym Environment from Map Data

题意&#xff1a;从地图数据创建 OpenAI Gym 环境 问题背景&#xff1a; I am just starting out with reinforcement learning and trying to create a custom environment with OpenAI gym. However, I am stumped with trying to create an environment (with roads and in…

【论文速读】| SEAS:大语言模型的自进化对抗性安全优化

本次分享论文&#xff1a;SEAS: Self-Evolving Adversarial Safety Optimization for Large Language Models 基本信息 原文作者: Muxi Diao, Rumei Li, Shiyang Liu, Guogang Liao, Jingang Wang, Xunliang Cai, Weiran Xu 作者单位: 北京邮电大学, 美团 关键词: 大语言模…