非常好 👍 我们现在来学习 Python Web Crawler(第6课)——使用 Cookie 模拟登录与保持会话

本课是网络爬虫中非常关键的一节,掌握 Cookie 的使用,就能突破很多登录限制、访问控制和反爬机制。


🕷️ Python Web Crawler(第6课)

—— 使用 Cookie 模拟登录与保持会话


一、什么是 Cookie?

🔹 Cookie 是服务器在浏览器中保存的小数据,用来记录用户状态。
例如:

  • 登录状态(你是谁)
  • 用户偏好设置
  • 购物车信息

🧠 简单理解:

Cookie = 网站“记得你是谁”的凭证。


二、Cookie 在爬虫中的作用

场景是否需要 Cookie说明
访问公开网页普通 GET 请求足够
访问登录后页面Cookie 中保存了登录凭证
需要保持会话状态(如连续请求接口)必须使用 Cookie

三、查看网页的 Cookie(手动)

打开浏览器 →
F12 → Network(网络) → Headers(标头) → Cookie

示例:

Cookie: sessionid=abc123; csrftoken=xyz789; logged_in=true

这说明:

  • 当前用户登录状态由 sessionid 标识;
  • 发送请求时必须附带这些 Cookie。

四、在 requests 中使用 Cookie(三种方式)


✅ 方法 1:直接在请求头中携带 Cookie

import requests

url = "https://example.com/user/profile"

headers = {
    "User-Agent": "Mozilla/5.0",
    "Cookie": "sessionid=abc123; csrftoken=xyz789"
}

response = requests.get(url, headers=headers)
print(response.text)

📌 用途:

  • 简单快捷;
  • 适合短期测试;
  • 缺点:Cookie 失效后需手动更新。

✅ 方法 2:使用 cookies 参数传递字典

import requests

url = "https://example.com/user/profile"

cookies = {
    "sessionid": "abc123",
    "csrftoken": "xyz789"
}

response = requests.get(url, cookies=cookies)
print(response.text)

📌 用途:

  • 更规范;
  • requests 会自动格式化为 HTTP 请求头。

✅ 方法 3:使用 Session 对象保持登录状态(推荐)

import requests

login_url = "https://example.com/login"
profile_url = "https://example.com/user/profile"

# 创建 Session(自动管理 Cookie)
session = requests.Session()

# 模拟登录
data = {
    "username": "admin",
    "password": "123456"
}
session.post(login_url, data=data)

# 登录后访问个人主页
response = session.get(profile_url)

print(response.text)

📌 特点:

  • 登录后自动保存 Cookie;
  • 多次请求时自动携带;
  • 推荐用于需要连续访问的爬虫。

五、查看并保存 Cookies

for cookie in session.cookies:
    print(cookie.name, ":", cookie.value)

输出示例:

sessionid : abc123
csrftoken : xyz789

也可以将 Cookie 保存为字典:

cookies_dict = session.cookies.get_dict()
print(cookies_dict)


六、从浏览器导入 Cookie(更真实的登录)

有些网站必须手动登录才能爬取数据。
可以在浏览器中复制登录后的 Cookie,然后在爬虫中使用:

import requests

url = "https://example.com/dashboard"

headers = {
    "User-Agent": "Mozilla/5.0",
    "Cookie": "sessionid=abcd1234efgh5678; logged_in=true;"
}

response = requests.get(url, headers=headers)
print(response.text)

✅ 实用技巧:

  1. 登录网站 → F12 → Network → 刷新页面;
  2. 点击任意请求 → 复制 Cookie → 粘贴到代码中。

七、Cookie 持久化(保存与加载)

让爬虫在下次运行时,直接使用上次保存的登录状态。

import requests
import pickle

session = requests.Session()
login_url = "https://example.com/login"
data = {"username": "admin", "password": "123456"}

# 登录并保存 Cookie
session.post(login_url, data=data)
pickle.dump(session.cookies, open("cookies.pkl", "wb"))

# 下次运行时加载 Cookie
session.cookies.update(pickle.load(open("cookies.pkl", "rb")))
response = session.get("https://example.com/user/profile")

print(response.text)

✅ 实现了 免登录爬取


八、案例实战:登录爬取(模拟表单 + Cookie 保持)

import requests

login_url = "https://quotes.toscrape.com/login"
target_url = "https://quotes.toscrape.com"

session = requests.Session()

# Step 1:访问登录页,获取 csrf_token
r = session.get(login_url)
from bs4 import BeautifulSoup
soup = BeautifulSoup(r.text, "html.parser")
token = soup.find("input", {"name": "csrf_token"})["value"]

# Step 2:提交登录表单
payload = {
    "csrf_token": token,
    "username": "admin",
    "password": "admin"
}
session.post(login_url, data=payload)

# Step 3:访问登录后的页面
resp = session.get(target_url)
print("是否登录成功:", "Logout" in resp.text)

✅ 输出:

是否登录成功: True

🔹 模拟登录 + 保持会话 + 动态获取 token(真实网站常见)。


九、常见问题与解决方案

问题原因解决方法
登录后访问仍未生效Cookie 未被保存确认使用 Session 对象
返回 403缺少 User-Agent 或 Referer添加请求头
Cookie 无效登录超时或被清除重新登录并刷新 Cookie
反爬检测识别为脚本添加延迟、使用代理、更换 UA

🔟 小结

技术功能适用场景
headers["Cookie"]手动携带 Cookie测试、简单场景
cookies={}自动格式化 Cookie普通网页请求
Session()自动保存/发送 Cookie登录、连续访问
pickle.dump()Cookie 持久化长期免登录

💡 提示

✅ 爬虫中 Cookie 的典型用途:

  • 模拟登录;
  • 保持登录态爬取数据;
  • 模拟身份(不同用户不同 Cookie);
  • 绕过反爬验证。