【python】requests 库 源码解读、参数解读

文章目录

  • 一、基础知识
  • 二、Requests库详解
    • 2.1 requests 库源码简要解读
    • 2.2 参数解读
    • 2.3 处理响应
    • 2.4 错误处理

一、基础知识

以前写过2篇文章:

计算机网络基础: 【socket】从计算机网络基础到socket编程——Windows && Linux C语言 + Python实现(TCP+UDP)

http请求类型和状态码:常见网络通信协议(http、https、ws)及安全协议(SSL、TLS、XTLS)

请求方法描述
GET用于从服务器获取数据。
POST用于向服务器提交数据,通常用于创建新资源。
PUT用于向服务器更新或替换指定资源或创建新资源。
DELETE用于请求服务器删除指定资源。
HEAD与 GET 方法类似,但只请求获取响应头信息,不包括实际数据。
PATCH用于部分更新服务器上的资源。
OPTIONS用于获取服务器支持的请求方法列表,通常用于跨域请求预检。
CONNECT用于建立网络连接,通常由代理服务器使用。
TRACE用于在路径上对消息进行跟踪,通常用于诊断和调试。

状态码:200、401、404、404、500、503等是常见的。
在这里插入图片描述

  1. URI(Uniform Resource Identifier)

    • URI 是一个更广泛的概念,用于标识资源。
    • 它包括了 URL 和 URN(Uniform Resource Name)。
    • URI 可以提供资源的位置(URL)或名称(URN)。
  2. URL(Uniform Resource Locator)

    • URL 是 URI 的一个子集,专门用于标识资源的位置。
    • 它提供了资源在互联网上的具体地址,允许用户通过网络访问该资源。
    • URL 通常包括协议(如 http、https)、域名、路径和可能的查询字符串。

二、Requests库详解

Requests是一个简单易用的HTTP库,广泛用于Python中发送HTTP请求。它可以处理GET、POST、PUT、DELETE等请求,支持会话、文件上传、HTTP头设置等功能,适用于各种网络交互场景。

是常用的第三方库,python标准库是urllib

2.1 requests 库源码简要解读

通常我们会这样使用requests库:

import requestsr = requests.get(r'https://www.baidu.com')print(r.status_code)
print(r.text)

直接使用get函数来执行一个GET请求。

get()函数定义在requests库的api.py文件中,这个文件还定义了其他几个常用http请求类型的函数。

get()函数或者post()等函数,并没有直接实现功能,而是调用了request()函数,如:

def get(url, params=None, **kwargs):r"""Sends a GET request.:param url: URL for the new :class:`Request` object.:param params: (optional) Dictionary, list of tuples or bytes to sendin the query string for the :class:`Request`.:param \*\*kwargs: Optional arguments that ``request`` takes.:return: :class:`Response <Response>` object:rtype: requests.Response"""return request("get", url, params=params, **kwargs)

request()函数也没有直接完成具体功能:

def request(method, url, **kwargs):with sessions.Session() as session:return session.request(method=method, url=url, **kwargs)

api.py中的request()函数,创建了sessions.py文件中的Session()类的对象,再调用request()方法(sessions.py中Session类的方法)来完成一个http请求。

这里使用with语句,确保在使用后自动关闭。这样可以保持与服务器的连接,并在会话结束时释放资源。


即我们通常使用的requests.get()、requests.post()等都是封装后的函数,更加简洁、直观。


Session.request()的具体执行逻辑就不展开了,包括参数处理、请求的构建、连接和发送、接收响应、构建响应对象等内容,可以自己阅读sessions.py。你会发现它最终使用了urllib3(一个更高级的库,基于urllib)。

2.2 参数解读

这里就解读一下api.pyrequest()函数的参数,这些参数是各种常见http请求的可选参数。每种具体的请求get、put等,由于功能不同,可能不完全支持所有类型参数。

下表是request()函数的参数,使用封装后的函数如get()、post()的时候,就不必指定method和url,这些函数的名称就是请求的method、第一个参数就是url。

使用get()函数发送GET请求:

response = requests.get('https://blog.csdn.net/community/home-api/v1/get-business-list',params=params,cookies=cookies,headers=headers,
)

使用requst()函数发送GET请求:

response = requests.request(method='get',url='https://blog.csdn.net/community/home-api/v1/get-business-list',params=params,cookies=cookies,headers=headers,
)
参数类型描述
method字符串新的Request对象的方法:GETOPTIONSHEADPOSTPUTPATCHDELETE
url字符串新的Request对象的URL。
params可选,字典/元组/字节要发送的查询字符串,可以是字典、元组列表或字节。
data可选,字典/元组/字节/文件要发送在请求体中的数据,可以是字典、元组列表、字节或类文件对象。
json可选,Python对象要发送在请求体中的可JSON序列化的Python对象。
headers可选,字典与请求一起发送的HTTP头部字典。
cookies可选,字典或CookieJar与请求一起发送的cookie字典或CookieJar对象。
files可选,字典用于多部分编码上传的文件字典,格式为'name': file-like-objects{'name': file-tuple}
auth可选,元组启用基本/摘要/自定义HTTP认证的认证元组。
timeout可选,浮点数或元组服务器发送数据之前等待的秒数,浮点数或(connect timeout, read timeout)元组。
allow_redirects可选,布尔值启用/禁用GET/OPTIONS/POST/PUT/PATCH/DELETE/HEAD重定向,默认值为True
proxies可选,字典协议到代理URL的映射字典。
verify可选,布尔值或字符串控制是否验证服务器的TLS证书,布尔值为True,字符串为CA包的路径。默认值为True
stream可选,布尔值如果为False,则响应内容将立即下载。
cert可选,字符串或元组如果是字符串,表示ssl客户端证书文件的路径(.pem)。如果是元组,则为('cert', 'key')对。
returnResponse对象返回Response对象。
rtyperequests.Response返回类型。

常用的参数有:

  • method;
  • url;
  • headers;
  • cookies;
  • params;
  • data。

2.3 处理响应

(1)响应状态码
可以通过status_code获取响应状态码,以判断请求是否成功。

if response.status_code == 200:print('请求成功!')
else:print(f'请求失败,状态码:{response.status_code}')

(2)响应内容

响应内容可以是文本、JSON、字节等格式。

# 获取文本
text_content = response.text# 获取JSON
json_content = response.json()# 获取原始字节
binary_content = response.content

这些内容,通常还会进一步提取所需对象。

2.4 错误处理

requests库提供异常处理,可以通过捕获requests.exceptions中的异常进行处理。

try:response = requests.get('https://api.example.com/data')response.raise_for_status()  # 如果响应状态码是错误,抛出异常
except requests.exceptions.HTTPError as err:print(f'HTTP错误:{err}')
except requests.exceptions.RequestException as err:print(f'请求错误:{err}')

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

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

相关文章

环形缓冲区例子

即使使用中断函数或者定时器函数记录按键&#xff0c;如果只能记录一个键值的话&#xff0c;如果不能 及时读走出来&#xff0c;再次发生中断时新值就会覆盖旧值。要解决数据被覆盖的问题&#xff0c;可以使用 一个稍微大点的缓冲区&#xff0c;这就涉及数据的写入、读出&#…

MyBatis - 动态SQL

前言 我们在某网站填写个人信息时&#xff0c;时常会遇到可以选填的空&#xff08;即可填&#xff0c;可不填&#xff09;&#xff0c;由于之前讲过的Java中的SQL语句都是固定的&#xff0c;且我们不可能对所有情况都写出与之对应的插入语句&#xff08;太过繁琐&#xff09;&…

【LLM多模态】Animatediff文生视频大模型

note AnimateDiff框架&#xff1a;核心是一个可插拔的运动模块&#xff0c;它可以从真实世界视频中学习通用的运动先验&#xff0c;并与任何基于相同基础T2I的个性化模型集成&#xff0c;以生成动画。训练策略&#xff1a;AnimateDiff的训练包括三个阶段&#xff1a; 领域适配…

56 mysql 用户权限相关的实现

前言 这里讨论 mysql 的权限相关处理 使用如下语句创建 tz_test 用户, 并赋予他 test_02 数据库的查询权限 create user tz_test% identified by tz_test; grant select on test_02.* to tz_test%; 查询目标数据表, 数据如下, tz_test_02 UPDATE command denied to user …

前端——表单和输入

今天我们来学习web前端中的表单和输入 表单 HTML 表单用于收集用户的输入信息&#xff0c;用表单标签来完成服务器的一次交互。 HTML 表单表示文档中的一个区域&#xff0c;此区域包含交互控件&#xff0c;将用户收集到的信息发送到 Web 服务器。 HTML 表单通常包含各种输入…

Apache Dolphinscheduler:一个开源的分布式工作流调度系统

一个开源的分布式工作流调度系统 Apache Dolphinscheduler概述安装 单机部署准备工作启动DolphinScheduler登录DolphinScheduler启停服务命令配置数据库初始化数据库 DolphinScheduler集群模式准备工作修改install_env.sh文件修改dolphinscheduler_env.sh文件初始化数据库部署访…

【Python】数据可视化之分布图

分布图主要用来展示某些现象或数据在地理空间、时间或其他维度上的分布情况。它可以清晰地反映出数据的空间位置、数量、密度等特征&#xff0c;帮助人们更好地理解数据的内在规律和相互关系。 目录 单变量分布 变量关系组图 双变量关系 核密度估计 山脊分布图 单变量分布…

谷歌网站收录查询,怎么查看网站在谷歌的收录情况

在进行谷歌网站收录查询时&#xff0c;我们需采取一种既专业又系统的方法&#xff0c;以确保能够准确评估网站在谷歌搜索引擎中的可见性和收录状态。这一过程不仅关乎技术细节&#xff0c;还涉及到对搜索引擎优化&#xff08;SEO&#xff09;策略的理解与应用。以下是一个基于专…

MobaXterm基本使用 -- 服务器状态、批量操作、显示/切换中文字体、修复zsh按键失灵

监控服务器资源 参考网址&#xff1a;https://www.cnblogs.com/144823836yj/p/12126314.html 显示效果 MobaXterm提供有这项功能&#xff0c;在会话窗口底部&#xff0c;显示服务器资源使用情况 如内存、CPU、网速、磁盘使用等&#xff1a; &#xff08;完整窗口&#xff0…

QT| “无法粘贴窗口部件”错误以及customplot

“无法粘贴窗口部件”错误以及customplot “无法粘贴窗口部件”错误customplot下载添加到项目中使用QCustomPlot常用的代码 “无法粘贴窗口部件”错误 情景&#xff1a;使用QT设计界面&#xff0c;很多部分比较类似&#xff0c;可以复制另一个界面的ui&#xff0c;但是粘粘的时…

力扣 中等 1901.寻找峰值II

文章目录 题目介绍题解 题目介绍 题解 需要明白一个事实&#xff1a;从任意一个点出发&#xff0c;可以经过一个递增路径&#xff0c;找到一个极大值点。 求出一行的最大值&#xff0c;如果这行最大值比上面的要小&#xff0c;那峰值&#xff08;之一&#xff09;就会在上面 …

React-Native 中使用 react-native-image-crop-picker 在华为手机上不能正常使用拍照功能

背景: React-Native 0.66 中使用 react-native-image-crop-picker 在安卓 华为手机上不能正常使用拍照功能, 其他品牌正常 代码如下: import ImagePicker from react-native-image-crop-picker;ImagePicker.openCamera(photoOptions).then(image > {callback(image);}) …

如何释放并重新获得ip地址呢?

如何释放并重新获得ip地址呢&#xff1f; 释放并重新获得一个IP地址的具体步骤如下&#xff1a; 1、要想从DHCP服务器重新获取ip&#xff0c;电脑必须设置成"自动获取ip",设置如下&#xff0c;在电脑桌面"网络"-属性-更改适配器设置为自动获取ip。 2、然…

在CentOS 6上安装Squid代理的方法

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 Status: 已弃用 本文涵盖的 CentOS 版本已不再受支持。如果您目前正在运行 CentOS 6 服务器&#xff0c;我们强烈建议升级或迁移到受支持…

【威领,德新,中达安】9.23复盘

威领这次的底部是4个月 所以这种跳空高开&#xff0c;远离5日均线的&#xff0c;如果不是近期的利好板块&#xff0c;那么第二天可能要回调5日均线。所以按照我的收益准则&#xff0c;吃一个板可以出一半了。 到顶部十字剩下一半也出掉了。 如果做长期&#xff0c;我依旧认为威…

CSS03-CSS的引入方式

一、CSS的三种样式表 1-1、内部样式表 示例&#xff1a; 1-2、行内样式表 1-3、外部样式表 1-4、小结

在Windows系统上安装的 Arrow C++ 库

在Windows系统上安装的 Arrow C 库 正文第一步第二步第三步第四步注: 检查是否安装成功 吐槽 正文 第一步 git clone gitgithub.com:apache/arrow.git第二步 打开powershell (好像cmd也可以,不过我试了powershell中不报错,cmd中报错,不是很清楚为什么) 打开arrow的目录 cd …

统信服务器操作系统【qcow2 镜像空间扩容】方案

使用 qcow2 镜像安装系统,当默认安装系统存储空间不够用时,进行自定义扩容 文章目录 准备环境扩容步骤一、检查环境信息1.查看镜像信息2.查看镜像分区信息3.确认需要扩容的分区名二、扩容1.备份镜像2.创建新的镜像文件,并指定空间3.将系统扩容到新的镜像三、扩容 lvm 分区四…

C++读取txt文件中的句子在终端显示,同时操控鼠标滚轮(涉及:多线程,产生随机数,文件操作等)

文章目录 运行效果功能描述代码mian.cppincludeMouseKeyControl.hTipsManagement.h srcMouseControl.cppTipsManagement.cpp 运行效果 功能描述 线程一&#xff1a;每隔n随机秒&#xff0c;动一下鼠标滚轮&#xff0c;防止屏幕息屏。 线程二&#xff1a;运行时加载txt文件中的…

【RocketMQ入门】

RocketMQ入门 RocketMQ是阿里巴巴开源的分布式消息中间件&#xff0c;现在是Apache的一个顶级项目。在阿里内部使用非常 广泛&#xff0c;已经经过了"双11"这种万亿级的消息流转。 RocketMQ环境搭建 接下来我们先在linux平台下安装一个RocketMQ的服务 环境准备 …