【发布时间】: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.chromium 和p.firefox)。
我可以将第一个 sn-p 放入一个单独的文件中并使用 subprocess 调用它,但肯定有更好的方法。
【问题讨论】: