使用 Playwright 加载本地 Chrome 浏览器的 Cookie
Playwright 可以通过几种方式加载本地 Chrome 浏览器的 Cookie 和其他状态数据。以下是几种常用方法:
方法一:使用用户数据目录
最直接的方法是指定 Chrome 的用户数据目录,这样 Playwright 可以直接使用已有的配置文件、Cookie、扩展等:
from playwright.sync_api import sync_playwright
def use_chrome_profile():
with sync_playwright() as p:
# 指定 Chrome 用户数据目录
user_data_dir = r"C:\Users\wangbo\AppData\Local\Google\Chrome\User Data"
# 启动浏览器时使用该目录
browser = p.chromium.launch_persistent_context(
user_data_dir=user_data_dir,
headless=False,
channel="chrome" # 使用已安装的 Chrome 而不是 Playwright 内置的 Chromium
)
page = browser.new_page()
page.goto("https://www.baidu.com")
# 此时页面应该已经包含了你的登录状态和 Cookie
print("已加载本地 Chrome 配置文件")
# 等待用户操作
input("按回车键继续...")
browser.close()
if __name__ == "__main__":
use_chrome_profile() 方法二:导出 Cookie 并手动设置
如果你只需要 Cookie 而不需要完整的用户配置:
from playwright.sync_api import sync_playwright
import json
def set_cookies_from_file():
with sync_playwright() as p:
browser = p.chromium.launch(headless=False)
context = browser.new_context()
page = context.new_page()
# 从文件加载 Cookie
with open('cookies.json', 'r') as f:
cookies = json.load(f)
# 设置 Cookie
context.add_cookies(cookies)
# 访问网站,应该已经是登录状态
page.goto('https://www.baidu.com')
input("按回车键继续...")
browser.close()
if __name__ == "__main__":
set_cookies_from_file() 方法三:使用 Chrome DevTools Protocol 直接连接到 Chrome
from playwright.sync_api import sync_playwright
def connect_to_chrome():
with sync_playwright() as p:
# 连接到已经运行的 Chrome 实例
# 需要先用 --remote-debugging-port=9222 启动 Chrome
browser = p.chromium.connect_over_cdp("http://localhost:9222")
# 获取默认上下文
default_context = browser.contexts[0]
# 使用已有的页面或创建新页面
page = default_context.new_page()
page.goto("https://www.baidu.com")
input("按回车键继续...")
browser.close()
if __name__ == "__main__":
connect_to_chrome() 如何从 Chrome 导出 Cookie
要使用方法二,你需要先从 Chrome 导出 Cookie。这里有一个简单的脚本:
import os
import json
import sqlite3
import shutil
from datetime import datetime, timedelta
def get_chrome_cookies(domain=None):
# Chrome Cookie 数据库路径
cookie_path = os.path.join(os.environ['LOCALAPPDATA'],
r'Google\Chrome\User Data\Default\Network\Cookies')
# 创建临时副本以避免数据库锁定问题
temp_path = os.path.join(os.environ['TEMP'], 'chrome_cookies_temp')
shutil.copy2(cookie_path, temp_path)
# 连接到数据库
conn = sqlite3.connect(temp_path)
conn.text_factory = str
cursor = conn.cursor()
# 查询条件
sql = 'SELECT host_key, name, value, path, expires_utc, is_secure, is_httponly FROM cookies'
if domain:
sql += f" WHERE host_key LIKE '%{domain}%'"
# 执行查询
cursor.execute(sql)
cookies = []
# 处理结果
for item in cursor.fetchall():
host, name, value, path, expires, secure, httponly = item
# 转换为 Playwright 格式
cookie = {
'name': name,
'value': value,
'domain': host,
'path': path,
'expires': expires // 1000000 - 11644473600, # 转换 Windows 时间戳
'secure': secure == 1,
'httpOnly': httponly == 1
}
cookies.append(cookie)
# 关闭连接并删除临时文件
conn.close()
os.remove(temp_path)
# 保存到文件
with open('cookies.json', 'w') as f:
json.dump(cookies, f)
return cookies
if __name__ == "__main__":
# 可以指定域名过滤,如 "baidu.com"
domain = input("输入要提取 Cookie 的域名(留空提取所有): ")
cookies = get_chrome_cookies(domain if domain else None)
print(f"已提取 {len(cookies)} 个 Cookie 并保存到 cookies.json") 注意事项
使用用户数据目录时,确保 Chrome 浏览器已完全关闭,否则可能会出现数据库锁定问题如果你的 Chrome 使用了自定义安装路径,需要相应调整用户数据目录路径使用方法三时,需要先用特殊参数启动 Chrome: "C:\Program Files\Google\Chrome\Application\chrome.exe" --remote-debugging-port=9222
网友回复


