requests模块基础


Requests 是 Python 中最流行的 HTTP 客户端库,由 Kenneth Reitz 开发,以“人类友好”为设计理念,简化了发送 HTTP 请求、处理响应的流程。相比 Python 内置的 urllib 库,Requests 语法更简洁,自动处理编码、Cookie、会话等细节,是接口测试、爬虫、API 交互等场景的首选工具。

一、Requests 安装

Requests 是第三方库,需通过 pip 安装:

pip install requests

二、核心功能:发送 HTTP 请求

Requests 支持所有常见的 HTTP 方法(GET、POST、PUT、DELETE 等),核心是通过 requests.方法名() 发送请求,返回一个 Response 对象,包含服务器响应的所有信息。

1. GET 请求(获取资源)

GET 是最常用的 HTTP 方法,用于从服务器获取资源(如网页内容、API 数据)。

(1)基本 GET 请求
import requests

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

# 查看响应内容
print("状态码:", response.status_code)  # 200 表示成功(HTTP 状态码)
print("响应头:", response.headers["Content-Type"])  # 响应类型(如 application/json)
print("响应文本:", response.text)  # 响应内容(字符串形式)
print("响应字节:", response.content)  # 响应内容(字节形式,适合二进制数据如图片)
(2)带查询参数的 GET 请求

很多时候需要在 URL 后添加查询参数(如 ?key1=value1&key2=value2),Requests 可通过 params 参数自动拼接,无需手动处理 URL 编码。

import requests

url = "https://httpbin.org/get"

# 定义查询参数(字典形式)
params = {
    "name": "python",
    "version": "3.10",
    "features": ["simple", "powerful"]  # 列表会自动转为多个 key=value(features=simple&features=powerful)
}

# 发送带参数的 GET 请求(params 参数传入字典)
response = requests.get(url, params=params)

# 查看实际请求的 URL(自动拼接了参数)
print("请求的 URL:", response.url)  # 输出:https://httpbin.org/get?name=python&version=3.10&features=simple&features=powerful

# 解析 JSON 响应(若响应是 JSON 格式,可用 response.json() 直接转为字典)
data = response.json()
print("JSON 响应中的 args:", data["args"])  # 输出查询参数

2. POST 请求(提交数据)

POST 用于向服务器提交数据(如表单提交、API 新增资源),数据放在请求体中(而非 URL 上),更适合传输敏感信息或大量数据。

(1)发送表单数据(application/x-www-form-urlencoded

模拟 HTML 表单提交,数据格式为 key1=value1&key2=value2,用 data 参数传入字典。

import requests

url = "https://httpbin.org/post"

# 表单数据(字典形式)
form_data = {
    "username": "test_user",
    "password": "123456",
    "hobby": ["reading", "coding"]  # 列表会转为 hobby=reading&hobby=coding
}

# 发送 POST 请求(data 参数传入表单数据)
response = requests.post(url, data=form_data)

# 解析响应(httpbin.org/post 会返回请求的详细信息)
data = response.json()
print("服务器收到的表单数据:", data["form"])
(2)发送 JSON 数据(application/json

现代 API 常用 JSON 格式传输数据,Requests 可通过 json 参数直接传入字典,自动序列化并设置 Content-Type: application/json

import requests

url = "https://httpbin.org/post"

# JSON 数据(字典形式)
json_data = {
    "user": {
        "name": "张三",
        "age": 25
    },
    "tags": ["student", "python"]
}

# 发送 JSON 格式的 POST 请求(json 参数传入字典)
response = requests.post(url, json=json_data)

data = response.json()
print("服务器收到的 JSON 数据:", data["json"])

3. 其他 HTTP 方法(PUT、DELETE 等)

Requests 支持 PUT(更新资源)、DELETE(删除资源)、HEAD(仅获取响应头)等方法,用法与 GET/POST 类似。

import requests

url = "https://httpbin.org/put"
# PUT 请求(更新资源)
response = requests.put(url, data={"key": "new_value"})

url = "https://httpbin.org/delete"
# DELETE 请求(删除资源)
response = requests.delete(url)

# HEAD 请求(仅获取响应头,无响应体)
response = requests.head("https://httpbin.org/get")
print("HEAD 响应头:", response.headers)

三、响应处理(Response 对象)

发送请求后返回的 Response 对象包含服务器响应的所有信息,核心属性和方法如下:

属性/方法 说明
status_code HTTP 状态码(如 200 成功、404 未找到、500 服务器错误)。
headers 响应头(字典形式,键不区分大小写)。
text 响应内容(字符串,自动根据 Content-Type 解码,如 UTF-8)。
content 响应内容(字节流,适合二进制数据如图片、视频)。
json() 解析 JSON 格式的响应内容,返回字典或列表(若响应非 JSON 会抛异常)。
cookies 响应中的 Cookie(RequestsCookieJar 对象,类似字典)。
url 实际请求的 URL(可能因重定向变化)。
history 重定向历史(包含之前的 Response 对象列表)。

示例:处理 JSON 响应与状态码

response = requests.get("https://httpbin.org/get")

# 判断请求是否成功(200 表示成功)
if response.status_code == 200:
    print("请求成功")
    data = response.json()  # 解析 JSON 数据
    print("服务器 IP:", data["origin"])  # 输出客户端 IP
else:
    print(f"请求失败,状态码:{response.status_code}")

四、高级功能

1. 自定义请求头(Headers)

模拟浏览器或特定客户端发送请求(如设置 User-Agent 避免被服务器识别为爬虫),通过 headers 参数传入字典。

import requests

url = "https://httpbin.org/headers"

# 自定义请求头
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/114.0.0.0 Safari/537.36",  # 模拟 Chrome 浏览器
    "Accept-Language": "zh-CN,zh;q=0.9"  # 语言偏好
}

response = requests.get(url, headers=headers)
data = response.json()
print("服务器收到的请求头:", data["headers"])

2. 会话保持(Session

Session 对象用于在多个请求间保持会话状态(如 Cookie 共享),适合模拟登录后访问需要权限的页面(一次登录,后续请求自动携带 Cookie)。

import requests

# 创建会话对象(自动管理 Cookie)
session = requests.Session()

# 1. 第一步:登录(假设登录接口需要提交用户名密码)
login_url = "https://httpbin.org/post"
login_data = {"username": "admin", "password": "admin123"}
session.post(login_url, data=login_data)  # 登录请求,Cookie 会保存在 session 中

# 2. 第二步:访问需要登录的页面(自动携带登录后的 Cookie)
profile_url = "https://httpbin.org/cookies"
response = session.get(profile_url)
print("当前会话的 Cookie:", response.json()["cookies"])

# 关闭会话(可选)
session.close()

3. 超时设置(避免无限等待)

网络请求可能因服务器无响应而无限阻塞,通过 timeout 参数设置超时时间(秒),超过时间会抛出 Timeout 异常。

import requests
from requests.exceptions import Timeout

url = "https://httpbin.org/delay/5"  # 该接口会延迟 5 秒响应

try:
    # 设置超时时间为 3 秒(连接超时 + 读取超时)
    response = requests.get(url, timeout=3)
except Timeout:
    print("请求超时!服务器未在 3 秒内响应")

4. 代理设置(突破 IP 限制)

通过代理服务器发送请求(如爬虫时避免本地 IP 被封禁),proxies 参数传入代理字典(区分 HTTP 和 HTTPS)。

import requests

url = "https://httpbin.org/ip"  # 该接口返回客户端 IP

# 代理配置(格式:协议 -> 代理地址)
proxies = {
    "http": "http://127.0.0.1:8080",    # HTTP 代理
    "https": "https://127.0.0.1:8080"   # HTTPS 代理
}

# 使用代理发送请求
response = requests.get(url, proxies=proxies)
print("通过代理的 IP:", response.json()["origin"])

5. SSL 证书验证(默认开启)

Requests 默认验证 HTTPS 证书的有效性,若访问自签名证书的网站(如内部服务),可关闭验证(不推荐,有安全风险)。

# 关闭 SSL 验证(verify=False)
response = requests.get("https://自签名证书的网站", verify=False)

# 若需指定自定义 CA 证书,传入证书路径
# response = requests.get("https://网站", verify="/path/to/cert.pem")

6. 异常处理

网络请求可能出现各种错误(如连接失败、超时、HTTP 错误),需通过 try-except 捕获异常。

import requests
from requests.exceptions import (
    ConnectionError,  # 连接失败(如网络不通)
    Timeout,          # 超时
    HTTPError,        # HTTP 错误(如 404、500)
    RequestException  # 所有请求异常的基类
)

try:
    response = requests.get("https://httpbin.org/get", timeout=3)
    response.raise_for_status()  # 若状态码为 4xx/5xx,抛出 HTTPError 异常
except ConnectionError:
    print("连接失败,请检查网络")
except Timeout:
    print("请求超时")
except HTTPError as e:
    print(f"HTTP 错误:{e}")
except RequestException as e:
    print(f"请求异常:{e}")

五、Requests 优势总结

  1. 简洁易用:一行代码发送请求,自动处理 URL 编码、Cookie、响应解码等细节,无需像 urllib 那样手动处理。
  2. 功能全面:支持所有 HTTP 方法、文件上传、会话保持、代理、超时等高级功能。
  3. 人性化设计response.json() 直接解析 JSON,raise_for_status() 快速判断请求是否成功,异常类型清晰。
  4. 广泛兼容:支持 Python 3.7+,与主流框架(如 Flask、Django)和工具无缝集成。

总结

Requests 是 Python 处理 HTTP 请求的“瑞士军刀”,无论是简单的接口调用、复杂的会话管理,还是爬虫场景的代理与异常处理,都能轻松应对。其核心优势在于“让开发者专注于业务逻辑,而非 HTTP 协议细节”,是 Python 网络编程的必备库之一。

requests 模块是一个优秀的 Python HTTP 库,简化了发送 HTTP 请求的过程。它比 Python 标准库中的 urllib 更加简洁和易用。以下是使用 requests 模块的基础知识:

1.安装:首先确保你已经安装了 requests 模块。如果没有安装,可以使用 pip 进行安装:

pip install requests

2.发送 GET 请求

import requests

response = requests.get('https://api.github.com')
print(response.status_code)  # 打印响应状态码
print(response.text)  # 打印响应内容

3.发送 POST 请求

import requests

data = {'key': 'value'}
response = requests.post('https://httpbin.org/post', data=data)
print(response.json())  # 将响应内容解析为 JSON 格式

4.处理响应

- `response.status_code`:HTTP 状态码。
- `response.text`:响应内容,以字符串形式返回。
- `response.json()`:如果响应是 JSON 格式,可以使用此方法将其解析为 Python 字典。

5.处理异常requests 模块也提供了异常处理机制,比如 requests.exceptions.RequestException 可以捕获所有请求产生的异常,如网络问题、超时等。

6.自定义请求头和参数

import requests

headers = {'User-Agent': 'Mozilla/5.0'}
params = {'key1': 'value1', 'key2': 'value2'}
response = requests.get('https://httpbin.org/get', headers=headers, params=params)
print(response.json())

7.会话对象: 如果需要保持某些参数(如 Cookie、身份认证等)在多个请求之间持续有效,可以使用 Session 对象:

import requests

session = requests.Session()
session.auth = ('user', 'pass')
session.headers.update({'x-test': 'true'})

response = session.get('https://httpbin.org/headers')
print(response.json())

8.其他 HTTP 方法requests 模块支持多种 HTTP 方法,如 PUTDELETEPATCH 等,使用方式类似于 GETPOST