当前位置: 首页 > news >正文

【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}')

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 使用 Python 模拟光的折射,反射,和全反射
  • 【技术解析】wx.request 封装:优化小程序网络请求的最佳实践
  • 人工智能面试题(Artificial Intelligence Algorithm Interview Questions)
  • 【深度学习】03-神经网络3-1梯度下降网络优化方法
  • 在Java中 String能存储多少个字符?
  • 前端——表单标签样式
  • 使用Python实现图形学曲线和曲面的B样条曲线算法
  • 通过 Xshell 无法连接到 Ubuntu
  • 计算机二级C语言练习题
  • 【AI写代码】使用 ChatGPT 写 ila
  • 【Oauth2整合gateway网关实现微服务单点登录】
  • pycharm恢复两边侧边栏常驻显示
  • 【QML 基础】QML ——描述性脚本语言,用于用户界面的编写
  • [深度学习]Pytorch框架
  • Windows11系统安装,配置CUDA、cuDNN等
  • “寒冬”下的金三银四跳槽季来了,帮你客观分析一下局面
  • angular组件开发
  • java取消线程实例
  • js正则,这点儿就够用了
  • pdf文件如何在线转换为jpg图片
  • Perseus-BERT——业内性能极致优化的BERT训练方案
  • React-flux杂记
  • Vue UI框架库开发介绍
  • 程序员最讨厌的9句话,你可有补充?
  • 对话:中国为什么有前途/ 写给中国的经济学
  • 复杂数据处理
  • 通过获取异步加载JS文件进度实现一个canvas环形loading图
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • 智能网联汽车信息安全
  • 《TCP IP 详解卷1:协议》阅读笔记 - 第六章
  • ​linux启动进程的方式
  • ​直流电和交流电有什么区别为什么这个时候又要变成直流电呢?交流转换到直流(整流器)直流变交流(逆变器)​
  • #NOIP 2014# day.1 生活大爆炸版 石头剪刀布
  • #Z0458. 树的中心2
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • (2)(2.4) TerraRanger Tower/Tower EVO(360度)
  • (pojstep1.1.1)poj 1298(直叙式模拟)
  • (SpringBoot)第二章:Spring创建和使用
  • (仿QQ聊天消息列表加载)wp7 listbox 列表项逐一加载的一种实现方式,以及加入渐显动画...
  • (附源码)spring boot智能服药提醒app 毕业设计 102151
  • (附源码)基于SSM多源异构数据关联技术构建智能校园-计算机毕设 64366
  • (六)c52学习之旅-独立按键
  • (四)TensorRT | 基于 GPU 端的 Python 推理
  • (算法)N皇后问题
  • (学习日记)2024.01.09
  • (一)【Jmeter】JDK及Jmeter的安装部署及简单配置
  • (一)python发送HTTP 请求的两种方式(get和post )
  • (一)模式识别——基于SVM的道路分割实验(附资源)
  • (转)Google的Objective-C编码规范
  • (转载)从 Java 代码到 Java 堆
  • .NET IoC 容器(三)Autofac
  • .NET 直连SAP HANA数据库
  • .Net(C#)自定义WinForm控件之小结篇
  • .Net6使用WebSocket与前端进行通信