You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Playwright无法获取Cookie值的常见问题与正确获取方法

Playwright获取Cookie失败排查及正确方案

先挨个说你三个方法拿不到结果的具体问题:

  • 监听request/response拿头的方法:你现在打出来的全是png图片这类静态资源的响应头,这类资源请求本来就不会带核心登录Cookie,而且你绑定监听的时机太晚了——填完账号密码、马上要点登录了才注册page.on,之前页面加载、后续核心登录接口的很多请求你都监听不到,自然找不到Cookie字段。
  • 调browser_context.cookies的方法:错误非常基础,你写的cookies = context.cookies没有加括号执行函数,相当于把cookies这个方法本身赋值给了变量,打印出来当然是那串bound method的提示,根本没拿到实际数据。
  • JS注入的方法:你在evaluate里写的是console.log(document.cookie),console.log只会往浏览器开发者工具的控制台打内容,本身没有返回值,所以拿回来的永远是None。就算你改对返回值,这个方法也拿不到标记为HttpOnly的Cookie,这是浏览器自带的安全限制,登录态的核心Cookie基本都是HttpOnly的,这个方法天然有缺陷。

正确获取Cookie的可运行方案

方案1:原生context.cookies()(优先用,100%能拿全包括HttpOnly的所有Cookie)

这是Playwright官方提供的标准方法,不需要折腾事件监听,只要等登录动作完成、Cookie写入浏览器上下文之后调用就行,记得加括号传参:

from playwright.sync_api import sync_playwright

url = 'https://so.gushiwen.cn/user/login.aspx'

with sync_playwright() as p:
    browser = p.chromium.launch(headless=False)
    context = browser.new_context()
    page = context.new_page()

    page.goto(url)
    page.fill('#email','6j3y4ecy@spymail.one')
    page.fill('#pwd', '6j3y4ecy@spymail.one')

    page.wait_for_timeout(5000) # 手动输入验证码的等待时间

    print('登录中...')
    page.click('#denglu')
    
    # 别硬等50秒,等登录后页面才会出现的元素加载完成就行,比固定等待靠谱
    page.wait_for_selector('.usercenter', state="attached")
    # 调用cookies()方法,传入目标url可以只过滤出对应站点的Cookie
    cookies = context.cookies(url)
    print("获取到的完整Cookie列表:", cookies)

    # 如果要转成爬虫/请求能用的;分隔的Cookie字符串,直接拼接即可
    cookie_str = "; ".join([f"{item['name']}={item['value']}" for item in cookies])
    print("格式化后的Cookie字符串:", cookie_str)

    browser.close()

如果要实时抓服务端返回时种下的Cookie,记得一定要在页面跳转、发请求之前就绑定监听事件,同时过滤掉静态资源请求减少无效输出:

# 监听代码必须写在page.goto()、page.click()这类发请求的动作之前
def catch_set_cookie(response):
    # 只过滤登录相关接口的响应
    if "login.aspx" in response.url:
        set_cookie = response.headers.get("set-cookie")
        if set_cookie:
            print("登录接口返回的Set-Cookie头:", set_cookie)

page.on("response", catch_set_cookie)

要写对返回逻辑,别用console.log:

# 直接返回document.cookie的值,不要在evaluate里写console打印
non_httponly_cookie = page.evaluate('() => document.cookie')
print("非HttpOnly类型的Cookie:", non_httponly_cookie)

提醒:这个方法拿不到HttpOnly标记的Cookie,只能拿到普通Cookie,要拿全量登录Cookie还是优先用第一种方案。


内容的提问来源于stack exchange,提问作者SSjoewvv

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 20:39:17