821 字
4 分钟
Scrapy VS Request cookie管理
Scrapy vs Requests:Cookie 管理机制对比
在 Web 爬虫开发中,会话状态(如登录态)的维持通常依赖于 Cookie。requests 和 Scrapy 在 Cookie 管理上有显著差异,主要体现在自动化程度、持久化能力以及精细控制方式上。
📌 核心区别概览
| 功能 | Requests | Scrapy |
|---|---|---|
| 基础会话管理 | 需手动创建 Session() 对象 | 默认自动处理(通过 CookiesMiddleware) |
| 持久化 Cookies | 需手动序列化/反序列化(如 pickle) | 开箱即用,自动保存到磁盘(项目目录下) |
| 跨请求传递 | 同一 Session 自动携带 Cookie | 全局自动维护,无需额外代码 |
| 单次请求自定义 Cookie | requests.get(cookies={...}) | meta={'cookies': {...}} |
| 禁用自动 Cookie 合并 | 使用新 Session 或临时请求 | meta={'dont_merge_cookies': True} |
| 调试 Cookie 行为 | 手动打印 response.cookies | 设置 COOKIES_DEBUG = True 查看日志 |
✅ 建议:
- 快速脚本 / 简单任务 → Requests
- 复杂网站 / 长期运行 / 大规模抓取 → Scrapy
🎯 场景对比详解
场景 1:模拟登录并访问受保护页面
✅ Requests(手动管理)
import requests
session = requests.Session()# 登录session.post("https://example.com/login", data={"username": "user", "password": "pass"})# 自动携带 Cookie 访问resp = session.get("https://example.com/dashboard")✅ Scrapy(自动管理)
class LoginSpider(scrapy.Spider): def parse(self, response): return scrapy.FormRequest.from_response( response, formdata={'username': 'user', 'password': 'pass'}, callback=self.after_login )
def after_login(self, response): yield scrapy.Request("https://example.com/dashboard")🔹 Scrapy 自动处理登录后的 Cookie,并在后续请求中复用。
场景 2:跨运行保持登录状态(持久化)
✅ Requests(需手动保存/加载)
# 保存with open('cookies.pkl', 'wb') as f: pickle.dump(session.cookies, f)
# 加载with open('cookies.pkl', 'rb') as f: cookies = pickle.load(f)new_session = requests.Session()new_session.cookies.update(cookies)✅ Scrapy(自动持久化)
- 只需正常启动爬虫,Scrapy 会自动从磁盘加载之前存储的 Cookie。
- 可通过
COOKIES_DEBUG = True查看 Cookie 传递细节。
🔹 无需修改代码,重启后自动恢复会话状态。
场景 3:精细控制单次请求的 Cookie
✅ Requests(覆盖会话 Cookie)
custom_cookies = {"session_id": "12345"}response = session.get(url, cookies=custom_cookies) # 临时覆盖✅ Scrapy(通过 meta 控制)
yield scrapy.Request( url, meta={ 'dont_merge_cookies': True, # 禁用自动合并 'cookies': {'session_id': '12345'} # 使用专属 Cookie })🔹
dont_merge_cookies=True是关键,避免与全局 Cookie 冲突。
场景 4:处理动态 Token(非标准 Cookie)
✅ Requests(手动提取并设置 Header)
login_resp = session.post(login_url, json=credentials)token = login_resp.json()['token']session.headers.update({'X-Auth-Token': token})✅ Scrapy(通过中间件自动注入)
class TokenMiddleware: def process_request(self, request, spider): if hasattr(spider, 'auth_token'): request.headers['X-Auth-Token'] = spider.auth_token
# spider.pydef after_login(self, response): self.auth_token = response.json()['token']🔹 利用 Scrapy 中间件实现全局 Token 注入,解耦逻辑。
⚠️ 特别注意:禁用 Scrapy 自动 Cookie 管理
某些场景(如反爬严格、需完全手动控制)需关闭 Scrapy 的 Cookie 自动管理:
custom_settings = { "COOKIES_ENABLED": False, # 关闭自动 Cookie 管理}
# 手动在 headers 中传 Cookierequest = Request( url=url, headers={ "cookie": "; ".join([f"{k}={v}" for k, v in cookie_dict.items()]) })❗ 此时 Scrapy 不再解析 Set-Cookie 响应头,也不自动附加 Cookie。
✅ 最佳实践总结
| 操作 | Requests 推荐做法 | Scrapy 推荐做法 |
|---|---|---|
| 基础会话 | 使用 Session() | 默认开启,无需配置 |
| 持久化 | pickle 保存 session.cookies | 无需操作,自动持久化 |
| 单次自定义 Cookie | cookies={} 参数 | meta={'cookies': ..., 'dont_merge_cookies': True} |
| 调试 | 打印 response.cookies | 设置 COOKIES_DEBUG = True |
| 完全手动控制 | 新建临时请求 | 设置 COOKIES_ENABLED = False + 手动 header |
💡 结论:
Scrapy 的 Cookie 管理更“智能”且适合复杂项目;Requests 更“透明”且适合快速验证。根据项目规模和控制粒度需求选择合适工具。
Scrapy VS Request cookie管理
https://fuwari.vercel.app/posts/crawler/scrapy/scrapy_with_cookies_manager/