author: 专注Python实战,分享爬虫与数据分析干货
title: Python爬虫实战⑨|Cookie与登录态,搞定需要登录的页面
update: 2026-04-26
tags: Python,爬虫,Cookie,Session,登录态,模拟登录,浏览器Cookie

作者:专注Python实战,分享爬虫与数据分析干货
更新时间:2026年4月
适合人群:已掌握爬虫基础、遇到需要登录才能抓取内容的开发者


前言:有些数据,不登录就看不到

很多网站的内容需要登录后才能访问——

  • 知乎的回答详情、关注列表
  • 豆瓣的豆油、收藏夹
  • GitHub的私有仓库、代码提交记录
  • 电商网站的订单数据

Cookie = 登录的身份证。 拿到Cookie,就等于拿到了登录凭证,可以以登录身份访问数据。


一、Cookie是什么?

1.1 Cookie的工作原理

第1步:你在浏览器输入用户名密码,点击登录
第2步:服务器验证通过,生成一个Cookie(包含你的身份信息)
第3步:服务器返回Cookie,通过Set-Cookie头写入浏览器
第4步:浏览器把这个Cookie保存下来
第5步:之后每次访问该网站,浏览器自动带上这个Cookie
第6步:服务器看到Cookie,就知道"哦,是张三",返回个性化内容

1.2 Cookie的组成

Cookie: session_id=abc123; user_id=456; level=vip; _ga=GA1.2.789
  • session_id:会话ID(最重要,服务器用它识别你是谁)
  • user_id:用户ID
  • level:会员等级
  • _ga:Google Analytics的追踪Cookie

二、requests获取Cookie

2.1 登录后提取Cookie

import requests

session = requests.Session()

# 登录
login_data = {
    "username": "your_username",
    "password": "your_password",
}
response = session.post("https://example.com/api/login", json=login_data, timeout=10)

# 查看Cookie
print("登录后Cookie:")
for name, value in session.cookies.items():
    print(f"  {name}: {value[:30]}...")

# 访问需要登录的页面(Cookie自动携带)
profile = session.get("https://example.com/api/profile")
print("个人资料:", profile.json())

2.2 手动保存和加载Cookie

import requests
import json

session = requests.Session()

# 第1步:正常登录(正常流程,这里假设已有登录逻辑)
# session.post("https://example.com/login", data=login_data)

# 假设Cookie已经拿到了
session.cookies.update({
    "session_id": "abc123xyz789",
    "user_id": "12345",
    "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
})

# 保存Cookie到文件
def save_cookies(session, filepath="cookies.json"):
    cookies_dict = {}
    for name, value in session.cookies.items():
        cookies_dict[name] = value
    with open(filepath, "w", encoding="utf-8") as f:
        json.dump(cookies_dict, f, ensure_ascii=False)
    print(f"Cookie已保存到 {filepath}")

# 加载Cookie
def load_cookies(filepath="cookies.json"):
    session = requests.Session()
    if os.path.exists(filepath):
        with open(filepath, "r", encoding="utf-8") as f:
            cookies_dict = json.load(f)
        for name, value in cookies_dict.items():
            session.cookies.set(name, value)
        print(f"Cookie已加载: {len(cookies_dict)} 个")
    return session

# 使用
save_cookies(session)

# 下次爬虫启动时,直接加载Cookie
session2 = load_cookies()
profile = session2.get("https://example.com/api/profile")
print(profile.json())

三、从浏览器复制Cookie(最实用)

3.1 获取Cookie的方法

不需要写登录代码,直接从浏览器复制Cookie:

  1. 打开目标网站,手动登录
  2. F12 → Application → Cookies → 选择网站
  3. 找到 session_idtoken 等关键Cookie
  4. 复制Cookie值

3.2 浏览器Cookie到Python

import requests
from http.cookiejar import CookieJar

def cookies_from_browser(cookie_str):
    """
    把浏览器复制的Cookie字符串转换为requests可用的格式
    cookie_str格式: "name1=value1; name2=value2; name3=value3"
    """
    session = requests.Session()
    # 方法1:直接设置到Session
    for item in cookie_str.split(";"):
        if "=" in item:
            name, value = item.strip().split("=", 1)
            session.cookies.set(name.strip(), value.strip())
    return session

# 从浏览器复制的Cookie
browser_cookie = "bid=abc123; __yadk_uid=xyz789; __cf_bm=test; Hm_lvt_xxxx=123"

session = cookies_from_browser(browser_cookie)

# 用这个session访问需要登录的页面
response = session.get("https://example.com/protected", timeout=10)
print("响应状态:", response.status_code)

四、用Selenium自动获取Cookie

4.1 Selenium登录后获取Cookie

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import json
import time

def selenium_login_and_get_cookies(url, username, password):
    """用Selenium登录并获取Cookie"""
    driver = webdriver.Chrome()
    driver.get(url)

    # 等待登录框出现
    WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.NAME, "username"))
    )

    # 输入用户名密码
    driver.find_element(By.NAME, "username").send_keys(username)
    driver.find_element(By.NAME, "password").send_keys(password)

    # 点击登录按钮(根据实际情况调整定位器)
    driver.find_element(By.XPATH, "//button[@type='submit']").click()

    # 等待登录成功(根据实际情况判断)
    time.sleep(3)

    # 获取所有Cookie
    cookies = driver.get_cookies()
    print(f"获取到 {len(cookies)} 个Cookie:")
    for cookie in cookies:
        print(f"  {cookie['name']}: {cookie['value'][:30]}...")

    driver.quit()
    return cookies

# 使用
cookies = selenium_login_and_get_cookies(
    url="https://example.com/login",
    username="your_username",
    password="your_password"
)

# 保存到文件
with open("selenium_cookies.json", "w", encoding="utf-8") as f:
    json.dump(cookies, f, ensure_ascii=False, indent=2)

print("Cookie已保存")

4.2 Selenium Cookie转requests

import requests

def selenium_cookies_to_requests(selenium_cookies):
    """把Selenium获取的Cookie转换为requests可用的格式"""
    session = requests.Session()
    for cookie in selenium_cookies:
        session.cookies.set(
            cookie["name"],
            cookie["value"],
            domain=cookie.get("domain", ""),
            path=cookie.get("path", "/")
        )
    return session

# 加载Selenium的Cookie
with open("selenium_cookies.json", "r", encoding="utf-8") as f:
    selenium_cookies = json.load(f)

# 转换为requests格式
session = selenium_cookies_to_requests(selenium_cookies)

# 访问需要登录的页面
response = session.get("https://example.com/profile")
print("状态:", response.status_code)
print("内容:", response.text[:200])

五、实战:用Cookie抓取GitHub私有数据

import requests
import json
from datetime import datetime, timedelta

# Cookie从浏览器登录后复制(示例,实际使用时替换为真实Cookie)
GITHUB_COOKIES = {
    "logged_in": "yes",
    "user_session": "your_user_session_here",  # 替换为真实值
    "_gh_sess": "your_gh_sess_here",           # 替换为真实值
}

session = requests.Session()
for name, value in GITHUB_COOKIES.items():
    session.cookies.set(name, value)

session.headers.update({
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
    "Accept": "application/vnd.github.v3+json",
})

def get_github_user_info(username):
    """获取GitHub用户信息"""
    url = f"https://api.github.com/users/{username}"
    response = session.get(url, timeout=10)
    if response.status_code == 200:
        data = response.json()
        return {
            "用户名": data.get("login"),
            " followers": data.get("followers"),
            "following": data.get("following"),
            "公开仓库": data.get("public_repos"),
            "Bio": data.get("bio"),
        }
    else:
        return {"错误": f"状态码{response.status_code}"}

def get_user_repos(username, max_repos=10):
    """获取用户仓库列表"""
    repos = []
    page = 1
    while len(repos) < max_repos:
        url = f"https://api.github.com/users/{username}/repos"
        params = {"sort": "updated", "per_page": 100, "page": page}
        response = session.get(url, params=params, timeout=10)
        if response.status_code != 200:
            break
        data = response.json()
        if not data:
            break
        repos.extend(data)
        page += 1
    return repos[:max_repos]

# 使用
username = "torvalds"  # 示例用户
print(f"获取 {username} 的信息...")
user_info = get_github_user_info(username)
for k, v in user_info.items():
    print(f"  {k}: {v}")

print("\n最近更新的仓库:")
repos = get_user_repos(username, 5)
for repo in repos:
    print(f"  {repo['name']} - {repo.get('description', '无描述')}{repo['stargazers_count']}")

六、Token认证(Bearer Token)

很多API不用Cookie,改用Token:

import requests

# GitHub Personal Access Token
GITHUB_TOKEN = "ghp_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
    "Authorization": f"Bearer {GITHUB_TOKEN}",
    "Accept": "application/vnd.github.v3+json",
}

# 请求API
response = requests.get("https://api.github.com/user", headers=headers, timeout=10)
data = response.json()
print(f"用户: {data.get('login')}")
print(f"仓库: {data.get('public_repos')}")
print(f"Follower: {data.get('followers')}")

获取GitHub Token:
Settings → Developer settings → Personal access tokens → Generate new token → 勾选需要的权限


七、Cookie过期与自动刷新

7.1 检测Cookie是否过期

import requests

session = requests.Session()
# 加载Cookie...

# 访问需要登录的页面
response = session.get("https://example.com/api/profile")

if response.status_code == 401 or response.status_code == 403:
    print("Cookie已过期,需要重新登录")
    # 触发重新登录流程
elif "登录" in response.text and response.status_code == 200:
    print("返回了登录页面,Cookie可能已失效")
else:
    print("Cookie有效,可以继续访问")

7.2 自动刷新Token

import requests
import time

class AuthenticatedSession:
    """带自动刷新功能的会话"""

    def __init__(self, login_func, refresh_interval=3600):
        """
        login_func: 登录函数,返回requests.Session对象
        refresh_interval: 每隔多少秒刷新一次Cookie
        """
        self.login_func = login_func
        self.refresh_interval = refresh_interval
        self.last_refresh = 0
        self.session = self.login_func()

    def get(self, url, **kwargs):
        """自动管理的GET请求"""
        self._check_and_refresh()
        return self.session.get(url, **kwargs)

    def post(self, url, **kwargs):
        """自动管理的POST请求"""
        self._check_and_refresh()
        return self.session.post(url, **kwargs)

    def _check_and_refresh(self):
        """检查并刷新Cookie"""
        now = time.time()
        if now - self.last_refresh > self.refresh_interval:
            print("刷新登录状态...")
            self.session = self.login_func()
            self.last_refresh = now

# 使用
def my_login():
    session = requests.Session()
    # 你的登录逻辑
    session.cookies.set("session_id", "your_session_id")
    return session

auth_session = AuthenticatedSession(my_login)

# 后续请求自动管理Cookie
response = auth_session.get("https://example.com/api/data")

八、知识卡

方法 说明
requests.Session() 创建会话,自动保持Cookie
session.cookies.items() 获取所有Cookie
session.cookies.set(name, value) 设置Cookie
driver.get_cookies() Selenium获取Cookie
driver.add_cookie(cookie) Selenium添加Cookie
Authorization: Bearer {token} Token认证请求头
Set-Cookie 服务器返回Cookie的响应头
Cookie过期检测 状态码401/403或返回登录页
自动刷新 定期重新登录保持Cookie有效

九、课后作业

必做题:

  1. 从浏览器复制Cookie,用requests访问需要登录的页面
  2. 实现Cookie的保存和加载功能
  3. 用Selenium登录任意网站并导出Cookie

选做题:

  1. 实现带自动刷新功能的AuthenticatedSession类
  2. 抓取GitHub的私有仓库数据

完成作业的同学,把运行截图发到评论区!


Cookie = 登录的身份证。 掌握Cookie,就掌握了需要登录的网站的爬取方法。

本篇要点:

  • Cookie的工作原理
  • requests Session保持Cookie
  • 从浏览器复制Cookie
  • Selenium自动登录获取Cookie
  • GitHub Token认证
  • Cookie过期检测与自动刷新

下一篇学习数据存储方案——CSV/Excel/MySQL全搞定。

收藏 + 关注,专栏更新不迷路!

有问题欢迎评论区留言,大家一起讨论!


标签:Python | Cookie | Session | 登录态 | 模拟登录 | Token | Bearer

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐