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 响应内容
你可以使用text
或content
属性来获取服务器返回的内容。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)的推断编码,它可能不总是正确的。 |
connection | HTTP连接对象。 |
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库
结合
requests
和chardet
可以很方便地处理网络请求中的编码问题。requests
库虽然在许多情况下能够自动处理响应的编码,但在一些复杂或特殊的情景中,自动检测的编码可能不准确。在这种情况下,chardet
可以作为一个强大的工具来帮助确定正确的字符编码。
基本流程
- 发送网络请求:首先使用
requests
发送HTTP请求。 - 获取原始字节内容:从响应中获取未解码的原始字节内容。
- 使用
chardet
检测编码:将原始字节内容传递给chardet.detect()
函数,获取可能的编码。 - 解码内容:根据
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控件的拖动,而是通过对控件的坐标相加减去实现控件的位移等判断,因此根据文章里面的代码,边理解边…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...
【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)
要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况,可以通过以下几种方式模拟或触发: 1. 增加CPU负载 运行大量计算密集型任务,例如: 使用多线程循环执行复杂计算(如数学运算、加密解密等)。运行图…...

零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...

什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...
React---day11
14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store: 我们在使用异步的时候理应是要使用中间件的,但是configureStore 已经自动集成了 redux-thunk,注意action里面要返回函数 import { configureS…...
IP如何挑?2025年海外专线IP如何购买?
你花了时间和预算买了IP,结果IP质量不佳,项目效率低下不说,还可能带来莫名的网络问题,是不是太闹心了?尤其是在面对海外专线IP时,到底怎么才能买到适合自己的呢?所以,挑IP绝对是个技…...
LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》
这段 Python 代码是一个完整的 知识库数据库操作模块,用于对本地知识库系统中的知识库进行增删改查(CRUD)操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 📘 一、整体功能概述 该模块…...

莫兰迪高级灰总结计划简约商务通用PPT模版
莫兰迪高级灰总结计划简约商务通用PPT模版,莫兰迪调色板清新简约工作汇报PPT模版,莫兰迪时尚风极简设计PPT模版,大学生毕业论文答辩PPT模版,莫兰迪配色总结计划简约商务通用PPT模版,莫兰迪商务汇报PPT模版,…...