Python中的HTTP高手:如何玩转requests模块

news2024/10/10 11:21:34

引言

在日常开发工作中,我们经常需要从远程服务器获取信息或向其发送数据。比如,当你要抓取网页内容时,或者在开发Web应用时需要调用第三方API接口等场景下,掌握如何高效地发送HTTP请求就显得尤为重要了。Requests模块正是为此而生,它不仅简化了发送各种类型HTTP请求的过程,还提供了丰富的功能来处理响应结果。

基础语法介绍

核心概念

  • GET:用于请求访问已经被URI(统一资源标识符)识别的资源。
  • POST:用于向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。
  • PUT:从客户端向服务器发送被请求资源的整个表示。
  • DELETE:请求服务器删除URI所标识的资源。

基本用法

import requests

response = requests.get('https://www.example.com')
print(response.status_code)  # 打印状态码
print(response.text)         # 获取网页源码

上述代码展示了最基本的GET请求操作。通过requests.get()函数可以轻松发起一个GET请求,并接收服务器返回的数据。response对象包含了所有从服务器接收到的信息,如状态码、响应头以及正文等。

基础实例

假设我们需要查询某个天气预报网站提供的JSON数据接口,获取北京当前的天气情况,可以这样写:

url = 'http://api.openweathermap.org/data/2.5/weather?q=Beijing&appid=YOUR_API_KEY'
response = requests.get(url)
weather_data = response.json()
print(weather_data['main']['temp'])  # 输出温度

注意替换YOUR_API_KEY为你自己的API密钥。这段代码首先构造了一个URL地址,然后通过requests.get()方法发起请求,最后解析返回的JSON数据,提取出温度值打印出来。

进阶实例

在实际开发过程中,我们往往需要处理更加复杂的HTTP请求,比如设置自定义头部信息、携带认证凭据等。下面是一个使用POST请求的例子,演示如何向服务器提交表单数据:

login_data = {
    'username': 'admin',
    'password': 'secret'
}
headers = {'Content-Type': 'application/x-www-form-urlencoded'}

response = requests.post('https://example.com/login', data=login_data, headers=headers)

if response.status_code == 200:
    print('登录成功!')
else:
    print('登录失败,请检查用户名和密码是否正确。')

这里我们定义了一个字典login_data用来存储表单字段及其值,并通过headers参数指定了请求头类型。之后调用requests.post()方法发送POST请求,并检查返回的状态码判断登录是否成功。

实战案例

接下来分享一个我在项目中遇到的真实案例。当时我们的团队正在开发一款基于地理位置的服务应用,需要频繁地与地图提供商的API进行交互,以获取用户附近的兴趣点信息。

  1. 问题描述:由于涉及到敏感的用户隐私保护问题,我们必须确保每次请求都经过加密处理,并且能够有效地管理API调用次数,防止超出限制。

  2. 解决方案:我们决定采用requests库来构建一个封装好的API客户端类,该类支持动态添加认证信息、自动重试失败请求等功能。

  3. 代码实现

class GeoServiceClient:
    def __init__(self, base_url, api_key):
        self.base_url = base_url
        self.api_key = api_key
        self.session = requests.Session()

    def _request(self, method, endpoint, params=None, retries=3):
        url = f'{self.base_url}/{endpoint}'
        headers = {'Authorization': f'Bearer {self.api_key}'}
        
        for _ in range(retries):
            try:
                resp = self.session.request(method, url, headers=headers, params=params)
                resp.raise_for_status()  # 如果响应状态码不是200,将抛出HTTPError异常
                return resp.json()
            except requests.exceptions.RequestException as e:
                print(f'Request failed: {e}')
                continue
        
        raise Exception('Max retries exceeded')

    def search_places(self, location, radius=5000):
        params = {'location': location, 'radius': radius}
        return self._request('GET', 'search', params=params)

# 使用示例
client = GeoServiceClient('https://maps.googleapis.com/maps/api/place/nearbysearch/json', 'YOUR_API_KEY')
results = client.search_places('40.7128,-74.0060')  # 查询纽约市附近地点
for result in results['results']:
    print(result['name'], result['vicinity'])

通过这种方式,我们不仅简化了与外部API交互的过程,还增强了程序的健壮性和可维护性。

扩展讨论

虽然requests库已经足够强大,但在某些特定情况下可能还需要考虑其他替代方案。比如当你面对海量并发请求时,可能要考虑使用异步IO库如aiohttp;又或者在处理二进制数据流时,urllib3可能会更适合。总之,在选择合适的工具之前,首先要明确自己的需求是什么,然后再做出合理的选择。

此外,随着网络安全意识的提高,HTTPS已经成为事实上的标准。因此,在开发涉及敏感数据传输的应用时,务必确保使用安全连接,并验证证书的有效性。Requests库在这方面也做得非常好,它支持SSL/TLS加密,并允许你自定义信任哪些CA证书。

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

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

相关文章

无线领夹麦克风哪个降噪好?选购领夹麦克风需注意的五大隐藏风险

不知道大家有没有遇到这样一个情况,为什么有些视频或直播的声音听起来那么清晰,仿佛身临其境,而自己拍的视频却总是嘈杂不堪,尤其是在户外拍摄的时候,音频中更是充斥着各种各样的噪音。这种问题主要还是麦克风的原因所…

3dmax笔记-ALT X 透明度设置

1 降低max的模型的透明度 ALTX 看区别 区别对比

Sentinel最全笔记,详细使用步骤教程清单

一、Sentinel的基本功能 1、流量控制 流量控制在网络传输中是一个常用的概念,它用于调整网络包的发送数据。然而,从系统稳定性角度考虑,在处理请求的速度上,也有非常多的讲究。任意时间到来的请求往往是随机不可控的,…

分辨率提高4到8倍!AI高清修复工具-upscayl使用方法!

你还在为手中的模糊照片苦恼吗? 是不是想把老照片或低分辨率的图片用于大尺寸印刷,却因为画质糟糕而无从下手? 现在你不再需要高深的Photoshop技能,也不用花费巨资找人修图。借助AI高清修复工具Upscayl,只需几秒钟&am…

一文解读数据中台附搭建指南

数据是企业的核心资产,更是企业数字化转型的关键驱动力。为了更好地管理和利用数据,进行数据共享,充分发挥数据的作用,越来越多的企业开始构建实时数据中台。 一数据中台 定义:数据中台是将企业内部各个部门、系统、应…

【嵌入式软件-STM32】STM32简介

目录 一、STM32定义 二、STM32用途 三、STM32特点 四、STM32 四个系列 五、了解ARM 六、芯片解释 七、片上资源 八、命名规则 九、系统结构 内核 Flash DMA 外设种类和分布 十、引脚定义 类型 名称 引脚 十一、启动配置 十二、STM32最小系统电路 STM32及供电 供电引脚 滤波电容…

机器人动力学和轨迹规划

路径规划(way):规划连接位置A与位置B间序列点或曲线的策略。 注意:这个路径规划是非常重要的,是机器人智能的一个体现。 路径规划主要有3个方法:MoveJ:关节点到点运动,MoveL&#…

Spring Boot学习资源库:Java开发者的新篇章

2 相关技术简介 2.1Java技术 Java是一种非常常用的编程语言,在全球编程语言排行版上总是前三。在方兴未艾的计算机技术发展历程中,Java的身影无处不在,并且拥有旺盛的生命力。Java的跨平台能力十分强大,只需一次编译,任…

crossover和虚拟机哪个好用?Mac电脑玩游戏用哪个软件?

由于大多数热门游戏都是针对Windows平台开发的,这对于Mac用户来说可能会带来一些困扰。幸运的是,有几款虚拟机软件可以帮助解决这个问题,其中最常提到的是Parallels Desktop(简称PD虚拟机)和CrossOver。 PD虚拟机&…

Nodejs-Nestjs框架 RBAC(基于角色的访问控制模型) 微服务 仿小米商城实战视频教程-2024年-试看学习记录

文章目录 前提-安装环境Nestjs框架介绍Nestjs框架环境搭建创建nestjs项目运行nestjs项目demonestjs新项目结构解释nestjs中的控制器、路由、Get、Post、方法参数装饰器nestjs模板引擎、配置静态资源(了解即可)nestjs中的服务(Model)nestjs中的cookie(了解即可)nestjs中的se…

企业工作者如何提高对数据治理的认知度

提高对数据治理的认知度是一个涉及多方面努力的过程,以下是一些建议,可以帮助企业或个人增强对数据治理的理解和重视: 一、教育与培训 组织内部培训:定期举办数据治理相关的培训课程,邀请行业专家或内部资深人士进行…

AI用得好,升职加薪早

最近,K哥在公司里经常说的一句话就是:“AI用得好,升职加薪早!” 而且我们团队每个人都增加了一条KPI,叫做“含AI量”。什么意思呢?就是完成一项工作,使用了多少AI工具。 我不仅这样要求团队&…

JS 数组去重 — 各类场景适合方法大全

JS 数组去重 — 各类场景适合方法大全 本文介绍各种场景 JS 去重 方法使用 性能最好、用的最多、场景大全 文章目录 JS 数组去重 — 各类场景适合方法大全 一、基础篇:简单直观的去重方法1. 使用Set数据结构2. 利用filter和indexOf方法3. reduce方法的应用 二、进阶…

国产长芯微LDC5422单通道、16位、电流源和电压输出DAC,HART连接完全P2P替代AD5422

描述 LDC5422是低成本、精密、完全集成、16位数模转换器(DAC),内置可编程电流源和可编程电压输出,设计用于满足工业过程控制应用的需要。 输出电流范围可编程设置为4 mA至20 mA、0 mA至20 mA或者超量程的0 mA至24 mA。 此产品的LFCSP版本有一个CAP2引脚…

Linux运维_安全狗Apache版本安装

--------->安全狗官网(网站安全狗-网站安全防护,防后门|防SQL注入|防CC攻击|网马查杀|防篡改) 1.下载解压安全狗 2.

《Windows PE》4.3 延迟加载导入表

延迟加载导入表(Delayed Import Table)是PE文件中的一个数据结构,用于实现延迟加载(Lazy Loading)外部函数的机制。 延迟加载是指在程序运行时,只有当需要使用某个外部函数时才进行加载和绑定,…

【最新华为OD机试E卷-支持在线评测】最小的调整次数(100分)多语言题解-(Python/C/JavaScript/Java/Cpp)

🍭 大家好这里是春秋招笔试突围 ,一枚热爱算法的程序员 💻 ACM金牌🏅️团队 | 大厂实习经历 | 多年算法竞赛经历 ✨ 本系列打算持续跟新华为OD-E/D卷的多语言AC题解 🧩 大部分包含 Python / C / Javascript / Java / Cpp 多语言代码 👏 感谢大家的订阅➕ 和 喜欢�…

CAN和CANFD如何转换和通信

随着科技的发展,汽车电子和工业领域中CAN通信需要承载数据量也越来越大,传统CAN通信有了向CANFD通信过渡的倾向。在实现过渡的过程中可能会出现自己设备是CAN通信,客户设备是CANFD通信的情况,或者自己设备是CANFD通信,…

MySQL高阶2084-为订单类型为0的客户删除类型为1的订单

目录 题目 准备数据 分析数据 总结 题目 编写SQL查询以根据以下条件报告所有订单: 如果客户至少有一个类型为0的订单,则不要报告该客户的任何类型为1的订单。否则,报告客户的所有订单。 按任意顺序返回结果表。 准备数据 Create tab…

【java】spring boot打war包

【java】spring boot打war包 第1步:修改pom.xml文件的打包方式 在项目根目录下找到pom.xml文件,首先看看你的文件内容里有没有packaging节点;如果有packaging节点,直接修改节点为war<packaging>war</packaging><