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

夜晨
发布: 2025-09-03 14:34:02
原创
855人浏览过
答案:使用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
登录后复制

ChatsNow
ChatsNow

ChatsNow是一款免费的AI写作类浏览器插件,提供智能聊天机器人、智能翻译、智能搜索等工具

ChatsNow 253
查看详情 ChatsNow

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
登录后复制
是你的不二之选。它能让你的代码更简洁、更高效,并且更好地模拟真实用户的浏览行为。

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

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

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