如何用SeleniumWire持续捕获已加载页面的AJAX请求?
解决SeleniumWire持续捕获AJAX请求的问题
当你使用for request in driver.requests:时,只能遍历执行代码那一刻已存在的请求,后续动态生成的AJAX请求不会被自动捕获。以下两种方案可以解决这个问题:
方案1:轮询捕获新增请求
通过记录请求总数,定期检查并处理新增的请求,适合简单场景:
from seleniumwire import webdriver import time # 初始化浏览器 driver = webdriver.Chrome() driver.get("你的目标网站URL") # 记录初始请求数量 last_req_count = len(driver.requests) try: while True: # 获取从上一次检查到现在新增的请求 new_requests = driver.requests[last_req_count:] for req in new_requests: # 过滤并处理AJAX请求(可根据实际URL特征调整判断条件) if "ajax" in req.url.lower() or "/api/" in req.url: print(f"捕获AJAX请求: {req.url}") # 可按需获取请求详情:方法、响应状态等 # print(f"请求方法: {req.method}, 响应状态: {req.response.status_code if req.response else '无响应'}") # 更新请求计数,避免重复处理 last_req_count = len(driver.requests) # 匹配你的AJAX请求频率设置检查间隔 time.sleep(1) except KeyboardInterrupt: # 按Ctrl+C终止时关闭浏览器 driver.quit()
方案2:使用请求监听器(高效实时捕获)
利用SeleniumWire的事件监听机制,当新请求发起时自动触发处理函数,无需轮询:
from seleniumwire import webdriver def process_ajax_request(request): # 过滤AJAX请求,可自定义判断逻辑 if "ajax" in request.url.lower() or request.path.startswith("/api/"): print(f"实时捕获AJAX请求: {request.url}") # 获取请求头、响应内容等信息 # print(f"请求Headers: {request.headers}") if request.response: print(f"响应状态码: {request.response.status_code}") # 初始化浏览器 driver = webdriver.Chrome() # 注册请求监听器,监听所有新发起的请求 driver.add_listener(process_ajax_request, "request") driver.get("你的目标网站URL") # 保持程序运行,直到手动按回车结束 input("按回车键停止捕获并关闭浏览器...") driver.quit()
注意事项
- 若只需捕获特定类型的AJAX请求,可通过URL关键字、请求方法(如POST)、请求头特征等条件过滤,避免处理无关请求。
- 确保使用最新版本的SeleniumWire,避免API兼容性问题。
- 无需依赖
detach选项,代码中的循环或输入阻塞会自动保持浏览器打开状态。
内容的提问来源于stack exchange,提问作者Enrico Detoma
相关产品推荐
相关产品推荐

