当前位置:首页>python>Python(requests会话保持:Cookie&Token持久化接口爬虫)

Python(requests会话保持:Cookie&Token持久化接口爬虫)

  • 2026-10-11 06:56:50
Python(requests会话保持:Cookie&Token持久化接口爬虫)
多数业务接口需要登录态,单次requests.get无法维持cookie,每次请求重新握手、丢失登录凭证,导致401未授权。本篇讲解Session会话对象持久保存Cookie、Token,实现模拟登录后连续批量拉取业务接口数据。
场景:对内业务后台接口,先调用login接口拿到cookie;之后循环请求分页列表接口、详情接口。不用Session的情况下,每发一次请求登录态丢失,反复返回未登录。使用Session对象,登录响应返回的Set‑Cookie自动保存,后续全部请求自动带上。

代码示例

import requestsimport timesession = requests.Session()BASE_URL = "http://127.0.0.1:8080/api"# 修复:使用标准的 ASCII 连字符(-)session.headers.update({    "User-Agent": "Mozilla/5.0",  # 修正为标准的 -    "Content-Type": "application/json"  # 修正为标准的 -})def login(username, password):    payload = {"username": username, "password": password}    resp = session.post(f"{BASE_URL}/login", json=payload, timeout=10)    resp.raise_for_status()    # 如果接口返回token,手动写入session头    token = resp.json().get("token")    if token:        session.headers.update({"Authorization": f"Bearer {token}"})    return respdef get_page_list(page_num):    params = {"page": page_num, "size": 20}    resp = session.get(f"{BASE_URL}/order/list", params=params, timeout=10)    resp.raise_for_status()    return resp.json()if __name__ == "__main__":    try:        login("admin", "123456")        for p in range(1, 4):            data = get_page_list(p)            print(f"page{p} data:{data}")            time.sleep(0.3)    except requests.exceptions.RequestException as e:        print("接口异常", e)

核心总结

  1. 会话与状态管理

    • Cookie 自动接管
      :Session 对象会自动处理服务器返回的 Set-Cookie,并在后续请求中自动携带,实现跨请求的会话状态维持。
    • JWT 手动注入
      :对于 Token 认证模式,需从登录响应中提取 Token,并手动将其写入 session.headers(如 Authorization: Bearer <token>),以便后续请求统一鉴权。
  2. 性能与资源复用

    • 连接池复用
      :务必在循环外部创建并复用 Session 实例。底层 TCP 长连接(Keep-Alive)的复用可避免重复的 DNS 查询和 SSL 握手,显著降低网络开销。
    • 全局配置统一
      :可将通用的 User-Agent、Content-Type 等请求头通过 session.headers.update() 进行全局设置,避免在每次请求中重复传参。
  3. 健壮性与安全控制

    • 强制超时机制
      :所有网络请求必须显式设置 timeout 参数(建议采用元组形式 timeout=(连接超时, 读取超时)),防止因网络故障导致程序无限期阻塞。
    • 异常处理闭环
      :使用 raise_for_status() 主动检查 HTTP 状态码,配合 try-except 捕获 RequestException,确保业务逻辑在接口异常时能优雅降级或报错。
    • 请求频率控制
      :在高频爬取或批量调用场景下,必须加入合理的 sleep 间隔,防止压垮目标服务或触发反爬风控。

最新文章

随机文章