如何用nodriver结合CDP获取网站操作触发的HTTP响应?
使用nodriver结合CDP捕获网站动态响应内容
直接上可运行的方案,步骤清晰,适合编程经验有限的开发者:
核心思路
通过CDP的Network.enable启用网络跟踪,监听Network.responseReceived事件捕获目标请求的requestId,再调用Network.getResponseBody获取完整响应内容。
完整代码示例
import asyncio from nodriver import start async def capture_target_response(): # 启动浏览器并打开目标页面 browser = await start() tab = await browser.get("替换为你要解析的网站URL") # 第一步:启用CDP网络跟踪 await tab.send('Network.enable') # 用于存储捕获到的目标响应 target_response = None # 第二步:定义响应接收回调,过滤目标请求 def on_response_received(event): nonlocal target_response response_data = event['params']['response'] # 这里替换为你要捕获的请求URL的特征,比如包含某API路径 if "/api/your-target-endpoint" in response_data['url']: request_id = event['params']['requestId'] # 异步获取响应体,避免阻塞事件循环 asyncio.create_task(get_response_body(request_id)) async def get_response_body(request_id): nonlocal target_response # 第三步:通过requestId获取响应体 response_result = await tab.send( 'Network.getResponseBody', {'requestId': request_id} ) # 处理base64编码的响应(部分接口会返回base64格式) if response_result['base64Encoded']: import base64 target_response = base64.b64decode(response_result['body']).decode('utf-8') else: target_response = response_result['body'] # 打印或处理捕获到的响应 print("捕获到目标响应内容:") print(target_response) # 注册事件监听器 tab.add_listener('Network.responseReceived', on_response_received) # 第四步:触发网站操作(比如点击按钮、滚动,这里用sleep模拟等待请求触发) # 替换成实际的操作代码,例如:await tab.find_element("button#trigger-btn").click() await asyncio.sleep(5) # 关闭浏览器 await browser.close() # 运行异步函数 asyncio.run(capture_target_response())
关键细节说明
- 必须先启用网络跟踪:
Network.enable是所有网络事件监听的前提,一定要在页面加载或操作前调用。 - 过滤目标请求:通过
response_data['url']的特征筛选你需要的响应,避免捕获无关请求。 - 处理base64编码:部分接口会返回base64格式的响应体,需要解码后才能读取明文内容。
- 触发请求的时机:确保你的操作(点击、滚动等)是在启用网络跟踪之后执行的,否则会漏掉目标请求。
常见问题处理
- 如果没捕获到响应:检查过滤条件是否正确,或者操作是否真的触发了目标请求,可以先打印所有
response_data['url']排查。 - 响应体乱码:确认解码的编码格式(比如
utf-8)是否匹配网站的响应编码。
内容的提问来源于stack exchange,提问作者Aca
相关产品推荐
相关产品推荐

