Playwright中set_extra_http_headers方法失效问题求助
问题分析与解决方案
核心问题点
- 异步方法未加
await:context.set_extra_http_headers和page.set_extra_http_headers都是异步方法,必须通过await等待执行完成,否则设置逻辑不会生效——这是你最初尝试context设置无效的直接原因。 - 请求头获取方式错误:
page.request并非page.goto(url)发起的目标请求对象,且该属性在goto完成前可能未正确初始化,导致你打印结果为空。
修正后的代码示例
async def navigate_page(self, url, headers): async with async_playwright() as p: browser = await p.chromium.launch() # 推荐:创建context时直接传入headers(全局生效) context = await browser.new_context(extra_http_headers=headers) # 或者用await调用set方法(必须加await) # await context.set_extra_http_headers(headers) page = await context.new_page() # 若仅需当前页面生效,用page的set方法(同样要加await) # await page.set_extra_http_headers(headers) # 获取goto对应的响应和请求对象 response = await page.goto(url) target_request = response.request # 打印正确的请求头 print(target_request.headers) page_content = await page.content() await browser.close() return page_content
额外技巧:拦截特定请求
如果需要避免重定向干扰,确保获取的是目标URL的请求,可以用page.wait_for_request:
async def navigate_page(self, url, headers): async with async_playwright() as p: browser = await p.chromium.launch() context = await browser.new_context(extra_http_headers=headers) page = await context.new_page() # 预先等待目标请求 request_promise = page.wait_for_request(lambda req: req.url == url) await page.goto(url) target_request = await request_promise print(target_request.headers) page_content = await page.content() await browser.close() return page_content
注意事项
- Headers的键值对必须都是字符串类型,你的
{'referer': 'some url'}格式是正确的。 - Playwright会自动处理HTTP头的大小写规范,无需手动调整(比如
referer会被转为符合标准的Referer)。
内容的提问来源于stack exchange,提问作者Curious miss Pythonist'a
相关产品推荐
相关产品推荐

