当前位置: 首页 > 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控件的拖动,而是通过对控件的坐标相加减去实现控件的位移等判断,因此根据文章里面的代码,边理解边…...

Nuxt.js 中的路由配置详解

Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面

代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...

【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具

第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...

CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝

目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为:一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

HybridVLA——让单一LLM同时具备扩散和自回归动作预测能力:训练时既扩散也回归,但推理时则扩散

前言 如上一篇文章《dexcap升级版之DexWild》中的前言部分所说,在叠衣服的过程中,我会带着团队对比各种模型、方法、策略,毕竟针对各个场景始终寻找更优的解决方案,是我个人和我司「七月在线」的职责之一 且个人认为&#xff0c…...

基于江科大stm32屏幕驱动,实现OLED多级菜单(动画效果),结构体链表实现(独创源码)

引言 在嵌入式系统中,用户界面的设计往往直接影响到用户体验。本文将以STM32微控制器和OLED显示屏为例,介绍如何实现一个多级菜单系统。该系统支持用户通过按键导航菜单,执行相应操作,并提供平滑的滚动动画效果。 本文设计了一个…...

Electron简介(附电子书学习资料)

一、什么是Electron? Electron 是一个由 GitHub 开发的 开源框架,允许开发者使用 Web技术(HTML、CSS、JavaScript) 构建跨平台的桌面应用程序(Windows、macOS、Linux)。它将 Chromium浏览器内核 和 Node.j…...

智能体革命:企业如何构建自主决策的AI代理?

OpenAI智能代理构建实用指南详解 随着大型语言模型(LLM)在推理、多模态理解和工具调用能力上的进步,智能代理(Agents)成为自动化领域的新突破。与传统软件仅帮助用户自动化流程不同,智能代理能够自主执行工…...

【Linux】使用1Panel 面板让服务器定时自动执行任务

服务器就是一台24小时开机的主机,相比自己家中不定时开关机的主机更适合完成定时任务,例如下载资源、备份上传,或者登录某个网站执行一些操作,只需要编写 脚本,然后让服务器定时来执行这个脚本就可以。 有很多方法实现…...