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

Python中的Requests库:HTTP请求的简单之道

目录

一、安装Requests库

二、发送请求

2.1 GET请求

2.2 POST请求

2.3 其他HTTP方法

三、处理响应

3.1 状态码

3.2 响应内容

3.3 自定义请求头

3.4 更多响应对象属性和方法

四、错误处理

五、高级请求

5.1 会话对象

5.2 SSL证书验证

5.3 设置代理

Http/Https代理

使用 SOCKS 代理

高级代理配置

六、其他拓展

chardet库


在Python的世界里,网络请求是日常开发中不可或缺的一部分。从简单的数据获取到复杂的API交互,我们都需要用到HTTP请求。而Requests库,作为Python中处理HTTP请求的利器,以其简洁的API和强大的功能,赢得了广大开发者的青睐。

一、安装Requests库

在开始之前,您需要确保已经安装了Requests库。如果您尚未安装,可以通过pip安装:

pip install requests

二、发送请求

使用Requests发送请求非常简单。下面是一些基本示例:

2.1 GET请求

GET请求是最常见的HTTP请求类型之一,用于从指定的资源请求数据。

import requestsresponse = requests.get('https://api.github.com')print(response.status_code)  # 打印状态码
print(response.content)  # 打印响应内容
2.2 POST请求

POST请求通常用于提交数据给指定的资源,比如提交表单。

import requestsdata = {'key': 'value'}
response = requests.post('https://httpbin.org/post', data=data)print(response.json())  # 打印JSON响应内容
2.3 其他HTTP方法

类似地,Requests支持其他所有HTTP方法:PUT、DELETE、HEAD、OPTIONS、PATCH。

response = requests.put('https://httpbin.org/put', data={'key': 'value'})
response = requests.delete('https://httpbin.org/delete')
response = requests.head('https://httpbin.org/get')
response = requests.options('https://httpbin.org/get')
response = requests.patch('https://httpbin.org/patch', data={'key': 'value'})

三、处理响应

当你发送一个请求后,Requests会返回一个响应对象。这个对象包含了请求的结果,例如:内容、编码、状态码等。

3.1 状态码

你可以通过status_code属性来获取服务器响应的HTTP状态码。

response = requests.get('https://api.github.com')
status_code = response.status_code
if status_code == 200:print('Success!')
elif status_code == 404:print('Not Found.')
3.2 响应内容

你可以使用textcontent属性来获取服务器返回的内容。text属性会基于HTTP头部对响应的编码进行解码,而content是字节码形式。

response = requests.get('https://api.github.com')
print(response.text)  # 返回Unicode格式的响应文本
print(response.content)  # 返回字节流格式的响应内容

如果响应是JSON格式,可以直接使用json()方法将其解析成Python的字典格式。

response = requests.get('https://api.github.com')
if response.status_code == 200:print(response.json())  # 解析JSON响应
3.3 自定义请求头

Requests允许你发送自定义的HTTP头部。你可以通过传递一个字典给headers参数来实现。

headers = {'User-Agent': 'My App/0.0.1','Accept': 'application/vnd.github.v3+json',
}response = requests.get('https://api.github.com', headers=headers)
3.4 更多响应对象属性和方法
属性/方法描述
status_code一个表示HTTP响应状态码的整数。例如,200表示成功,404表示未找到。
text响应内容的字符串形式,Requests根据HTTP头部的编码进行自动解码。
content响应内容的原始字节形式,适用于非文本响应内容。
json()如果响应内容是JSON格式,这个方法会解析响应内容并返回一个字典。
headers一个字典,包含HTTP响应的头部。头部名称全部为小写。
url获取发出请求的URL。
cookies一个CookieJar对象,包含服务器发送的所有cookies。
history如果有重定向,这是一个响应对象的列表,包含了历史中间的响应对象。
encoding从HTTP头部中推断出的响应内容编码。你可以修改这个属性来改变文本的编码。
reason与响应的状态码对应的文本表示,例如'Not Found''OK'
elapsed一个timedelta对象,表示从发送请求到响应被完全接收的时间间隔。
raise_for_status()如果响应的状态码指示一个HTTP错误,将抛出一个HTTPError异常。
iter_content()一个生成器,逐块提供响应内容,可以指定每块的大小。用于流式下载。
iter_lines()一个生成器,按行迭代响应内容,适用于流式下载文本内容。
raw原始响应对象,通常用于低级的响应处理,如:文件下载。
ok一个快速检查响应是否成功的布尔值(状态码在200-400之间)。
is_redirect如果响应是重定向,返回True。
is_permanent_redirect如果响应是一个永久重定向,返回True。
links返回包含解析头部中链接的字典(如Link响应头)。
next如果有可用的下一个请求的URL,这个属性将包含这个URL。
apparent_encoding字符集检测库(chardet)的推断编码,它可能不总是正确的。
connectionHTTP连接对象。
iter_content(chunk_size=1, decode_unicode=False)按照指定的块大小迭代响应数据,可选的解码Unicode。
iter_lines(chunk_size=512, decode_unicode=None, delimiter=None)逐行迭代响应,允许指定行分隔符。
close()释放网络连接(如果是保持活动状态的话)。

四、错误处理

当发生网络问题(如:DNS查询失败、拒绝连接等)或者失败的请求(请求超时、HTTP响应错误等)时,Requests可以抛出一个异常。

from requests.exceptions import HTTPError, Timeouttry:response = requests.get('https://api.github.com', timeout=1)response.raise_for_status()
except HTTPError as http_err:print(f'HTTP error occurred: {http_err}')
except Timeout as timeout_err:print(f'Timeout error occurred: {timeout_err}')
except Exception as err:print(f'Other error occurred: {err}')

五、高级请求

Requests还支持更高级的功能,比如会话对象、SSL证书验证、Cookie持久化等。

5.1 会话对象

会话对象允许你跨请求保持某些参数。它也会在同一个Session实例发出的所有请求之间保持cookie。

with requests.Session() as session:session.get('https://httpbin.org/cookies/set/sessioncookie/123456789')response = session.get('https://httpbin.org/cookies')print(response.text)  # 显示cookie信息
5.2 SSL证书验证

默认情况下,Requests会验证SSL证书,但你可以禁用它。

requests.get('https://kennethreitz.com', verify=False)

请注意,不建议在生产代码中禁用SSL证书验证,因为这会导致安全问题。

5.3 设置代理

Requests 库支持 HTTP 代理,这意味着您可以通过指定代理服务器来发送请求,从而隐藏您的原始 IP 地址或绕过网络限制。以下是关于如何在 Requests 中使用代理的简要说明。

Http/Https代理

要在请求中使用代理,您可以在发送请求时通过 proxies 参数传递一个代理字典。例如:

import requestsproxies = {'http': 'http://10.10.1.10:3128','https': 'https://10.10.1.11:1080',
}response = requests.get('http://example.org', proxies=proxies)

在上面的代码中,我们定义了一个 proxies 字典,其中包含用于 HTTP 和 HTTPS 请求的代理服务器地址。然后,我们在 requests.get() 函数的 proxies 参数中使用了这个字典。

使用 SOCKS 代理

Requests 也支持 SOCKS 协议,但这需要安装额外的第三方库 PySocks(可以通过 pip install PySocks 来安装)。一旦安装了 PySocks,您就可以使用 SOCKS 协议的代理。例如:

import requestsproxies = {'http': 'socks5://user:password@host:port','https': 'socks5://user:password@host:port'
}response = requests.get('http://example.org', proxies=proxies)
高级代理配置

Requests 库还允许您进行更高级的代理配置。比如,如果您想对某个特定的网站使用代理,而其他网站不使用,您可以针对特定主机设置代理:

import requestsproxies = {'http': 'http://10.10.1.10:3128','http://some.site': 'http://10.10.1.10:3128',
}response = requests.get('http://some.site', proxies=proxies)

六、其他拓展

chardet库

结合requestschardet可以很方便地处理网络请求中的编码问题。requests库虽然在许多情况下能够自动处理响应的编码,但在一些复杂或特殊的情景中,自动检测的编码可能不准确。在这种情况下,chardet可以作为一个强大的工具来帮助确定正确的字符编码。

基本流程

  1. 发送网络请求:首先使用requests发送HTTP请求。
  2. 获取原始字节内容:从响应中获取未解码的原始字节内容。
  3. 使用chardet检测编码:将原始字节内容传递给chardet.detect()函数,获取可能的编码。
  4. 解码内容:根据chardet返回的编码信息,解码原始字节内容。

示例代码

import requests
import chardet# 发送网络请求
response = requests.get('http://example.com')# 获取响应的原始字节内容
raw_bytes = response.content# 使用chardet检测字节串的编码
detected_info = chardet.detect(raw_bytes)
encoding = detected_info['encoding']# 根据检测到的编码解码字节串
if encoding:decoded_content = raw_bytes.decode(encoding)print(decoded_content)
else:print("编码检测失败")

注意事项

  • 字符编码检测不是100%准确的。chardet提供了一个自信度分数,表示它对推测的准确性有多确信,但有时它可能也会猜错。
  • 对于较短的文本,检测的准确性可能会降低,因为可用于分析的样本数量较少。
  • chardet可能会比较慢,尤其是在处理大文件时。如果性能是一个问题,应该考虑仅在必要时使用它。
  • 在某些场景下,已知的或预期的编码,手动指定编码可能更为高效和准确。

相关文章:

Python中的Requests库:HTTP请求的简单之道

目录 一、安装Requests库 二、发送请求 2.1 GET请求 2.2 POST请求 2.3 其他HTTP方法 三、处理响应 3.1 状态码 3.2 响应内容 3.3 自定义请求头 3.4 更多响应对象属性和方法 四、错误处理 五、高级请求 5.1 会话对象 5.2 SSL证书验证 5.3 设置代理 Http/Https代…...

[RK3566-Android11] 关于 a2dpsink -蓝牙支持接收播放/无PIN码连接

问题描述 1.蓝牙支持接收播放 2.蓝牙支持无PIN码连接(不需要弹出pin配对码请求弹窗) 3.蓝牙支持播放歌曲信息并应用层获取 解决方案: 1.a2dpsink-蓝牙需要支持接收播放补丁 1、device/rockchip/common/overlay/overlay/packages/apps/Blue…...

玩机进阶教程-----高通9008线刷XML脚本修改备份 檫除的操作步骤解析

在高通9008官方固件中我们可以看到刷写需要的脚本rawprogram0.xml和辅助脚本patch0.xml,脚本的作用在于将固件内各个分区对应写入手机内。根据分区地址段。然后判断脚本中那些分区不写入。以下步骤将分析emmc字库为例来讲解如何将默认刷入脚本修改为备份 檫除脚本。…...

前端路径问题总结

1.相对路径 不以/开头 以当前资源的所在路径为出发点去找目标资源 语法: ./表示当前资源的路径 ../表示当前资源的上一层路径 缺点:不同位置,相对路径写法不同2.绝对路径 以固定的路径作为出发点作为目标资源,和当前资源所在路径没关系 语法:以/开头,不同的项目中,固定的路径…...

YOLOv8改进 | 低照度检测 | 2024最新改进CPA-Enhancer链式思考网络(适用低照度、图像去雾、雨天、雪天)

一、本文介绍 本文给大家带来的2024.3月份最新改进机制,由CPA-Enhancer: Chain-of-Thought Prompted Adaptive Enhancer for Object Detection under Unknown Degradations论文提出的CPA-Enhancer链式思考网络,CPA-Enhancer通过引入链式思考提示机制,实现了对未知退化条件下…...

python的pip如何升级

升级pip的方法如下: 打开命令行工具。在Windows系统中,可以通过按下WinR键,然后输入"cmd"来打开命令提示符;在Mac或Linux系统中,可以直接打开终端。检查当前pip版本。在终端或命令行中输入以下命令&#…...

Collection与数据结构 Stack与Queue(一): 栈与Stack

1. 栈 1.1 概念 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。 压栈&…...

内部类(来自类和对象的补充)

❤️❤️前言~🥳🎉🎉🎉 hellohello~,大家好💕💕,这里是E绵绵呀✋✋ ,如果觉得这篇文章还不错的话还请点赞❤️❤️收藏💞 💞 关注💥&a…...

Android 高德地图

1.获取Key 进入高德开放平台控制台,创建一个新应用。在创建的应用上点击"添加key"按钮,在弹出的对话框中,依次输入key名称,选择服务平台为“Android平台”,输入发布版安全码 SHA1、以及 Package。 获取 S…...

代码随想录|Day31|贪心06|738.单调递增的数字

738.单调递增的数字 思路: 1. 从右向左遍历 从字符串的最后一位向前遍历,即从低位到高位进行检查。这是因为当我们修改某一位数字时,可能会影响到更低位的数字。 2. 检查并修改数字 在遍历过程中,如果发现当前位数字小于其前一位&…...

机械制造学习笔记

一、切削加工、切削运动的基本概念及刀具切削过程 切削加工: 定义:切削加工是利用切削刀具对工件进行切削,以去除多余材料并得到所需形状和尺寸的加工方法之一。应用:广泛应用于金属加工、木材加工、塑料加工等领域,是…...

Golang | Leetcode Golang题解之第3题无重复字符的最长子串

题目: 题解: func lengthOfLongestSubstring(s string) int {// 哈希集合,记录每个字符是否出现过m : map[byte]int{}n : len(s)// 右指针,初始值为 -1,相当于我们在字符串的左边界的左侧,还没有开始移动r…...

SWM341系列应用(上位机应用)

SWM341系列之上位机应用 1、分级图像和PNG、JPG的应用 现象:客户使用SWM34SVET6HMI_0.4.1版本上位机进行UI界面布局,反馈在模拟运行时(PC端)流畅,在Demo平台(设备端)运行卡顿。 分析及解决&…...

【软件工程】详细设计(一)

1. 引言 1.1 编写目的 该文档的目的是描述《学生成绩管理系统》项目的详细设计,其主要内容包括: 系统功能简介 系统详细设计简述 各个模块的实现逻辑 最小模块组件的伪代码 本文档的预期的读者是: 开发人员 项目管理人员 测试人员 …...

【AIGC】如何在Windows/Linux上部署stable diffusion

文章目录 整体安装步骤windows10安装stable diffusion环境要求安装步骤注意事项参考博客其他事项安装显卡驱动安装cuda卸载cuda安装对应版本pytorch安装git上的python包Q&A linux安装stable diffusion安装anaconda安装cudagit 加速配置虚拟环境挂载oss(optional…...

基于java实现的弹幕视频网站

开发语言:Java 框架:ssm 技术:JSP JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7(一定要5.7版本) 数据库工具:Navicat11 开发软件:eclipse/myeclip…...

【大数据存储】实验4 NoSQL数据库

实验4 NoSQL数据库 NoSQL数据库的安装和使用实验环境: Ubuntu 22.04.3 Jdk 1.8.0_341 Hadoop 3.2.3 Hbase 2.4.17 Redis 6.0.6 mongdb 6.0.12 mogosh 2.1.0 Redis 安装redis完成 新建终端启动redisredis-server新建一个终端redis-cli 建表操作 尝…...

从零学算法80

80. 删除有序数组中的重复项 II 给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使得出现次数超过两次的元素只出现两次 ,返回删除后数组的新长度。 不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外…...

Jupyter notebook文件默认存储路径以及更改方法

初次使用Jupyter Notebook,确实好用啊!但安装Anaconda后,打开Jupyter Notebook 的时候,新建文件的默认存储路径一般在C系统盘下面的XXX目录,那么路径是什么呢?我想把文件保存到其他的文件夹下应该怎么做呢&…...

WPF中通过自定义Panel实现控件拖动

背景 看到趋时软件的公众号文章(WPF自定义Panel:让拖拽变得更简单),发现可以不通过Drag的方法来实现ListBox控件的拖动,而是通过对控件的坐标相加减去实现控件的位移等判断,因此根据文章里面的代码,边理解边…...

Android15默认授权浮窗权限

我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf

FTP 客服管理系统 实现kefu123登录,不允许匿名访问,kefu只能访问/data/kefu目录,不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...

20个超级好用的 CSS 动画库

分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...

GO协程(Goroutine)问题总结

在使用Go语言来编写代码时,遇到的一些问题总结一下 [参考文档]:https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现: 今天在看到这个教程的时候,在自己的电…...

关于uniapp展示PDF的解决方案

在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项&#xff1a; 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库&#xff1a; npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...

人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent

安全大模型训练计划&#xff1a;基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标&#xff1a;为安全大模型创建高质量、去偏、符合伦理的训练数据集&#xff0c;涵盖安全相关任务&#xff08;如有害内容检测、隐私保护、道德推理等&#xff09;。 1.1 数据收集 描…...

CVPR2025重磅突破:AnomalyAny框架实现单样本生成逼真异常数据,破解视觉检测瓶颈!

本文介绍了一种名为AnomalyAny的创新框架&#xff0c;该方法利用Stable Diffusion的强大生成能力&#xff0c;仅需单个正常样本和文本描述&#xff0c;即可生成逼真且多样化的异常样本&#xff0c;有效解决了视觉异常检测中异常样本稀缺的难题&#xff0c;为工业质检、医疗影像…...

什么是VR全景技术

VR全景技术&#xff0c;全称为虚拟现实全景技术&#xff0c;是通过计算机图像模拟生成三维空间中的虚拟世界&#xff0c;使用户能够在该虚拟世界中进行全方位、无死角的观察和交互的技术。VR全景技术模拟人在真实空间中的视觉体验&#xff0c;结合图文、3D、音视频等多媒体元素…...

WPF八大法则:告别模态窗口卡顿

⚙️ 核心问题&#xff1a;阻塞式模态窗口的缺陷 原始代码中ShowDialog()会阻塞UI线程&#xff0c;导致后续逻辑无法执行&#xff1a; var result modalWindow.ShowDialog(); // 线程阻塞 ProcessResult(result); // 必须等待窗口关闭根本问题&#xff1a…...