游客发表
用VBA抓视频,抓视本质上就是频教让Excel替你发HTTP请求,再把返回的抓视数据流写进本地文件。听起来像黑客干的频教事,其实代码量少得可怜——核心就一句 URLDownloadToFile,抓视或者用 WinHttp.WinHttpRequest.5.1 走异步。频教我最早拿它下公开课,抓视一个循环遍历单元格里的频教链接,三分钟搞定整季课程,抓视比装某雷干净多了。频教
先看最糙的抓视写法。打开VBE,频教插入模块,抓视粘贴:
Declare PtrSafe Function URLDownloadToFile Lib "urlmon" _ Alias "URLDownloadToFileA" (ByVal pCaller As LongPtr,频教 _ ByVal szURL As String, ByVal szFileName As String, _ ByVal dwReserved As LongPtr, ByVal lpfnCB As LongPtr) As Long Sub DownOne() Dim url As String, savePath As String url = "https://example.com/lesson01.mp4" savePath = "D:\videos\lesson01.mp4" URLDownloadToFile 0, url, savePath, 0, 0 End Sub 跑一下,文件就躺那儿了。抓视但问题马上来:这玩意儿是同步的,界面直接假死,大文件下到一半你想取消都没门。而且它不返回进度,你只能盯着文件夹看体积涨没涨。我试过下1.2G的讲座视频,Excel白屏了整整八分钟,同事以为我电脑炸了。
换WinHttp。这对象能设超时、能读响应头、能拿状态码。关键是把 Option Explicit 打开,不然变量拼错了都不报错。下面这段是我常用的骨架:
Sub DownWithWinHttp() Dim http As Object, stream As Object Dim url As String, filePath As String Set http = CreateObject("WinHttp.WinHttpRequest.5.1") url = "https://example.com/video.mp4" filePath = "D:\videos\video.mp4" http.Open "GET", url, False http.Send If http.Status = 200 Then Set stream = CreateObject("ADODB.Stream") stream.Type = 1 stream.Open stream.Write http.ResponseBody stream.SaveToFile filePath, 2 stream.Close End If End Sub 注意 SaveToFile 第二个参数写2,覆盖已有文件。写1的话文件存在就报错,调试时被坑过好几次。还有 ADODB.Stream 写二进制之前必须 Type = 1,默认是文本模式,直接写会乱码。
真正麻烦的是带防盗链的站点。你直接请求mp4地址,服务器返回403。得把Referer和User-Agent塞进请求头:
http.SetRequestHeader "Referer", "https://example.com/page.html" http.SetRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64)" 有些站还要Cookie。我一般先用浏览器F12抓包,把Cookie整条复制出来,http.SetRequestHeader "Cookie", "sessionid=abc123; token=xyz"。这招对B站早期课程页面管用,现在B站改签名了,VBA搞不定,得换Python。
批量下载的套路:A列放URL,B列放文件名,C列放状态。循环里加个 On Error Resume Next,单个失败不影响整体。再配个 Application.StatusBar 显示进度,比进度条省事。我习惯每下完一个就 DoEvents 一下,不然Excel跟死了一样。
最后说个坑:VBA的字符串长度限制。URL超过2048字符会截断,有些带长token的链接直接废掉。解决办法是用 WinHttpRequest 的 Open 方法时把URL拆成 Option 和 Url 分开传,或者干脆改用 MSXML2.ServerXMLHTTP。我现在的做法是超过1500字符的链接直接扔给curl,VBA只管调度。
这套东西下公开课、会议录像、监控片段都够用。别拿它下版权内容,IP被封了别怪我没提醒。代码就这么多,剩下的自己试错——反正我当年是下了三百多个G才把各种报错认全的。
友情链接