+
104
-

回答

使用 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

网友回复

我知道答案,我要回答