0

0

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

夜晨

夜晨

发布时间:2025-09-03 14:34:02

|

883人浏览过

|

来源于php中文网

原创

答案:使用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/json
try:
    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

# 尝试访问一个不存在的页面,预期会得到404
try:
    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

LongShot
LongShot

LongShot 是一款 AI 写作助手,可帮助您生成针对搜索引擎优化的内容博客。

下载

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 HTTPBasicAuth
    response = 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
对象后,它会为你维护以下几个关键特性:

  1. 持久化Cookies:
    Session
    对象会自动在请求之间存储和发送cookies。这意味着如果你在登录请求中收到了认证cookie,后续所有通过该
    Session
    发送的请求都会自动携带这个cookie,无需手动管理。
  2. 默认参数: 你可以为
    Session
    对象设置默认的
    headers
    params
    auth
    等。这些设置会自动应用到所有通过该
    Session
    发送的请求上,极大地简化了代码。
  3. TCP连接复用: 这是性能上的一大优势。
    Session
    对象会尽可能地复用底层的TCP连接。这意味着在发送多个请求到同一个主机时,不需要每次都重新建立连接,从而减少了网络延迟和资源消耗。尤其是在高并发或对延迟敏感的应用中,这一点至关重要。

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

Session
的实际应用:

import requests

# 创建一个Session对象
s = requests.Session()

# 为Session设置默认的User-Agent头部
s.headers.update({'User-Agent': 'MyPersistentPythonClient/1.0'})

# 1. 模拟登录,获取cookies
# 假设这是一个登录接口,成功后会返回认证cookie
login_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中存储的cookie
protected_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
是你的不二之选。它能让你的代码更简洁、更高效,并且更好地模拟真实用户的浏览行为。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

419

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

535

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

311

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

77

2025.09.10

sort排序函数用法
sort排序函数用法

sort排序函数的用法:1、对列表进行排序,默认情况下,sort函数按升序排序,因此最终输出的结果是按从小到大的顺序排列的;2、对元组进行排序,默认情况下,sort函数按元素的大小进行排序,因此最终输出的结果是按从小到大的顺序排列的;3、对字典进行排序,由于字典是无序的,因此排序后的结果仍然是原来的字典,使用一个lambda表达式作为key参数的值,用于指定排序的依据。

391

2023.09.04

cookie
cookie

Cookie 是一种在用户计算机上存储小型文本文件的技术,用于在用户与网站进行交互时收集和存储有关用户的信息。当用户访问一个网站时,网站会将一个包含特定信息的 Cookie 文件发送到用户的浏览器,浏览器会将该 Cookie 存储在用户的计算机上。之后,当用户再次访问该网站时,浏览器会向服务器发送 Cookie,服务器可以根据 Cookie 中的信息来识别用户、跟踪用户行为等。

6427

2023.06.30

document.cookie获取不到怎么解决
document.cookie获取不到怎么解决

document.cookie获取不到的解决办法:1、浏览器的隐私设置;2、Same-origin policy;3、HTTPOnly Cookie;4、JavaScript代码错误;5、Cookie不存在或过期等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

347

2023.11.23

阻止所有cookie什么意思
阻止所有cookie什么意思

阻止所有cookie意味着在浏览器中禁止接受和存储网站发送的cookie。阻止所有cookie可能会影响许多网站的使用体验,因为许多网站使用cookie来提供个性化服务、存储用户信息或跟踪用户行为。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

413

2024.02.23

java入门学习合集
java入门学习合集

本专题整合了java入门学习指南、初学者项目实战、入门到精通等等内容,阅读专题下面的文章了解更多详细学习方法。

1

2026.01.29

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.4万人学习

Django 教程
Django 教程

共28课时 | 3.7万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号