侧边栏壁纸
博主头像
路小飞博主等级

行动起来,活在当下

  • 累计撰写 72 篇文章
  • 累计创建 12 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

python-requests库

路小飞
2025-09-28 / 0 评论 / 0 点赞 / 11 阅读 / 12608 字

在 Python 生态中,处理 HTTP 请求的库有很多,但 Requests 凭借其简洁的 API、完善的功能和极佳的易用性,成为了开发者的首选工具。无论是调用第三方 API、爬取网页数据,还是测试后端接口,Requests 都能让复杂的 HTTP 操作变得像“一行代码”一样简单。本文将从基础到进阶,全面讲解 Requests 库的核心用法,帮你快速掌握 HTTP 请求的全流程。

一、Requests 库是什么

Requests 是一个基于 Python 编写的 HTTP 客户端库,遵循 Apache2 开源协议,其核心设计理念是“让 HTTP 服务人类”。在 Requests 出现之前,Python 标准库中的 urllib2 不仅 API 繁琐,还需要手动处理编码、Cookie、会话等细节,而 Requests 则将这些复杂操作封装成直观的方法,极大降低了 HTTP 请求的门槛。

1 为什么选择 Requests?

  • 简洁易用:一行代码即可发送 GET/POST 请求,无需手动构造请求头或解析响应;
  • 功能全面:支持 GET、POST、PUT、DELETE 等所有 HTTP 方法,以及 Cookie、会话、代理、SSL 验证等高级特性;
  • 兼容性好:支持 Python 3.7+,且与主流框架(Django、Flask)和工具(Pandas、BeautifulSoup)无缝衔接;

官方文档(docs.python-requests.org)详细且带示例,问题排查更高效。

2 Request 库安装

Requests 不是 Python 标准库,需要手动安装,推荐使用 pip 工具(Python 包管理神器),步骤如下:

打开终端/命令提示符,执行以下命令(确保已安装 Python 和 pip):

# 配置国内源
pip3 config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

# Python 3 环境(推荐)
pip3 install requests

安装完成后,在 Python 交互环境中测试是否成功:

import requests
print(requests.__version__)  # 输出版本号,如 2.31.0 则表示安装成功

二、基础篇:发送 HTTP 请求的核心方法

HTTP 协议定义了多种请求方法,其中最常用的是 GET(获取资源)POST(提交资源),Requests 为每种方法都提供了对应的函数,用法高度统一。

1. 发送 GET 请求:获取数据的“万能钥匙”

GET 请求用于从服务器获取资源(如网页内容、API 数据),参数通常通过 URL 传递(如 https://api.example.com/data?id=1)。

1.1 最简化的 GET 请求

发送一个 GET 请求,只需调用 requests.get() 并传入目标 URL:

import requests

# 发送 GET 请求到目标 URL
response = requests.get("https://httpbin.org/get")  # httpbin.org 是测试 HTTP 请求的专用网站

# 打印响应状态码(200 表示请求成功)
print("状态码:", response.status_code)  # 输出:状态码:200

# 打印响应内容(字符串格式)
print("响应内容:", response.text)
1.2 带参数的 GET 请求

如果需要传递参数(如分页、筛选条件),无需手动拼接 URL,只需通过 params 参数传入字典即可:

import requests

# 定义请求参数(字典格式)
params = {
    "name": "Python",
    "version": "3.11",
    "page": 1
}

# 发送带参数的 GET 请求(参数会自动拼接到 URL 后:?name=Python&version=3.11&page=1)
response = requests.get("https://httpbin.org/get", params=params)

# 查看最终请求的 URL(验证参数是否正确拼接)
print("最终请求 URL:", response.url)  
# 输出:最终请求 URL:https://httpbin.org/get?name=Python&version=3.11&page=1

# 解析响应(httpbin.org 会返回 JSON 格式的请求信息)
print("响应 JSON 数据:", response.json())  # response.json() 自动解析 JSON 内容

2. 发送 POST 请求:提交数据的“常用方式”

POST 请求用于向服务器提交资源(如表单数据、用户登录信息),参数通常放在请求体中(而非 URL),安全性比 GET 更高。

2.1 提交表单数据(form-data)

最常见的 POST 场景是提交表单,通过 data 参数传入字典即可:

import requests

# 定义表单数据(模拟用户登录)
form_data = {
    "username": "test_user",
    "password": "test_pass123"
}

# 发送 POST 请求,表单数据通过 data 参数传递
response = requests.post("https://httpbin.org/post", data=form_data)

# 解析响应(查看服务器接收的表单数据)
response_json = response.json()
print("服务器接收的表单数据:", response_json["form"])
# 输出:服务器接收的表单数据:{'username': 'test_user', 'password': 'test_pass123'}
2.2 提交 JSON 数据(API 常用)

现在很多后端 API 要求接收 JSON 格式的数据(而非表单),此时需通过 json 参数传递数据(Requests 会自动设置 Content-Type: application/json 请求头):

import requests

# 定义 JSON 数据(模拟创建用户的 API 请求)
json_data = {
    "name": "张三",
    "age": 25,
    "email": "zhangsan@example.com"
}

# 发送 POST 请求,JSON 数据通过 json 参数传递
response = requests.post("https://httpbin.org/post", json=json_data)

# 解析响应(查看服务器接收的 JSON 数据)
response_json = response.json()
print("服务器接收的 JSON 数据:", response_json["json"])
# 输出:服务器接收的 JSON 数据:{'name': '张三', 'age': 25, 'email': 'zhangsan@example.com'}
2.3 实际案例
# coding:utf-8
import requests

# 企业微信机器人Webhook地址
WEBHOOK_URL = (
    "https://api.example.com/send?access_token="
    "dsdasdsadasfdsafsaf9df8a9fsafsafdsfadsfsadsaf"
)


def send_text_message(message):
    """
    发送文本消息到企业微信机器人

    :param message: 要发送的文本内容
    :return: 接口响应内容
    """
    # 构造请求头
    headers = {
        'Content-Type': 'application/json',
    }

    # 构造请求数据
    data = {
        "msgtype": "text",
        "text": {
            "content": message
        }
    }

    # 发送POST请求
    response = requests.post(
        WEBHOOK_URL,
        headers=headers,
        json = data
        # data=json.dumps(data)  # 第二种处理方式
    )
    
    print(response.text)
    return response.text


if __name__ == "__main__":
    # 测试消息内容
    test_message = "Hello, this is a test message from Python script."
    send_text_message(test_message)

3. 其他 HTTP 方法:PUT、DELETE、HEAD

除了 GET 和 POST,Requests 还支持 PUT(更新资源)、DELETE(删除资源)、HEAD(仅获取响应头)等 HTTP 方法,用法与 GET/POST 一致:

import requests

url = "https://httpbin.org"

# 1. PUT:更新资源(示例:更新 ID 为 1 的数据)
put_data = {"name": "李四", "age": 28}
response_put = requests.put(f"{url}/put/1", json=put_data)

# 2. DELETE:删除资源(示例:删除 ID 为 1 的数据)
response_delete = requests.delete(f"{url}/delete/1")

# 3. HEAD:仅获取响应头(不返回响应体,适合检查资源是否存在)
response_head = requests.head(f"{url}/get")
print("HEAD 请求的响应头:", response_head.headers)  # 输出所有响应头信息

三、进阶篇:处理响应与请求细节

发送请求后,服务器会返回一个 Response 对象(即前面代码中的 response),它包含了响应状态码、响应头、响应体等所有信息。掌握 Response 对象的用法,是处理 HTTP 请求的关键。

1. 解析响应的核心属性

Response 对象提供了多个属性,用于获取响应的不同部分:

属性/方法作用说明
response.status_code获取 HTTP 状态码(200=成功,404=资源不存在,500=服务器错误)
response.text以字符串形式返回响应体(适合 HTML、文本数据)
response.content以字节流形式返回响应体(适合图片、视频等二进制数据)
response.json()自动解析 JSON 格式的响应体(返回字典,若格式错误会抛异常)
response.headers获取响应头(字典格式,如 Content-TypeSet-Cookie
response.cookies获取响应中的 Cookie(字典格式,可用于维持登录状态)
response.url获取最终请求的 URL(若发生重定向,会返回重定向后的 URL)

示例:下载一张图片(二进制响应处理)

import requests

# 图片 URL(示例:一张 Python  Logo 图片)
img_url = "https://www.python.org/static/community_logos/python-logo-master-v3-TM.png"

# 发送 GET 请求获取图片(二进制数据)
response = requests.get(img_url)

if response.status_code == 200:
    # 以字节流写入文件(保存图片)
    with open("python_logo.png", "wb") as f:
        f.write(response.content)  # 使用 content 属性获取二进制数据
    print("图片下载成功!")
else:
    print(f"图片下载失败,状态码:{response.status_code}")

2. 设置请求头:模拟浏览器,避免被拦截

很多网站会通过 User-Agent 请求头识别访问来源,若发现是“爬虫”(默认 Requests 的 User-Agentpython-requests/版本号),会拒绝提供数据。此时需要手动设置请求头,模拟浏览器访问。

示例:设置 User-Agent 爬取网页

import requests

# 目标 URL(示例:Python 官方网站)
url = "https://www.python.org/"

# 定义请求头(模拟 Chrome 浏览器)
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36",
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
    "Accept-Language": "zh-CN,zh;q=0.9"
}

# 发送带请求头的 GET 请求
response = requests.get(url, headers=headers)

if response.status_code == 200:
    # 保存网页内容到文件
    with open("python_official.html", "w", encoding="utf-8") as f:
        f.write(response.text)
    print("网页爬取成功!")

提示:User-Agent 可从浏览器中复制:打开浏览器 → F12 打开开发者工具 → 网络 → 刷新页面 → 选择任意请求 → 查看“请求头”中的 User-Agent

在访问需要登录的网站时(如电商平台、后台系统),服务器会通过 Cookie 识别用户身份。Requests 提供了两种处理 Cookie 的方式:

方式 1:手动处理 Cookie(简单场景)

通过 cookies 参数传递 Cookie,或通过 response.cookies 获取服务器返回的 Cookie:

import requests

# 1. 登录接口(示例:模拟登录,实际需替换为真实接口)
login_url = "https://httpbin.org/cookies/set"
# 手动设置 Cookie(模拟登录后的身份凭证)
cookies = {"user_id": "12345", "token": "abcdef123456"}

# 2. 访问需要登录的页面(携带 Cookie)
profile_url = "https://httpbin.org/cookies"
response = requests.get(profile_url, cookies=cookies)

# 查看服务器接收的 Cookie
print("服务器接收的 Cookie:", response.json())
# 输出:服务器接收的 Cookie:{'cookies': {'user_id': '12345', 'token': 'abcdef123456'}}
方式 2:使用 Session 维持会话(复杂场景)

如果需要多次请求共享 Cookie(如登录后访问多个页面),使用 requests.Session() 会更高效——Session 会自动保存服务器返回的 Cookie,并在后续请求中自动携带:

import requests

# 1. 创建 Session 对象(自动管理 Cookie)
s = requests.Session()

# 2. 第一步:登录(Session 会保存登录后的 Cookie)
login_data = {"username": "test", "password": "test123"}
s.post("https://httpbin.org/post", data=login_data)

# 3. 第二步:访问需要登录的页面(无需手动传 Cookie,Session 自动携带)
response1 = s.get("https://httpbin.org/cookies")
response2 = s.get("https://httpbin.org/headers")

print("页面 1 响应:", response1.json())
print("页面 2 响应:", response2.json())

# 关闭 Session(可选,避免资源占用)
s.close()

4. 处理超时与异常:让请求更稳定

网络请求可能因“服务器无响应”“网络波动”等问题卡住,此时需要设置超时时间;同时,HTTP 请求可能出现 404、500 等错误,需要捕获异常避免程序崩溃。

示例:设置超时与异常捕获

import requests
from requests.exceptions import HTTPError, ConnectionError, Timeout

def safe_get(url, timeout=10):
    try:
        # 设置超时时间(10 秒内无响应则抛出 Timeout 异常)
        response = requests.get(url, timeout=timeout)
        
        # 检查 HTTP 状态码(非 200 则抛出 HTTPError 异常)
        response.raise_for_status()
        
        return response.text
    except HTTPError as e:
        return f"HTTP 错误:{e}(状态码:{response.status_code})"
    except ConnectionError as e:
        return f"连接错误:无法访问服务器 → {e}"
    except Timeout as e:
        return f"超时错误:请求超过 {timeout} 秒未响应 → {e}"
    except Exception as e:
        return f"其他错误:{e}"

# 测试正常请求
print(safe_get("https://httpbin.org/get"))

# 测试超时请求(故意设置一个不存在的域名)
print(safe_get("https://example.invalid", timeout=5))

四、高级篇:代理、SSL 验证与文件上传

Requests 还支持代理IP、SSL证书验证、文件上传等高级功能,满足复杂场景的需求。

1. 使用代理 IP:突破访问限制

在爬取数据或测试多地区访问时,可能需要使用代理 IP 隐藏真实地址。Requests 通过 proxies 参数设置代理:

import requests

# 定义代理(HTTP 代理和 HTTPS 代理需分别设置)
proxies = {
    "http": "http://127.0.0.1:8888",  # HTTP 代理地址
    "https": "https://127.0.0.1:8888"  # HTTPS 代理地址
}

# 发送带代理的请求
response = requests.get("https://httpbin.org/ip", proxies=proxies)

# 查看代理后的 IP(验证代理是否生效)
print("代理后的 IP 信息:", response.json())

提示:实际使用时,需替换为可用的代理 IP(可从代理服务商获取),本地测试可使用 Fiddler、Charles 等工具的代理地址(如 127.0.0.1:8888)。

2. 处理 SSL 证书验证

访问 HTTPS 网站时,Requests 会自动验证 SSL 证书(确保网站身份合法)。若访问“自签名证书”的网站(如本地测试环境),会抛出 SSLError 异常,此时可通过 verify 参数关闭验证(生产环境不推荐)。

示例:关闭 SSL 证书验证

import requests

# 访问自签名证书的网站(如本地测试服务)
url = "https://127.0.0.1:8000"

# verify=False 关闭 SSL 证书验证(仅测试环境使用)
response = requests.get(url, verify=False)

print("响应状态码:", response.status_code)

警告:verify=False 会跳过 SSL 验证,可能导致“中间人攻击”,生产环境需传入合法的证书文件(如 verify="cert.pem")。

0

评论区