如何使用Python发送HTTP请求(requests库)?

答案:使用requests库可简洁发送HTTP请求。通过get()、post()等方法发送请求,配合params、headers、json等参数传递数据,利用raise_for_status()处理错误,使用Session保持会话、复用连接,提升效率与代码可读性

如何使用python发送http请求(requests库)?

Python中发送HTTP请求,最简洁、最符合直觉的方式莫过于使用

requests

库。它将底层HTTP连接的复杂性封装得很好,让我们能以一种非常“Pythonic”的风格来与Web服务交互,无论是获取数据、提交表单还是处理API调用,都变得异常轻松。

解决方案

使用

requests

库发送HTTP请求,核心在于调用其提供的各种请求方法,如

get()

post()

put()

delete()

等。首先,你得确保你的环境中安装了它:

pip install requests

安装完毕,我们就可以开始使用了。最常见的操作是发送GET请求来获取资源,比如从一个API端点拉取数据:

import requests# 1. 发送一个简单的GET请求try:    response = requests.get('https://api.github.com/users/octocat')    # 检查响应状态码,如果不是200,会抛出HTTPError    response.raise_for_status()    # 打印响应内容    print("GET请求成功!")    print(f"状态码: {response.status_code}")    print(f"响应头: {response.headers['Content-Type']}")    print(f"响应JSON数据: {response.json()}")except requests.exceptions.HTTPError as errh:    print(f"HTTP错误: {errh}")except requests.exceptions.ConnectionError as errc:    print(f"连接错误: {errc}")except requests.exceptions.Timeout as errt:    print(f"超时错误: {errt}")except requests.exceptions.RequestException as err:    print(f"其他请求错误: {err}")print("-" * 30)# 2. 发送一个POST请求,通常用于提交数据# 假设我们想向一个虚拟的API提交一些数据post_data = {    'name': 'John Doe',    'email': 'john.doe@example.com',    'message': 'Hello from Python requests!'}# 对于JSON数据,使用json参数更方便,requests会自动设置Content-Type为application/jsontry:    post_response = requests.post('https://httpbin.org/post', json=post_data)    post_response.raise_for_status()    print("POST请求成功!")    print(f"状态码: {post_response.status_code}")    print(f"服务器收到的JSON数据: {post_response.json()['json']}")except requests.exceptions.RequestException as err:    print(f"POST请求错误: {err}")print("-" * 30)# 3. 发送带查询参数的GET请求# 比如搜索GitHub仓库params = {'q': 'requests+language:python', 'sort': 'stars', 'order': 'desc'}try:    search_response = requests.get('https://api.github.com/search/repositories', params=params)    search_response.raise_for_status()    print("带参数的GET请求成功!")    print(f"第一个搜索结果的名称: {search_response.json()['items'][0]['full_name']}")except requests.exceptions.RequestException as err:    print(f"带参数的GET请求错误: {err}")

这段代码展示了

requests

库的几个核心功能:发送GET和POST请求,处理JSON数据,以及如何优雅地处理网络请求中可能出现的各种错误。你会发现,它真的把HTTP的复杂性隐藏得很好,让开发者能专注于业务逻辑本身。

立即学习“Python免费学习笔记(深入)”;

处理请求中的常见错误和异常,确保代码健壮性

在实际的Web交互中,网络请求往往是脆弱的,各种意外情况层出不穷:网络中断、服务器无响应、请求超时、认证失败、API返回错误状态码等等。因此,仅仅发送请求是不够的,我们必须妥善处理这些潜在的错误,才能让我们的程序足够健壮。

requests

库在这方面做得相当不错,它将不同类型的错误封装在

requests.exceptions

模块下。最基础的,我们通常会用

try...except

块来捕获这些异常。例如,

requests.exceptions.ConnectionError

会在无法连接到服务器时抛出,

requests.exceptions.Timeout

则在请求超时时触发。

但我个人觉得,最常用也最关键的一个是

response.raise_for_status()

。这个方法非常巧妙,它会检查响应的状态码。如果状态码表示一个客户端错误(4xx)或服务器错误(5xx),它就会自动抛出一个

requests.exceptions.HTTPError

。这省去了我们手动检查

response.status_code >= 400

的麻烦,让错误处理逻辑更加清晰。

举个例子,假设你正在调用一个需要认证的API,但你忘记传递Token,服务器很可能会返回一个401 Unauthorized。如果你没有使用

raise_for_status()

,你的代码可能会继续尝试解析响应体,最终因为响应体不是预期的JSON格式而崩溃。但有了它,程序会立即抛出

HTTPError

,我们就能在

except

块中捕获并处理,比如记录日志、重试或者通知用户。

import requests# 尝试访问一个不存在的页面,预期会得到404try:    bad_response = requests.get('https://httpbin.org/status/404')    bad_response.raise_for_status() # 这里会抛出HTTPError    print("这个不应该被打印出来")except requests.exceptions.HTTPError as e:    print(f"捕获到HTTP错误: {e}")    print(f"错误状态码: {e.response.status_code}")except requests.exceptions.RequestException as e:    print(f"捕获到其他请求错误: {e}")# 模拟一个连接超时try:    # 设置一个非常短的超时时间,例如0.001秒    requests.get('https://www.google.com', timeout=0.001) except requests.exceptions.Timeout as e:    print(f"捕获到超时错误: {e}")except requests.exceptions.RequestException as e:    print(f"捕获到其他请求错误: {e}")

通过这样的组合,我们不仅能应对网络连接层面的问题,也能有效处理HTTP协议层面的错误,让程序在面对各种“不确定性”时,依然能保持优雅和稳定。

如何发送带参数、头部或认证信息的复杂请求?

很多时候,简单的GET或POST请求是远远不够的。真实的Web服务往往要求我们发送更复杂的请求,比如带查询参数、自定义HTTP头部、表单数据、JSON负载,甚至是各种形式的认证信息。

requests

库对此提供了非常直观的接口。

1. 查询参数 (Query Parameters):前面已经提过,对于GET请求,我们可以通过

params

参数传递一个字典,

requests

会自动将其编码并附加到URL后面。

# 搜索GitHub仓库,指定语言和排序方式params = {'q': 'python web framework', 'language': 'python', 'sort': 'stars', 'order': 'desc'}response = requests.get('https://api.github.com/search/repositories', params=params)print(f"查询参数请求URL: {response.url}")

这样,URL就会变成类似

https://api.github.com/search/repositories?q=python+web+framework&language=python&sort=stars&order=desc

2. 自定义HTTP头部 (Custom Headers):HTTP头部非常重要,它承载着请求的元数据,比如

User-Agent

(标识客户端类型)、

Content-Type

(请求体的媒体类型)、

Authorization

(认证凭证)等。通过

headers

参数,我们可以传递一个字典来设置这些头部。

headers = {    'User-Agent': 'MyCustomPythonApp/1.0',    'Accept': 'application/json',    'X-Custom-Header': 'Hello from Python'}response = requests.get('https://httpbin.org/headers', headers=headers)print("自定义头部请求响应:")print(response.json()['headers']) # httpbin会回显所有收到的头部

这在与某些需要特定User-Agent或API Key的API交互时尤其有用。

3. 表单数据 (Form Data):当我们需要模拟HTML表单提交时,通常是POST请求,并且数据以

application/x-www-form-urlencoded

格式发送。

requests

通过

data

参数处理这种场景,传入一个字典即可。

form_data = {    'username': 'testuser',    'password': 'testpassword'}response = requests.post('https://httpbin.org/post', data=form_data)print("表单数据提交响应:")print(response.json()['form']) # httpbin会回显收到的表单数据

4. JSON数据 (JSON Payload):现代API通常期望请求体是JSON格式。

requests

提供了

json

参数,它会自动将Python字典序列化为JSON字符串,并设置

Content-Type

application/json

。这比手动

json.dumps()

并设置

headers

要方便得多。

json_payload = {    'title': 'My New Post',    'body': 'This is the content of my new post.',    'userId': 1}response = requests.post('https://jsonplaceholder.typicode.com/posts', json=json_payload)print("JSON数据提交响应:")print(f"状态码: {response.status_code}")print(response.json())

5. 认证 (Authentication):

requests

内置了对基本认证(Basic Authentication)和摘要认证(Digest Authentication)的支持。

基本认证:

from requests.auth import HTTPBasicAuthresponse = requests.get('https://httpbin.org/basic-auth/user/passwd', auth=HTTPBasicAuth('user', 'passwd'))print(f"基本认证响应状态: {response.status_code}")print(response.json())

更简洁的方式是直接传入一个元组:

auth=('user', 'passwd')

OAuth等复杂认证:对于OAuth或其他更复杂的认证机制,通常需要手动在

headers

中添加

Authorization

字段,或者使用专门的库(如

requests-oauthlib

)来生成认证头部。

这些选项的组合使用,让

requests

能够应对几乎所有常见的HTTP请求场景。它强大的功能和简洁的API,确实是Python进行网络编程的首选工具

何时应该使用Requests会话(Session)以及它的优势?

在许多Web交互场景中,我们不仅仅是发送单个独立的请求。我们可能会进行一系列相关的请求,例如:先登录,然后访问用户个人资料,接着提交一个表单。在这些连续的请求中,通常需要保持一些状态,比如认证凭证(cookies)、自定义的头部信息,甚至是底层的TCP连接。这时候,

requests.Session

对象就显得非常重要和高效了。

我发现,很多初学者在进行一系列请求时,往往会重复地在每个

requests.get()

requests.post()

调用中设置相同的

headers

params

cookies

。这不仅代码冗余,而且效率低下,因为每次独立的请求都可能需要重新建立TCP连接,并重新进行SSL/TLS握手,这会带来不必要的延迟。

requests.Session

的作用正是为了解决这些问题。当你创建一个

Session

对象后,它会为你维护以下几个关键特性:

持久化Cookies:

Session

对象会自动在请求之间存储和发送cookies。这意味着如果你在登录请求中收到了认证cookie,后续所有通过该

Session

发送的请求都会自动携带这个cookie,无需手动管理。默认参数: 你可以为

Session

对象设置默认的

headers

params

auth

等。这些设置会自动应用到所有通过该

Session

发送的请求上,极大地简化了代码。TCP连接复用: 这是性能上的一大优势。

Session

对象会尽可能地复用底层的TCP连接。这意味着在发送多个请求到同一个主机时,不需要每次都重新建立连接,从而减少了网络延迟和资源消耗。尤其是在高并发或对延迟敏感的应用中,这一点至关重要。

让我们通过一个例子来看看

Session

的实际应用:

import requests# 创建一个Session对象s = requests.Session()# 为Session设置默认的User-Agent头部s.headers.update({'User-Agent': 'MyPersistentPythonClient/1.0'})# 1. 模拟登录,获取cookies# 假设这是一个登录接口,成功后会返回认证cookielogin_url = 'https://httpbin.org/cookies/set/sessioncookie/12345'login_response = s.get(login_url)print(f"登录响应状态码: {login_response.status_code}")print(f"Session中的Cookies (登录后): {s.cookies.get('sessioncookie')}")# 2. 访问一个需要认证的页面# 这个请求会自动带上Session中存储的cookieprotected_url = 'https://httpbin.org/cookies'protected_response = s.get(protected_url)print(f"访问受保护页面响应状态码: {protected_response.status_code}")print(f"受保护页面收到的Cookies: {protected_response.json()['cookies']}")# 3. 发送一个POST请求,它也会使用Session的默认头部post_data = {'item': 'new_product'}post_response = s.post('https://httpbin.org/post', data=post_data)print(f"POST请求响应状态码: {post_response.status_code}")print(f"POST请求使用的User-Agent: {post_response.json()['headers']['User-Agent']}")# 清理Session,关闭连接(可选,通常在程序结束时自动进行)s.close()

在这个例子中,

s

这个

Session

对象就像一个“记忆体”,它记住了登录时获取的

sessioncookie

,并在后续访问受保护页面时自动带上。同时,我们只设置了一次

User-Agent

,它就被所有通过

s

发出的请求所共享。更重要的是,在后台,

requests

会尝试复用与

httpbin.org

之间的TCP连接,从而提升了效率。

总而言之,当你需要进行一系列相互关联的HTTP请求,或者对性能有较高要求时,

requests.Session

是你的不二之选。它能让你的代码更简洁、更高效,并且更好地模拟真实用户的浏览行为。

以上就是如何使用Python发送HTTP请求(requests库)?的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1369712.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
如何反转一个字符串?
上一篇 2025年12月14日 09:53:56
Python中的*args和**kwargs有什么作用和区别?
下一篇 2025年12月14日 09:54:14

相关推荐

  • composer require-dev和require有什么不同_Composer Require与Require-Dev区别解析

    require用于声明项目运行必需的依赖,如框架、数据库组件和第三方SDK,这些包会随项目部署到生产环境;2. require-dev用于声明仅在开发和测试阶段需要的工具,如PHPUnit、PHPStan、Faker等,不会默认部署到生产环境;3. 安装时composer install根据环境决定…

    2026年5月10日
    1000
  • 修复Django电商项目中AJAX过滤产品列表图片不显示问题

    在Django电商项目中,当使用AJAX动态加载过滤后的产品列表时,常遇到图片无法正常显示的问题。这通常是由于前端模板中图片加载方式(如data-setbg属性结合JavaScript库)与AJAX动态内容更新机制不兼容所致。解决方案是直接在AJAX返回的HTML中使用标准的标签来渲染图片,确保浏览…

    2026年5月10日
    000
  • 开源免费PHP工具 PHP开发效率提升利器

    推荐开源免费PHP开发工具以提升效率:VS Code、Sublime Text轻量高效,PhpStorm专业强大;调试用Xdebug、Kint、Ray;依赖管理选Composer;代码质量工具包括PHPStan、Psalm、PHP_CodeSniffer;数据库管理可用%ignore_a_1%MyA…

    2026年5月10日
    000
  • Matplotlib 地图中多类型图例的创建与优化

    Matplotlib 地图中多类型图例的创建与优化Matplotlib 地图中多类型图例的创建与优化Matplotlib 地图中多类型图例的创建与优化Matplotlib 地图中多类型图例的创建与优化

    本教程旨在解决matplotlib地图可视化中,如何在一个图例中同时展示颜色块(如区域分类)和自定义标记(如特定兴趣点)的问题。文章详细介绍了当传统`patch`对象无法正确显示标记时,如何利用`matplotlib.lines.line2d`创建标记图例句柄,并将其与颜色块图例句柄合并,从而生成一…

    2026年5月10日 用户投稿
    300
  • Golang JSON序列化:控制敏感字段暴露的最佳实践

    本教程探讨golang中如何高效控制结构体字段在json序列化时的可见性。当需要将包含敏感信息的结构体数组转换为json响应时,通过利用`encoding/json`包提供的结构体标签,特别是`json:”-“`,可以轻松实现对特定字段的忽略,从而避免敏感数据泄露,确保api…

    2026年5月10日
    000
  • 利用海象运算符简化条件赋值:Python教程与最佳实践

    本文旨在探讨Python中海象运算符(:=)在条件赋值场景下的应用。通过对比传统if/else语句与海象运算符,以及条件表达式,分析海象运算符在简化代码、提高可读性方面的优势与局限性。并通过具体示例,展示如何在列表推导式等场景下合理使用海象运算符,同时强调其潜在的复杂性及替代方案,帮助开发者更好地掌…

    2026年5月10日
    100
  • Debian syslog性能优化技巧有哪些

    提升Debian系统syslog (通常基于rsyslog)性能,关键在于精简配置和高效处理日志。以下策略能有效优化日志管理,提升系统整体性能: 精简配置,高效加载: 在rsyslog配置文件中,仅加载必要的输入、输出和解析模块。 使用全局指令设置日志级别和格式,避免不必要的处理。 自定义模板: 创…

    2026年5月10日
    000
  • 怎么在PHP代码中实现图片上传功能_PHP图片上传功能实现与安全处理教程

    首先创建含enctype的HTML表单,再用PHP接收文件,检查目录、移动临时文件,验证类型与大小,生成唯一文件名,并调整php.ini限制以确保上传成功。 如果您尝试在PHP项目中添加图片上传功能,但服务器无法正确接收或保存文件,则可能是由于表单配置、文件处理逻辑或安全限制的问题。以下是实现该功能…

    2026年5月10日
    300
  • 比特币新手教程 比特币交易平台有哪些

    比特币是一种去中心化的数字货币,基于区块链技术实现点对点交易,具有匿名性、有限发行和不可篡改等特点;新手可通过交易所购买,P2P交易获得比特币,常用平台包括Binance、OKX和Huobi;交易流程包括注册账户、实名认证、绑定支付方式、充值法币并下单购买,可选择市价单或限价单;比特币存储方式有交易…

    2026年5月10日
    000
  • c++中的SFINAE技术是什么_c++模板编程中的SFINAE原理与应用

    SFINAE 是“替换失败不是错误”的原则,指模板实例化时若参数替换导致错误,只要存在其他合法候选,编译器不报错而是继续重载决议。它用于条件启用模板、类型检测等场景,如通过 decltype 或 enable_if 控制函数重载,实现类型特征判断。尽管 C++20 引入 Concepts 简化了部分…

    2026年5月10日
    000
  • HTML如何隐藏滚动条或去除滚动条

    滚动条可以存在也可以不存在,本文主要介绍了html 隐藏滚动条和去除滚动条的方法的相关资料,大家一起来学习一下html隐藏滚动条或去除滚动条的方法吧。 1. html 标签加属性 XML/HTML Code复制内容到剪贴板 2.body中加入以下代码 立即学习“前端免费学习笔记(深入)”; html…

    用户投稿 2026年5月10日
    100
  • Golang gRPC流式请求异常处理

    在Golang的gRPC流式通信中,必须通过context.Context处理异常。应监听上下文取消或超时,及时释放资源,设置合理超时,避免连接长时间挂起,并在goroutine中通过context控制生命周期。 在使用 Golang 和 gRPC 实现流式通信时,异常处理是确保服务健壮性的关键部分…

    2026年5月10日
    000
  • Go语言mgo查询构建:深入理解bson.M与日期范围查询的正确实践

    本文旨在解决go语言mgo库中构建复杂查询时,特别是涉及嵌套`bson.m`和日期范围筛选的常见错误。我们将深入剖析`bson.m`的类型特性,解释为何直接索引`interface{}`会导致“invalid operation”错误,并提供一种推荐的、结构清晰的代码重构方案,以确保查询条件能够正确…

    2026年5月10日
    100
  • vscode上怎么运行html_vscode上运行html步骤【指南】

    首先保存文件为.html格式,再通过浏览器或Live Server插件打开预览;推荐安装Live Server实现本地服务器运行与实时刷新,提升开发体验。 在 VS Code 上运行 HTML 文件并不需要复杂的配置,只需几个简单步骤即可预览页面效果。VS Code 本身是一个代码编辑器,不直接运行…

    2026年5月10日
    100
  • RichHandler与Rich Progress集成:解决显示冲突的教程

    在使用rich库的`richhandler`进行日志输出并同时使用`progress`组件时,可能会遇到显示错乱或溢出问题。这通常是由于为`richhandler`和`progress`分别创建了独立的`console`实例导致的。解决方案是确保日志处理器和进度条组件共享同一个`console`实例…

    2026年5月10日
    000
  • 修复点击时按钮抖动:CSS垂直对齐实践

    本文探讨了在Web开发中,交互式按钮(如播放/暂停按钮)在点击时发生意外垂直位移的问题。通过分析CSS样式变化对元素布局的影响,我们发现这是由于按钮不同状态下的边框样式和内边距改变,以及默认的垂直对齐行为共同作用所致。核心解决方案是利用CSS的vertical-align属性,将其设置为middle…

    2026年5月10日
    100
  • 理解编程指令:当结果正确,但实现方式不符要求时

    本文探讨了在编程实践中,即使程序输出了正确的结果,但若其实现方式未能严格遵循既定指令,仍可能被视为“不正确”的问题。我们将通过具体示例,对比直接求和与累加求和两种实现策略,强调理解和遵守编程规范的重要性,以确保代码的健壮性、可维护性及符合项目要求。 在软件开发过程中,我们经常会遇到这样的情况:编写的…

    2026年5月10日
    000
  • Golang goroutine与channel调试技巧

    使用go run -race检测数据竞争,结合runtime.NumGoroutine监控协程数量,通过pprof分析阻塞调用栈,利用select超时避免永久阻塞,有效排查goroutine泄漏、死锁和数据竞争问题。 Go语言的goroutine和channel是并发编程的核心,但它们也带来了调试上…

    2026年5月10日
    000
  • 页面中文本域的值怎么设置

    标签定义多行的文本输入控件。 文本区中可容纳无限数量的文本,其中的文本的默认字体是等宽字体(通常是 Courier)。 可以通过 cols 和 rows 属性来规定 textarea 的尺寸,不过更好的办法是使用 CSS 的 height 和 width 属性。 注释:在文本输入区内的文本行间,用 …

    2026年5月10日
    000
  • 使用 Jupyter Notebook 进行探索性数据分析

    Jupyter Notebook通过单元格实现代码与Markdown结合,支持数据导入(pandas)、清洗(fillna)、探索(matplotlib/seaborn可视化)、统计分析(describe/corr)和特征工程,便于记录与分享分析过程。 Jupyter Notebook 是进行探索性…

    2026年5月10日
    000

发表回复

登录后才能评论
关注微信