使用Playwright无法捕获m3u8文件请求URL,请问遗漏了哪些设置?
Playwright无法捕获m3u8请求的排查方案
核心遗漏点
- 未触发视频播放逻辑:绝大多数视频站点的m3u8索引请求仅会在播放动作触发后发起,原有代码仅完成了页面初始加载,没有触发播放操作,自然不会捕获到对应请求。
- 等待策略不合理:
networkidle的判定逻辑是网络空闲500ms即停止等待,很多站点的播放器初始化、m3u8请求会在这个节点之后才发起,无法被监听到。 - 缺少反爬伪装:默认的无头浏览器模式很容易被站点反爬策略识别,导致播放器无法正常加载、请求被拦截。
- 未覆盖Worker请求:部分站点会通过Web Worker、Service Worker发起m3u8请求,仅监听页面的response事件会漏掉这部分请求。
- 没有针对性的请求匹配规则:没有针对m3u8的后缀、响应头做过滤,可能出现漏判。
修正后代码示例
from playwright.sync_api import sync_playwright url = "替换为你的目标视频页面地址" with sync_playwright() as p: browser = p.chromium.launch( # 测试阶段建议先开有头模式确认流程正常,再切换为无头 headless=False, args=[ # 禁用自动化特征标识,避免反爬识别 "--disable-blink-features=AutomationControlled", "--start-maximized" ] ) # 构造正常的浏览器上下文,减少反爬拦截概率 context = browser.new_context( viewport={"width": 1920, "height": 1080}, user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" ) page = context.new_page() # 统一的响应处理逻辑 def handle_response(response): # 匹配m3u8请求,同时匹配后缀和响应头避免漏判 if ".m3u8" in response.url or response.headers.get("content-type", "") in ["application/x-mpegURL", "application/vnd.apple.mpegurl"]: print(f"捕获到m3u8地址:{response.url}") # 监听页面请求 page.on("response", handle_response) # 监听Worker发起的请求 context.on("serviceworker", lambda sw: sw.on("response", handle_response)) # 页面加载使用domcontentloaded即可,不需要等networkidle page.goto(url, wait_until="domcontentloaded", timeout=90000) # 等待播放器元素加载完成 page.wait_for_selector("video", timeout=15000) # 模拟触发播放,可根据站点实际的播放按钮选择器修改 try: page.click(".player-play-btn", timeout=5000) except: # 部分站点直接点击video标签即可触发播放 page.click("video", timeout=5000) # 主动等待10秒,确保所有请求完成发起 page.wait_for_timeout(10000) page.close() context.close() browser.close()
内容的提问来源于stack exchange,提问作者Francesco Nestorini
相关产品推荐
相关产品推荐

