什么是 Cookie?
Cookie 是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器下次向同一服务器再次发起请求时被携带并发送到服务器上,它用于告知服务器两个请求是否来自同一浏览器,如保持用户的登录状态、记录用户偏好设置等。

一个形象的比喻: 想象你去一家咖啡馆。
- 第一次去:你点了一杯拿铁,店员说:“这是你的会员卡,下次来给我看一眼,就不用再注册了。” 这张“会员卡”Session(服务器端存储的用户信息)。
- 你把会员卡 放在了口袋里,这张卡上的信息,比如你的会员号,Cookie(客户端存储的信息)。
- 第二次去:你直接把口袋里的会员卡(Cookie)给店员看,店员一看会员号,就知道是你,直接给你做拿铁,不用你再登录一遍。
在爬虫中,如果我们要爬取需要登录后才能看到的内容,就需要模拟这个过程:先登录,拿到服务器给的“会员卡”(Cookie),然后在后续的请求中,一直带着这张“会员卡”去访问。
为什么在爬虫中需要处理 Cookie?
主要有两个原因:
- 维持登录状态:很多网站的内容(如个人中心、订单信息、关注列表)需要用户登录后才能访问,服务器通过 Cookie 来识别你是否已登录,如果你不携带 Cookie,服务器会认为你是一个未登录的游客,只给你看公开信息。
- 绕过反爬虫机制:有些网站会通过检查请求中的 Cookie 来判断你是不是一个正常的浏览器用户,频繁的、不带任何标识的请求可能会被识别为爬虫并被封禁 IP。
如何在 Python3 爬虫中使用 Cookie?
在 Python 中,最常用的爬虫库是 requests,下面我们通过 requests 来演示 Cookie 的三种主要用法。

准备工作
确保你已经安装了 requests 库:
pip install requests
为了演示,我们以一个著名的、允许我们测试登录的网站 http://httpbin.org 为例,它提供了一个 /cookies/set 接口,可以让我们方便地设置和获取 Cookie。
手动管理 Cookie (最直接)
这种方法适用于你已经知道具体的 Cookie 内容,或者通过其他手段(如浏览器开发者工具)获取到了 Cookie。
步骤:
- 获取 Cookie:从浏览器开发者工具(F12 -> Network 标签 -> 刷新页面 -> 找到登录请求 -> 查看 Cookie)复制出来。
- 构造一个字典,键是 Cookie 的名称,值是 Cookie 的值。
- 在
requests.get()或requests.post()中,使用cookies参数传入这个字典。
示例代码:
import requests
# 1. 准备一个包含 Cookie 的字典
# 假设我们通过某种方式获取到了这个 Cookie
my_cookies = {
'session_id': '1234567890abcdef',
'user_token': 'qwertyuiop'
}
# 2. 发起请求,并携带 Cookie
# httpbin.org/cookies 会返回请求中携带的所有 Cookie
response = requests.get('https://httpbin.org/cookies', cookies=my_cookies)
# 3. 打印结果
print("状态码:", response.status_code)
print("响应内容:", response.json())
# 预期输出应该会包含我们传入的 my_cookies
优点:简单直接,适合一次性或少量固定的 Cookie。 缺点:Cookie 通常有过期时间,手动管理很麻烦,无法处理登录流程。
自动获取并使用 Session (推荐)
这是最常用、最推荐的方法。requests.Session 对象会自动处理 Cookie,它会像浏览器一样,在第一次请求(通常是登录请求)时接收并保存服务器返回的 Cookie,并在之后该 Session 对象发起的所有请求中自动带上这些 Cookie。
步骤:
- 创建一个
requests.Session()对象。 - 向登录接口发送
POST请求(用户名、密码等数据),服务器会返回包含登录信息的 Set-Cookie 头。 - Session 对象会自动保存这些 Cookie。
- 使用同一个 Session 对象去访问需要登录的页面,它会自动带上登录时获取的 Cookie。
示例代码:
import requests
# 1. 创建一个 Session 对象
session = requests.Session()
# 2. 准备登录所需的数据
login_data = {
'username': 'test_user',
'password': 'test_password'
}
# 3. 发送登录请求
# httpbin.org 提供了一个模拟登录的 POST 接口
login_url = 'https://httpbin.org/post'
response = session.post(login_url, data=login_data)
print("登录请求状态码:", response.status_code)
# session 对象已经自动保存了服务器返回的 Cookie
# 4. 使用同一个 session 对象访问需要登录的页面
# httpbin.org/cookies 会返回请求中携带的所有 Cookie
protected_url = 'https://httpbin.org/cookies'
response = session.get(protected_url)
print("\n访问受保护页面的状态码:", response.status_code)
print("受保护页面的响应内容:", response.json())
# 你会看到返回的 Cookie 中包含了登录时可能设置的信息
优点:
- 自动化:无需手动处理 Cookie 的存储和携带。
- 高效:Session 对象会保持底层的 TCP 连接,可以复用,提高效率。
- 强大:可以方便地添加默认的请求头(如
User-Agent),对所有请求生效。
从浏览器导出 Cookie 并使用
我们希望爬虫的行为和我们的浏览器完全一致,或者我们已经在浏览器中手动登录了某个网站,这时,我们可以从浏览器中导出 Cookie,然后加载到爬虫中使用。
步骤:
-
从浏览器导出 Cookie:
- Chrome: 使用扩展程序如 "Get cookies.txt LOCALLY" 或 "Copy All Cookies"。
- Firefox: 使用扩展程序如 "cookies.txt"。
- 导出的格式通常是
cookies.txt,格式为:domain\tinclude_subdomain\tname\tpath\texpiry\tsecure\thttpOnly\tvalue。
-
安装
http.cookiejar和requests相关库:requests可以直接读取http.cookiejar格式的 Cookie。 -
编写代码加载 Cookie:
示例代码:
import requests
from http.cookiejar import MozillaCookieJar
# 1. 指定你导出的 cookies.txt 文件路径
# 注意:请确保你有一个名为 'my_cookies.txt' 的文件
# 并且文件内容符合 Netscape 格式
cookie_file = 'my_cookies.txt'
# 2. 创建一个 MozillaCookieJar 对象
cookie_jar = MozillaCookieJar(cookie_file)
# 3. 加载 Cookie 文件
# ignore_discard=True 表示忽略过期的 Cookie
# ignore_expires=True 表示忽略过期时间
try:
cookie_jar.load(ignore_discard=True, ignore_expires=True)
print("Cookie 文件加载成功!")
except FileNotFoundError:
print(f"错误:找不到 Cookie 文件 '{cookie_file}',请先从浏览器导出。")
exit()
# 4. 创建一个 Session 对象
session = requests.Session()
# 5. 将加载的 Cookie 关联到 Session
session.cookies = cookie_jar
# 6. 使用 session 发起请求
# 假设这个网站需要登录才能访问
# 注意:这里的 URL 需要替换成你实际要爬取的网站域名
# 因为 Cookie 是与域名绑定的
url = 'https://example.com/your-protected-page'
response = session.get(url)
print(f"\n请求 {url} 的状态码: {response.status_code}")
# print("响应内容:", response.text[:500]) # 打印前500个字符
注意:my_cookies.txt 文件的格式示例(以 httpbin.org 为例):
httpbin.org TRUE / FALSE 1672531199 session_id 1234567890abcdef
httpbin.org TRUE / FALSE 1672531199 user_token qwertyuiop
总结与最佳实践
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 手动管理 | 简单、直接 | Cookie 易过期,维护麻烦 | 一次性测试、有长期有效 Cookie 的简单站点 |
| Session 对象 | 自动化、高效、可维护 | 需要自己构造登录请求 | 绝大多数场景,特别是需要登录的网站 |
| 从浏览器导入 | 行为与浏览器一致,无需处理登录流程 | 依赖浏览器扩展,Cookie 有时效性,手动操作 | 需要模拟特定浏览器环境,或临时利用已登录状态 |
最佳实践建议:
- 优先使用
requests.Session:这是处理 Cookie 和登录状态最优雅、最强大的方式。 - 检查登录接口:使用浏览器开发者工具(F12)分析登录请求,找到正确的 URL、请求方法(GET/POST)、请求头(如
Content-Type)和请求体(表单数据或 JSON)。 - 处理验证码:如果登录需要验证码,情况会变得复杂,可能需要使用 OCR 识别或第三方打码平台。
- 处理动态 Cookie:有些网站的 Cookie 是由 JavaScript 动态生成的,这种情况下,从浏览器导入可能是唯一可行的办法。
- 遵守
robots.txt和网站条款:爬虫的使用应遵守法律法规和网站的使用协议,不要对服务器造成过大压力。
