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

引言

在日常开发工作中,我们经常需要从远程服务器获取信息或向其发送数据。比如,当你要抓取网页内容时,或者在开发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.mfbz.cn/a/889334.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【环境搭建】MAC M1安装ElasticSearch

STEP1 官网下载ES Download Elasticsearch | Elastic,下载mac m1对应版本的es STEP2 进入bin文件夹,执行./elasticSearch 浏览器输入 127.0.0.1:9200 STEP 3 下载对应Kibana版本,Download Kibana Free | Get Started Now | Elastic 出现报错…

Linux驱动开发(速记版)--单总线

第124章 单总线简介 124.1 单总线概述 单总线是一种串行通信协议,由Dallas Semiconductor开发,特点是用一根信号线实现双向数据传输和时钟同步,节省IO口且结构简单。 它广泛应用于传感器、存储器等。 硬件包括信号线、上拉电阻、设备和处理器…

高亚科技助力优巨新材,打造高效数字化研发项目管理平台

近日,中国企业管理软件资深服务商高亚科技与广东优巨先进新材料股份有限公司(以下简称“优巨新材”)正式签署合作协议,共同推进产品研发管理数字化升级。此次合作的主要目标是通过8Manage PM项目管理系统,提升优巨新材…

现货黄金价格走势图策略分析 先看“势”

在现货黄金投资市场,对金价走势图的趋势进行分析,是投资者做出明智决策的关键步骤。通过有效的趋势分析,投资者可以更好地预测市场的走向,从而制定相应的交易策略。本文将详细介绍如何分析金价的趋势,并探讨这种分析方…

QStandardItemModel的role

QStandardItemModel定义了一些标准的角色,而QAbstractItemModel允许自定义角色。以下是一些常见的数据角色:1. **Qt::DisplayRole**:这是最基本的角色,用于显示在视图中的文本。当一个单元格被绘制时,通常会查询这个角…

鸿蒙next开发者第一课02.DevEcoStudio的使用-习题

【习题】DevEco Studio的使用 通过/及格分80/ 满分100 判断题 1. 如果代码中涉及到一些网络、数据库、传感器等功能的开发,均可使用预览器进行预览。F 正确(True)错误(False) 预览器不能进行传感器等特殊功能的开发,需要使用真机开发 2. module.json5文件中的…

【大模型理论篇】精简循环序列模型(minGRU/minLSTM)性能堪比Transformer以及对循环神经网络的回顾

1. 语言模型之精简RNN结构 近期关注到,Yoshua Bengio发布了一篇论文《Were RNNs All We Needed?》,提出简化版RNN(minLSTM和minGRU)。该工作的初始缘由:Transformer 在序列长度方面的扩展性限制重新引发了对可在训练期…

消费者Rebalance机制

优质博文:IT-BLOG-CN 一、消费者Rebalance机制 在Apache Kafka中,消费者组 Consumer Group会在以下几种情况下发生重新平衡Rebalance: 【1】消费者加入或离开消费者组: 当一个新的消费者加入消费者组或一个现有的消费者离开消费…

若依项目搭建(黑马经验)

欢迎你搜索和了解到若依,这个项目是从黑马课程的一个实践,更多的项目经历和平台搭建期待着我们的共同学习! 关于若依 若依是一套全部开源的快速开发平台,毫无保留给个人及企业免费使用。 前端采用Vue、Element UI。后端采用Sprin…

使用Pytorch+Numpy+Matplotlib实现手写字体分类和图像显示

文章目录 1.引用2.内置图片数据集加载3.处理为batch类型4.设置运行设备5.查看数据6.绘图查看数据图片(1)不显示图片标签(2)打印图片标签(3)图片显示标签 7.定义卷积函数8.卷积实例化、损失函数、优化器9.训练和测试损失、正确率(1)训练(2)测试(3)循环(4)损失和正确率曲线(5)输出…

Spark_累加器

分布式共享只写变量 实现原理:  累加器用来把Executor端变量信息聚合到Driver端,在Driver程序中定义的变量,在Executor端的每个Task都会得到这个变量的一份新的副本,每个task更新这些副本的值后,传回Driver端进行mer…

执行node.js获取本机Ip命令,报:Error: Cannot find module ‘ip‘错误

Error: Cannot find module ip是由于没有改模块的依赖包,需要进行安装,以管理员的身份打开命令行,执行npm install ip 获取当前电脑的ip地址 方法一: const ip require("ip")/*** 1:获取当前电脑的ip地址*/ console.…

PPT技巧:保护PPT文件的方法有哪些?

PPT文件制作好之后保证文件不出错应该是很重要的,毕竟是要拿出去展示的,今天分享PPT加密方法给大家。希望能够帮助大家保护好自己的PPT文件。 打开密码 如果想要其他人需要输入正确的密码才能够打开文件查看并编辑,我们可以给PPT文件设置打…

Github优质项目推荐 - 第六期

文章目录 Github优质项目推荐 - 第六期一、【WiFiAnalyzer】,3.4k stars - WiFi 网络分析工具二、【penpot】,33k stars - UI 设计与原型制作平台三、【Inpaint-Anything】,6.4k stars - 修复图像、视频和3D 场景中的任何内容四、【Malware-P…

gitee开源商城diygw-mall

DIYGW可视化开源商城系统。所的界面布局显示都通过低代码可视化开发工具生成源码实现。支持集成微信小程序支付。 DIYGW可视化开源商城系统是一款基于thinkphp8 framework、 element plus admin、uniapp开发而成的前后端分离系统。 开源商城项目源码地址:diygw商城…

stm32定时器中断和外部中断

一,中断系统的介绍 中断:在主程序运行过程中,出现了特定的中断触发条件(中断源),使得CPU暂停当前正在运行的程序,转而去处理中断程序,处理完成后又返回原来被暂停的位置继续运行 中…

知识图谱入门——7:阶段案例:使用 Protégé、Jupyter Notebook 中的 spaCy 和 Neo4j Desktop 搭建知识图谱

在 Windows 环境中结合使用 Protg、Jupyter Notebook 中的 spaCy 和 Neo4j Desktop,可以高效地实现从自然语言处理(NLP)到知识图谱构建的全过程。本案例将详细论述环境配置、步骤实现以及一些扩展和不足之处。 源文件已上传我的资源区。 文章…

【深海王国】初中生也能画的电路板?目录合集

Hi٩(๑ ^ o ^ ๑)۶, 各位深海王国的同志们,早上下午晚上凌晨好呀~辛勤工作的你今天也辛苦啦 (o゜▽゜)o☆ 今天大都督为大家带来系列文章《初中生也能画的电路板》,帮你一周内快速入门PCB设计,手把手教你从元器件库添加、电路原理图绘制、…

初阶C语言-结构体

一.结构体的声明 1.结构体类型的声明 1.1结构的基础知识 结构是一些值的集合,这些值称为称为变量。结构的每个成员可以是不同类型的变量。 1.2结构的声明 struct tag //struct是结构体关键字,tag是结构体类型名称 { member - list;//成员变…

minio集群部署

最近接触到minio, 将本地集群部署,分别在ubuntu、centos stream9上进行了搭建,目前看里面的小坑不小,记录以下教程,以备忘、以供他人借鉴。 #### 准备 1、因新版本的minio要求,集群部署必须使用挂载非 roo…