Python爬虫实战⑨|Cookie与登录态,搞定需要登录的页面
本文介绍了Python爬虫中处理Cookie与登录态的几种实用方法。主要内容包括:1) Cookie的工作原理及组成,它是服务器识别用户身份的关键凭证;2) 使用requests库自动处理登录流程并保存/加载Cookie;3) 直接从浏览器复制Cookie字符串并转换为Python可用的格式;4) 通过Selenium模拟浏览器登录获取Cookie,并将其转换为requests可用的格式。这些技术
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:用户IDlevel:会员等级_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:
- 打开目标网站,手动登录
- F12 → Application → Cookies → 选择网站
- 找到
session_id或token等关键Cookie - 复制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有效 |
九、课后作业
必做题:
- 从浏览器复制Cookie,用requests访问需要登录的页面
- 实现Cookie的保存和加载功能
- 用Selenium登录任意网站并导出Cookie
选做题:
- 实现带自动刷新功能的AuthenticatedSession类
- 抓取GitHub的私有仓库数据
完成作业的同学,把运行截图发到评论区!
Cookie = 登录的身份证。 掌握Cookie,就掌握了需要登录的网站的爬取方法。
本篇要点:
- Cookie的工作原理
- requests Session保持Cookie
- 从浏览器复制Cookie
- Selenium自动登录获取Cookie
- GitHub Token认证
- Cookie过期检测与自动刷新
下一篇学习数据存储方案——CSV/Excel/MySQL全搞定。
收藏 + 关注,专栏更新不迷路!
有问题欢迎评论区留言,大家一起讨论!
标签:Python | Cookie | Session | 登录态 | 模拟登录 | Token | Bearer
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐

所有评论(0)