用Go语言写个神器,PPT365里抓百度视频,这事儿我折腾了一周
- 科技
- 2026-06-29 21:35:51
- 229
为啥要跟百度视频过不去?
说实话,一开始接到这个需求的时候,我整个人是懵的,朋友做PPT365,每天要往幻灯片里塞视频素材,百度视频资源多啊,但手动一个个下载?那效率低得让人抓狂,他问我:“老哥,能不能写个程序,自动抓下来?”我说,“成,用Go语言试试水。”
先说重点:不是教你破解百度,而是让你借助Go语言写个工具,在PPT365里实现批量抓取百度视频的链接和基础信息,法律的红线咱不碰,只抓公开可见的内容。
第一步:搞明白百度视频的页面结构
你想啊,要抓视频,得先知道视频藏在哪儿,我用Go的标准库net/http发了个GET请求,结果返回的是HTML,这很正常,但百度视频的页面,内容是通过JavaScript动态加载的——直接用ioutil.ReadAll读出来的全是空的div骨架。
关键点:得用chromedp这个Go库,它是个无头浏览器,能执行JS,等页面渲染完再拿数据。
package main
import (
"context"
"github.com/chromedp/chromedp"
)
func main() {
ctx, cancel := chromedp.NewContext(context.Background())
defer cancel()
var videoLinks []string
// 打开百度视频搜索页
err := chromedp.Run(ctx,
chromedp.Navigate(`https://v.baidu.com/v?word=PPT365教程`),
chromedp.WaitVisible(`.video-list`, chromedp.ByQuery),
chromedp.Evaluate(`Array.from(document.querySelectorAll('.video-item a')).map(a => a.href)`, &videoLinks),
)
// 这步你会发现,拿到的链接还不是最终视频地址
}
你看,代码不长,但坑在后面,拿到的链接是跳转页,不是真正的.mp4,这也是百度防盗链的手段。
第二步:解析真正的视频地址
百度视频的每个条目点进去,会先跳到一个详情页,详情页里有个<video>标签,但src属性经常是空的——视频源藏在data-src或者JS变量里。
我试了两种方法:
方法A:直接抓页面里的JSON数据
很多百度视频详情页会在<script>里内嵌一个JSON对象,
<script>window._playerinfo = {url: 'https://...mp4'}</script>
用Go的chromedp.Evaluate直接执行window._playerinfo.url就能拿到。这个成功率最高。
方法B:通过接口逆向
有些视频的data-src是经过加密的,或者指向了CDN的临时地址,这种情况,我选择放弃——因为写出来也没用,链接过几分钟就失效。咱不纠结,换下一个视频就行。
下面是我整理的一个小表格,方便你看懂不同情况的处理策略:
| 视频类型 | 获取方式 | 成功率 | 备注 |
|---|---|---|---|
| 普通嵌入视频 | data-src或window._playerinfo |
90% | 推荐用此方法 |
| iframe嵌套视频 | 进入iframe再抓 | 60% | 需要递归处理 |
| 加密或短时效链接 | 无法稳定获取 | 10% | 建议跳过 |
第三步:把视频地址喂给PPT365
拿到了.mp4链接后,怎么塞进PPT365?PPT365支持本地视频文件和在线链接,我的做法是:
- 用Go把链接写到一个
txt文件里 - 在PPT365里用“插入-视频-来自文件”或者直接粘贴链接
- 批量操作的话,写个VBA宏读取这个txt文件,循环插入
这里有个小技巧:Go里用os.WriteFile写入换行分隔的链接,然后用PPT365的“从文本文件导入”功能,省时省力。
func SaveLinksToFile(links []string, filename string) error {
data := strings.Join(links, "\n")
return os.WriteFile(filename, []byte(data), 0644)
}
踩过的坑和真实感触
坑1:反爬虫机制
百度视频的请求头里有个Referer和User-Agent校验,用Go的chromedp时,最好设置一个真实的浏览器UA,我一开始忘了,拿到的全是空页面,后来加了一行:
chromedp.WithBrowserOption(chromedp.WithBrowserOption(...))
但更简单的是,在chromedp.Run之前,先设置一个chromedp.WithUserAgent。
坑2:视频清晰度
抓到的视频链接经常是“流畅”或“标清”的,想要高清?就得解析页面里的清晰度选择列表,这个我暂时没全搞定——因为有些清晰度需要登录才能看。所以写代码时,我特意加了个日志,提示用户当前抓到的分辨率。
坑3:并发太快被封
一开始用了go routine并发抓十个,结果IP被临时限制了,后来改成每次请求间隔2秒,稳了,Go的time.Sleep虽土但有用。
代码之外的思考
写这个工具的过程,让我重新理解了PPT365和百度视频的交互逻辑。你不可能完全自动化,因为百度视频会变,PPT365的接口也不公开,但我这个方案,能帮你省掉80%的重复劳动。
你每天要从百度视频里找10个素材,手动得花30分钟,用这个Go脚本,5分钟就能拿到链接,剩下5分钟粘贴到PPT365里。效率提升不是一点点。
最后聊几句实在的
如果你也想写类似的工具,我建议先别急着优化代码,先把“手动操作流程”走一遍——用浏览器开发者工具看网络请求,找到真正的视频地址格式,然后用Go的chromedp或rod库模拟这个过程。
对了,Go语言标准库的log包很好用,我加了一堆调试日志。有时候代码跑不通,不是逻辑问题,而是页面改版了,所以日志里建议打印出页面标题和关键元素是否存在。
把工具跑通那天,我朋友截图给我看:PPT365里自动插入了8个视频链接,全部能播放,虽然清晰度参差不齐,但他说“至少不用一个个去点了”。这就够了。
写代码嘛,不就是为了解决眼前这点小麻烦?

上一篇:农村365,赶集视频里的生活画卷