Python Playwright异步模式下捕获存储请求响应头问题
异步Playwright捕获请求/响应头并存字典的解决方法
为啥异步模式会输出绑定方法?
同步模式里,Playwright的request.headers和response.headers是可直接访问的属性;但异步版本中这俩是异步方法,直接调用只会返回方法对象,必须通过await执行才能拿到实际的头内容。
完整实现代码
import asyncio from playwright.async_api import async_playwright # 存储所有请求响应头的字典,key为请求URL,value包含请求头和响应头 headers_store = {} async def capture_all_headers(): async with async_playwright() as p: browser = await p.chromium.launch(headless=False) page = await browser.new_page() # 监听请求,捕获请求头 async def handle_request(request): # 核心:必须用await调用headers()方法 req_headers = await request.headers() # 初始化当前URL的存储结构 if request.url not in headers_store: headers_store[request.url] = {"request": {}, "response": {}} headers_store[request.url]["request"] = req_headers print(f"请求头 [{request.url}]: {req_headers}") # 监听响应,捕获响应头 async def handle_response(response): # 同样需要await调用headers() res_headers = await response.headers() if response.url in headers_store: headers_store[response.url]["response"] = res_headers print(f"响应头 [{response.url}]: {res_headers}") # 绑定监听事件到页面 page.on("request", handle_request) page.on("response", handle_response) # 访问目标页面 await page.goto("https://example.com") await browser.close() if __name__ == "__main__": asyncio.run(capture_all_headers()) # 打印最终存储的所有头信息 print("\n=== 存储的所有头信息 ===") for url, headers in headers_store.items(): print(f"URL: {url}") print(f"请求头: {headers['request']}") print(f"响应头: {headers['response']}\n")
关键注意点
- 监听请求/响应的回调函数必须定义为
async def,因为内部要执行await操作 - 绝对不能直接写
request.headers,必须加await调用await request.headers() - 如果只需要捕获特定类型的请求(比如接口),可以在回调里加判断,比如
if "/api/" in request.url:再处理 - 存储字典的结构可按需调整,比如想按请求顺序存储,改用列表套字典的形式即可
内容的提问来源于stack exchange,提问作者Singularity20XX
相关产品推荐
相关产品推荐

