杰瑞科技汇

Python requests实例怎么用?

requests 是 Python 中最流行、最优雅的 HTTP 库,它极大地简化了发送 HTTP 请求和处理响应的过程。

Python requests实例怎么用?-图1
(图片来源网络,侵删)

第一步:安装 requests

在使用之前,您需要先安装它,打开您的终端或命令行工具,运行以下命令:

pip install requests

第二步:基础实例(GET 请求)

GET 请求用于从服务器获取数据,这是最常见的请求类型。

示例 1:简单的 GET 请求

我们将向 httpbin.org 这个测试网站发送一个 GET 请求,它会返回我们请求的详细信息。

import requests
# 目标 URL
url = "https://httpbin.org/get"
try:
    # 发送 GET 请求
    response = requests.get(url)
    # 检查请求是否成功 (状态码 200 表示成功)
    response.raise_for_status()  # 如果请求失败 (状态码不是 2xx),会抛出异常
    # 打印响应内容
    # response.text 是响应的文本内容
    print("状态码:", response.status_code)
    print("响应头:", response.headers)
    print("响应内容 (JSON格式):")
    # response.json() 会自动将 JSON 响应解析为 Python 字典
    print(response.json())
except requests.exceptions.RequestException as e:
    # 捕获所有与 requests 相关的异常
    print(f"请求发生错误: {e}")

输出解释: 你会看到返回的 JSON 数据,其中包含了你的请求信息,args (查询参数), headers (请求头), origin (你的 IP 地址) 等。

Python requests实例怎么用?-图2
(图片来源网络,侵删)

第三步:带参数的 GET 请求

当您需要向 URL 添加查询参数时(?key1=value1&key2=value2),有几种方法。

示例 2:使用 params 字典(推荐)

这是最清晰、最不容易出错的方法。

import requests
# 目标 URL
url = "https://httpbin.org/get"
# 定义查询参数
params = {
    'name': 'John Doe',
    'age': 30,
    'is_student': False
}
try:
    # 发送 GET 请求,params 参数会自动处理 URL 编码
    response = requests.get(url, params=params)
    response.raise_for_status()
    print("带参数的请求 URL:")
    # response.url 会显示 requests 库实际请求的完整 URL
    print(response.url)
    print("\n响应内容中的 args 部分:")
    # 我们可以看到参数被正确地添加到了请求中
    print(response.json()['args'])
except requests.exceptions.RequestException as e:
    print(f"请求发生错误: {e}")

第四步:POST 请求

POST 请求通常用于向服务器提交数据,例如提交表单、上传文件等。

示例 3:发送 JSON 数据

import requests
import json # 虽然requests会自动处理,但了解json模块是好的
# 目标 URL
url = "https://httpbin.org/post"
# 要发送的 JSON 数据 (Python 字典)
payload = {
    'username': 'test_user',
    'password': '123456',
    'email': 'test@example.com'
}
try:
    # 发送 POST 请求
    # json=payload 会自动将字典序列化为 JSON 字符串,
    # 并设置正确的请求头 'Content-Type: application/json'
    response = requests.post(url, json=payload)
    response.raise_for_status()
    print("状态码:", response.status_code)
    print("响应内容中的 form/data 部分:")
    # httpbin.org 会将接收到的数据放在 'json' 或 'form' 或 'data' 字段中
    # 因为我们发送的是 JSON,所以它在 'json' 字段里
    print(response.json()['json'])
except requests.exceptions.RequestException as e:
    print(f"请求发生错误: {e}")

示例 4:发送表单数据 (x-www-form-urlencoded)

import requests
# 目标 URL
url = "https://httpbin.org/post"
# 要发送的表单数据 (Python 字典)
form_data = {
    'search_query': 'python tutorial',
    'page': 1
}
try:
    # 发送 POST 请求
    # data=payload 会自动将数据编码为表单格式,
    # 并设置正确的请求头 'Content-Type: application/x-www-form-urlencoded'
    response = requests.post(url, data=form_data)
    response.raise_for_status()
    print("状态码:", response.status_code)
    print("响应内容中的 form 部分:")
    # 对于表单数据,httpbin.org 会将其放在 'form' 字段中
    print(response.json()['form'])
except requests.exceptions.RequestException as e:
    print(f"请求发生错误: {e}")

第五步:添加请求头

有时您需要自定义请求头,例如模拟浏览器访问、设置 User-Agent 或添加认证信息。

Python requests实例怎么用?-图3
(图片来源网络,侵删)

示例 5:自定义请求头

import requests
url = "https://httpbin.org/get"
# 自定义请求头
headers = {
    'User-Agent': 'MyCoolApp/1.0 (by MyEmail@example.com)',
    'Accept-Language': 'en-US,en;q=0.9',
    'X-Custom-Header': 'This is a custom value'
}
try:
    # 发送 GET 请求,并传入 headers
    response = requests.get(url, headers=headers)
    response.raise_for_status()
    print("响应头中的 User-Agent:")
    # httpbin.org 会将接收到的请求头返回给我们
    print(response.json()['headers']['User-Agent'])
    print("\n响应头中的 X-Custom-Header:")
    print(response.json()['headers']['X-Custom-Header'])
except requests.exceptions.RequestException as e:
    print(f"请求发生错误: {e}")

第六步:处理响应

requests 的响应对象 Response 提供了多种方式来访问内容:

  • response.status_code: HTTP 状态码 (如 200, 404, 500)。
  • response.headers: 响应头,是一个类字典对象。
  • response.text: 响应体的文本内容。
  • response.content: 响应体的字节内容 (适合处理图片、文件等)。
  • response.json(): 将响应体解析为 JSON 对象 (如果响应是有效的 JSON)。
  • response.raise_for_status(): 如果状态码表示错误 (4xx or 5xx),则抛出 HTTPError 异常。

第七步:高级实例

示例 6:处理超时和重试

网络请求可能会失败,设置超时可以防止程序无限等待。

import requests
url = "https://httpbin.org/delay/5" # 这个 URL 会延迟 5 秒才响应
try:
    # 设置超时时间为 3 秒
    # 如果服务器在 3 秒内没有响应,会抛出 requests.exceptions.Timeout 异常
    print("发送请求,超时设置为 3 秒...")
    response = requests.get(url, timeout=3)
    print("请求成功!")
except requests.exceptions.Timeout:
    print("请求超时!")
except requests.exceptions.RequestException as e:
    print(f"请求发生其他错误: {e}")

示例 7:处理会话 和 Cookies

Session 对象可以跨请求保持某些参数,Cookies,这对于需要登录的网站非常有用。

import requests
# 创建一个 Session 对象
session = requests.Session()
# 第一次请求:访问需要登录的页面 (这里用 httpbin.org/get 作为示例)
# 假设服务器在响应中设置了一个 Cookie
print("1. 发送初始请求...")
response1 = session.get("https://httpbin.org/get")
# 检查响应头中是否有 'set-cookie'
print("服务器是否设置了 Cookie?", 'set-cookie' in response1.headers)
# 第二次请求:使用同一个 Session 对象发送请求
# 这个请求会自动带上第一次请求时获取的 Cookie
print("\n2. 使用同一个 Session 发送第二次请求...")
response2 = session.get("https://httpbin.org/get")
# 检查第二次请求的请求头,可以看到 Cookie 已经被自动发送
print("第二次请求的 Cookie:", response2.request.headers.get('Cookie'))
# 关闭 Session
session.close()

示例 8:下载文件

下载文件时,使用 response.content 并以二进制模式写入文件是最高效的方式。

import requests
url = "https://httpbin.org/image/jpeg" # httpbin 提供的示例图片
file_path = "downloaded_image.jpg"
try:
    print(f"开始下载文件: {url}")
    response = requests.get(url, stream=True) # stream=True 启用流式下载
    response.raise_for_status()
    # 以二进制写入模式打开文件
    with open(file_path, 'wb') as f:
        # iter_content(chunk_size=8192) 可以分块写入,节省内存
        for chunk in response.iter_content(chunk_size=8192):
            if chunk: # 过滤掉保持连接的新块
                f.write(chunk)
    print(f"文件已成功保存到: {file_path}")
except requests.exceptions.RequestException as e:
    print(f"下载文件时发生错误: {e}")

第八步:最佳实践和异常处理

一个健壮的网络请求程序应该能够处理各种异常。

import requests
from requests.exceptions import RequestException, HTTPError, ConnectionError, Timeout
def robust_request(url, method='GET', **kwargs):
    """
    一个更健壮的请求函数,包含全面的异常处理。
    """
    try:
        print(f"正在发送 {method} 请求到 {url}...")
        response = requests.request(method, url, **kwargs)
        # 如果状态码表示错误,则抛出 HTTPError
        response.raise_for_status() 
        print("请求成功!")
        return response
    except HTTPError as http_err:
        print(f"HTTP 错误发生: {http_err}")
        # 可以根据状态码进行不同处理
        if response.status_code == 404:
            print("资源未找到!")
        elif response.status_code == 401:
            print("未授权,请登录!")
    except ConnectionError as conn_err:
        print(f"连接错误发生: {conn_err}")
        print("请检查您的网络连接或 URL 是否正确。")
    except Timeout as timeout_err:
        print(f"请求超时: {timeout_err}")
    except RequestException as req_err:
        # 捕获所有 requests 库可能抛出的其他异常
        print(f"请求发生未知错误: {req_err}")
    return None
# 使用示例
response = robust_request(
    "https://httpbin.org/get",
    params={'key': 'value'},
    timeout=5
)
if response:
    print("响应内容:", response.json())
功能 方法/代码示例
安装 pip install requests
GET 请求 requests.get(url)
带参数 GET requests.get(url, params={'key': 'value'})
POST JSON requests.post(url, json={'key': 'value'})
POST 表单 requests.post(url, data={'key': 'value'})
自定义请求头 requests.get(url, headers={'User-Agent': '...'})
处理超时 requests.get(url, timeout=10)
保持会话/Cookie s = requests.Session(); s.get(...); s.get(...)
下载文件 requests.get(url, stream=True); for chunk in response.iter_content(...)
检查状态码 response.status_coderesponse.raise_for_status()
解析 JSON response.json()

希望这份详细的实例能帮助您完全掌握 Python requests 库的使用!

分享:
扫描分享到社交APP
上一篇
下一篇