如何绕过Flash Player限制,使用Jsoup获取网页视频src?
如何绕过Flash限制获取视频标签的src属性?
问题还原
你在浏览器里能看到正常的video标签:
<video style="width: 854px; height: 480px; left: 0px; top: 0px;" tabindex="-1" class="video-stream html5-main-video" controlslist="nodownload" src="blob:https://www.youtube.com/69bf4dd1-062f-487f-8ca7-6a2493f8dfc8"></video>
但用Jsoup爬取时,得到的却是Flash版本过时的提示:
You are seeing this message either because your Flash Player is outdated or because your browser does not support HTML5 player
你的Jsoup代码如下:
final Document doc = Jsoup.connect(this.url) .validateTLSCertificates(false) .get();
原因分析
这本质上是两个核心问题在作祟:
- 请求身份被识别:网站会检测请求的
User-Agent头,Jsoup默认的UA是jsoup/版本号,会被判定为非浏览器爬虫,返回降级的Flash提示页面。 - 静态爬取的局限:YouTube这类视频网站的video标签是通过JavaScript动态渲染生成的,Jsoup只能解析初始静态HTML,无法执行JS,自然拿不到动态生成的内容。
另外还要注意:你看到的blob:开头的地址是浏览器本地生成的临时URL,不是真实的远程视频源,即使拿到也无法直接下载或播放。
解决方案
1. 先模拟浏览器User-Agent尝试
第一步先给Jsoup请求添加浏览器的User-Agent头,让网站认为你是正常浏览器访问:
final Document doc = Jsoup.connect(this.url) .validateTLSCertificates(false) // 这里用Chrome的UA,你可以换成自己当前浏览器的UA .header("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") .get();
不过这一步大概率还是拿不到video标签,因为核心的动态渲染问题没解决。
2. 使用支持JS渲染的工具
要获取JS生成的内容,需要用能模拟浏览器执行JS的工具,比如Selenium或者HtmlUnit。这里以Selenium为例:
// 初始化ChromeDriver(需要提前下载对应版本的ChromeDriver) WebDriver driver = new ChromeDriver(); driver.get(this.url); // 等待视频标签加载完成(用显式等待会更可靠,这里用sleep做简化示例) Thread.sleep(3000); // 获取目标video元素 WebElement videoElement = driver.findElement(By.cssSelector("video.video-stream.html5-main-video")); String blobSrc = videoElement.getAttribute("src"); System.out.println(blobSrc); // 关闭浏览器 driver.quit();
注意:这里拿到的还是blob:地址,要获取真实视频源,还需要进一步操作:
3. 抓取真实的视频流地址
blob:地址是浏览器对视频流的本地封装,真实的视频地址需要从浏览器的网络请求中挖掘:
- 打开浏览器开发者工具(F12),切换到Network标签
- 刷新页面,筛选
Media类型的请求,找到.m3u8或者.mp4格式的请求地址 - 这个地址才是真实的视频源,你可以模拟该请求的Headers(比如
Referer、Cookie等)去获取视频内容
额外提醒
YouTube有严格的反爬机制,未经授权爬取其视频内容可能违反其服务条款,操作前请确保符合相关规定。
内容的提问来源于stack exchange,提问作者Almas Abdrazak
相关产品推荐
相关产品推荐

