如何将Firefox Cookie导入Python Requests并解决无效问题
当然可以把Firefox的Cookie加载到Requests会话里用!你遇到的问题应该是Cookie的提取和格式转换没做对——毕竟Firefox把Cookie存在SQLite数据库里,和Requests用的CookieJar结构需要一一对应才行。我来给你拆解正确的做法,顺便修正你的代码:
第一步:找到Firefox的Cookie数据库位置
Firefox的Cookie存在你用户目录下的配置文件夹里,不同系统的路径不一样:
- Windows:
%APPDATA%\Mozilla\Firefox\Profiles\<你的配置文件夹ID>\cookies.sqlite - macOS:
~/Library/Application Support/Firefox/Profiles/<你的配置文件夹ID>/cookies.sqlite - Linux:
~/.mozilla/firefox/<你的配置文件夹ID>/cookies.sqlite
你可以在Firefox地址栏输入about:profiles查看当前使用的配置文件夹路径。
第二步:正确提取并转换Cookie格式
直接从SQLite里读出来的Cookie数据需要转换成Requests能识别的Cookie对象,再加入会话的CookieJar。这里给你一个完整的可运行代码:
import sqlite3 import http.cookiejar as cookielib import requests from requests.utils import dict_from_cookiejar def load_firefox_cookies(cookie_db_path, target_domain): # 连接Firefox的Cookie数据库(确保Firefox已关闭,否则数据库会被锁定) conn = sqlite3.connect(cookie_db_path) cursor = conn.cursor() # 查询目标域名相关的Cookie,匹配包含该域名的所有主机 cursor.execute(""" SELECT name, value, host, path, expiry, isSecure, isHttpOnly FROM moz_cookies WHERE host LIKE ? """, (f'%{target_domain}%',)) cookie_jar = cookielib.CookieJar() for row in cursor.fetchall(): name, value, host, path, expiry, is_secure, is_http_only = row # 构造符合Requests要求的Cookie对象 cookie = cookielib.Cookie( version=0, name=name, value=value, port=None, port_specified=False, domain=host, domain_specified=True, domain_initial_dot=host.startswith('.'), # 处理带前缀点的域名 path=path, path_specified=True, secure=is_secure, expires=expiry if expiry != 0 else None, # 0表示会话Cookie,无需过期时间 discard=expiry == 0, comment=None, comment_url=None, rest={'HttpOnly': is_http_only}, # 处理HttpOnly属性 rfc2109=False ) cookie_jar.set_cookie(cookie) conn.close() return cookie_jar # -------------------------- 配置部分 -------------------------- # 替换成你的Cookie数据库路径和目标网站域名 FIREFOX_COOKIE_DB = "/path/to/your/firefox/profile/cookies.sqlite" TARGET_DOMAIN = "example.com" # 比如你要访问的网站是xxx.com,就填xxx.com # ------------------------------------------------------------- # 创建Requests会话并加载Cookie session = requests.Session() session.cookies = load_firefox_cookies(FIREFOX_COOKIE_DB, TARGET_DOMAIN) # 可选:设置和Firefox一致的User-Agent,避免被反爬识别 session.headers.update({ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:115.0) Gecko/20100101 Firefox/115.0" }) # 测试访问受保护的页面 response = session.get("https://example.com/your-protected-page") print(f"状态码: {response.status_code}") print("页面前500字符:") print(response.text[:500]) # 可选:打印会话中的Cookie,检查是否和Firefox里的一致 print("\n当前会话的Cookie:") print(dict_from_cookiejar(session.cookies))
你可能踩过的坑
- 数据库锁定问题:必须关闭Firefox再读取
cookies.sqlite,否则SQLite会因为文件被占用而无法读取。 - 域名匹配错误:如果查询时没有指定正确的域名,会提取无关Cookie,导致关键登录Cookie缺失。
- 忽略HttpOnly属性:很多网站的核心会话Cookie是HttpOnly的,必须在构造Cookie时加上
rest={'HttpOnly': is_http_only},否则Cookie不会生效。 - User-Agent不匹配:部分网站会检查请求的User-Agent,如果和Firefox差异太大,会被判定为非登录状态,所以建议同步User-Agent。
如果还是不行,你可以对比Firefox开发者工具里的Cookie(F12 -> 存储 -> Cookie)和代码中打印的会话Cookie,确认关键Cookie(比如sessionid、auth_token这类)是否存在且值一致。
内容的提问来源于stack exchange,提问作者Ondrej
相关产品推荐
相关产品推荐

