从网页抓取视频(和入门ffmpeg开FFmpeg官方网站有了神器何不自己写个工具)
优采云 发布时间: 2022-01-27 19:16从网页抓取视频(和入门ffmpeg开FFmpeg官方网站有了神器何不自己写个工具)
前几天有个同学说想下载网站的视频,找不到链接,就问我有什么办法。当时觉得应该很简单,就说抽时间看看。然后它分析目标网页并尝试从网页的源代码中找到链接,但失败了。F12调出开发者工具,进入NetWrok,看到网页是通过ajax发起xhr请求的视频连接,难怪页面元素中没有下载地址,请求的是m3u8格式文件,我查了一下这是一个流媒体文件碎片化,然后四处寻找下载这种格式文件的工具并不理想。很多都是分片后直接下载的ts文件,但是这个网站是加密的,不能直接播放。最后,找到了ffmpeg,一个视频插件神器,可以转码、剪切、合并、播放视频。更不用说,它还支持多个平台。
ffmpeg 介绍和 FFmpeg 入门
ffmpeg 打开 FFmpeg 官方 网站
如果你有一个神器,为什么不自己写一个工具来下载呢?当您准备开始时,您会被如何获得连接的问题所困扰。本来只是想写一个小爬虫,爬取网页连接。结果不行,ajax动态发起的请求,网页元素中没有数据,对js不熟悉,不知道如何获取这种数据。学生可以手动打开浏览器F12然后找到连接吗?这不是我的风格 :) 然后继续各种搜索,得到一个结果,自己实现浏览器,拦截网页上的所有请求肯定会得到。筛选后得到三个选项:
1.WebBrowser.
2.GeokoFx.
3.CefSharp.
首先我尝试了WebBrowser,目标网站无法直接打开网页,所以我换了谷歌浏览器,修改了UserAgent打开,但是网页没有完全显示,所以放弃了。然后把GeokoFx改成直接打开,速度也不错,但是有些连接点击没反应,只能放弃了。最终CefSharp测试达到了预期的目标,即flash和H264视频无法打开。折腾了一天,官方表示版权问题不支持,需要自行修改。我可以找到一个修改后的库。我找到了一个支持 flash 和 H264 视频的库:
提取码:dfdr
是nupkg安装包,看nupkg安装方法
然后编写代码:
获取视频地址只需要继承和集成默认抽象类DefaultRequestHandler即可。
public class MyRequestHandler : DefaultRequestHandler
{
public override CefReturnValue OnBeforeResourceLoad(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IRequestCallback callback)
{
//拿到url后再判断下是不是视频文件
string url = request.Url;
}
}
然后在初始化浏览器时指定它。
chromeBrowser.RequestHandler = new MyRequestHandler(callback);
这里我提取url中的文件名,然后判断扩展名判断是否为视频文件。不知道有没有更通用的方法。判断 ResourceType == ResourceType.Media 是不够的。很多时候这个值返回 xhr。
FFmpeg部分就是直接命令行调用下,有时间再研究下这个神器的lib方式。
以下是折腾几天的结果。
在浏览器界面,打开网页后,如果截取视频地址,右上角GO后面会显示【X】。x 表示当前页面截取的视频文件个数。
点击左上角的数字或下载标签,来到如下界面。
您可以在这里进行下载、播放等操作。界面丑陋,但功能实现了。
下载支持断点续传,但m3u8片段文件不保存断点,所以软件关闭后无法断点续传,必须重新开始。直播流的大小无法预测,所以不会显示进度,但会及时更新下载的数据大小。
一般情况下不需要下载ts文件,直接下载m3u8即可,程序会自动分析ts碎片文件,下载完所有文件后自动合成一个mp4文件。
软件下载:链接:
提取码:n6q4
如果还是不行,请下载安装NET Framework 4.6.1