【问题标题】:Refreshing cookie using Playwright for Python [duplicate]使用 Playwright for Python 刷新 cookie [重复]
【发布时间】:2021-08-23 16:57:01
【问题描述】:

我正在尝试使用 requests 抓取网站。不幸的是,这需要很长时间,以至于我需要在抓取期间不时刷新 cookie(我也不想在几天后重新运行脚本时手动复制新的 cookie)。我认为最简单的方法是使用 playwright 加载 Chrome 并打开网站,然后返回最终设置的 cookie。

我不确定如何执行此操作,因为这是一个异步操作,因为我只能在触发函数 page.on('request', fn) 的事件侦听器中获取 cookie,然后我需要在获取 cookie 后以某种方式返回它。我尝试在外部范围内设置一个变量

from playwright.sync_api import sync_playwright

cookie = None
with sync_playwright() as p:
    browser = p.firefox.launch()
    page = browser.new_page()

    def set_cookie(req):
        if "cookie" in req.headers:
            print(req.headers["cookie"])
            cookie = req.headers["cookie"]
    page.on('request', set_cookie)
    page.goto(url)

    browser.close()
print(cookie)

这会打印正确的 cookie,但最终不起作用,因为内部函数 (set_cookie()) 中的 cookie 与外部作用域中的 cookie 不同(我的 IDE 甚至抱怨我从来没有使用我在第 11 行设置的变量),因此外部 cookie 变量保持为 None

我还尝试添加context 并通过context.cookies() 获取cookie

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch()
    page = browser.new_page()
    context = browser.new_context()
    page.goto(url)
    print(context.cookies())  # returns []
    browser.close()

但这只是返回[],即什么都没有(我尝试了p.chromiump.firefox)。

我可以将第一个 sn-p 放入一个单独的文件中并使用 subprocess 调用它,但肯定有更好的方法。

【问题讨论】:

    标签: python events cookies


    【解决方案1】:

    您可以通过声明它是nonlocal variable 来分配给外部作用域中定义的变量:

    from playwright.sync_api import sync_playwright
    
    def new_cookie(url):
        cookie = None
        def set_cookie(req):
            nonlocal cookie
            if "cookie" in req.headers:
                cookie = req.headers["cookie"]
    
        with sync_playwright() as p:
            browser = p.firefox.launch()
            page = browser.new_page()
            page.on("request", set_cookie)
            page.goto(url)
            browser.close()
    
        return cookie
    
    print(new_cookie("https://example.com"))
    

    【讨论】:

      猜你喜欢
      • 2022-11-07
      • 1970-01-01
      • 1970-01-01
      • 2021-01-25
      • 2021-07-11
      • 2018-07-26
      • 2014-02-12
      • 2021-02-23
      • 2015-07-08
      相关资源
      最近更新 更多