用Go语言写个365dni西瓜视频中文字幕爬虫?这事儿我干过

这事儿得从去年夏天说起,那天晚上我瘫在沙发上刷手机,翻到一个叫“365dni”的西瓜视频合集,点进去一看,好家伙,全是外文电影,字幕还是...

这事儿得从去年夏天说起,那天晚上我瘫在沙发上刷手机,翻到一个叫“365dni”的西瓜视频合集,点进去一看,好家伙,全是外文电影,字幕还是机翻的鬼样子——“我爱你”能翻译成“我苹果你”,我心想,要是能写个Go语言的小工具,把这些视频的中文字幕扒下来,再重新整理翻译一遍,那该多爽?

说干就干,但你也知道,理想很丰满,现实嘛……咱慢慢聊。

西瓜视频的字幕到底藏哪儿了?

首先得搞清楚,西瓜视频的“365dni”视频,字幕文件到底长什么样,我翻了翻以前的老笔记,总结出三种情况:

字幕类型 存储方式 常见格式
内嵌字幕 直接压在视频画面里 没法单独提取
外挂字幕 同目录下的.srt或.vtt文件 文本可读
流式字幕 WebVTT通过HTTP实时拉取 需要抓包

“365dni”这个系列大多是外挂字幕,藏在视频的同一串CDN域名下,命名规则大概是“video_id_zh.srt”这种,用Go写个HTTP客户端,GET一下就能拿到原始文本。

用Go语言写个365dni西瓜视频中文字幕爬虫?这事儿我干过

手撸一个Go爬虫,从零开始

第一步:造个“土法”下载器

Go标准库里的net/http包足够用了,我写了个小函数:

func fetchSubtitle(url string) (string, error) {
    resp, err := http.Get(url)
    if err != nil {
        return "", fmt.Errorf("请求失败: %v", err)
    }
    defer resp.Body.Close()
    body, _ := io.ReadAll(resp.Body)
    return string(body), nil
}

别笑话我,刚开始就是这样粗暴。你得先能动,再谈优雅

第二步:解析那些乱七八糟的SRT字幕

西瓜视频的SRT文件格式很标准,但“365dni”的字幕时间戳经常有错乱,比如这句:

1
00:01:23,456 --> 00:01:26,789
I love you.
我爱你.

我原来想用正则硬解,结果被各种换行符坑得头晕,后来老老实实按行读取,分三段处理:

  1. 序号行
  2. 时间轴行(用strings.Split切出开始结束时间)
  3. 字幕文本行(可能有多行,直到空行结束)

bufio.Scanner逐行读,遇到空行就提交一个完整分片。别图省事用ioutil.ReadAll读完整个文件去正则匹配——50个视频的字幕文件加起来几百KB,单线程还好,量大了准卡死。

第三步:解决“中文字幕乱码”难题

“365dni”的部分早期视频字幕居然是GBK编码的,直接当UTF-8读,出来全是乱码,这时候Go的golang.org/x/text/encoding包就派上用场了:

import "golang.org/x/text/encoding/simplifiedchinese"
decoder := simplifiedchinese.GBK.NewDecoder()
utf8Bytes, _ := decoder.Bytes(rawBytes)

如果你不想引入额外包,也能用iconv命令行工具调用,但在Windows下还得装环境,太麻烦。我建议直接用go get拉这个官方子包,干净。

进阶玩法:“智能字幕清洗器”

原始字幕拿到手,你会发现“365dni”的视频字幕有三大毛病:

  1. 重复句:同一句话出现两三次,时间轴还挨着
  2. 错误断句:把一句话断成两半,显示时中间隔了半秒
  3. 机翻痕迹:What are you doing?”被翻成“什么你是做?”

我写了个去重逻辑,判断相邻两个字幕的编辑距离(Levenshtein距离),如果相似度超过85%且时间差小于1秒,就合并成一条,Go标准库里没有编辑距离算法,我就自己手写了个二维DP:

func LevenshteinDistance(a, b string) int {
    d := make([][]int, len(a)+1)
    for i := range d {
        d[i] = make([]int, len(b)+1)
        d[i][0] = i
    }
    for j := range d[0] {
        d[0][j] = j
    }
    for i := 1; i <= len(a); i++ {
        for j := 1; j <= len(b); j++ {
            cost := 1
            if a[i-1] == b[j-1] {
                cost = 0
            }
            d[i][j] = min(d[i-1][j]+1, d[i][j-1]+1, d[i-1][j-1]+cost)
        }
    }
    return d[len(a)][len(b)]
}

这函数效率一般,但对于短文本(字幕通常不超过100字符)完全够用。要是想跑几百个视频,建议改成动态规划但只保留两行空间

为什么选Go而不是Python?

我试过用Python的requests+pysrt库,写起来更短,但有两个痛点:

  • Python的并发模型(GIL)让多视频下载效率打折扣
  • 打包成exe给别人用,体积动不动就50MB,而Go编译出来就5MB左右

“365dni”这个系列我同时下20个视频的字幕,Go的goroutine配合sync.WaitGroup

var wg sync.WaitGroup
for _, url := range urls {
    wg.Add(1)
    go func(u string) {
        defer wg.Done()
        data, _ := fetchSubtitle(u)
        process(data)
    }(url)
}
wg.Wait()

速度肉眼可见地快,内存也很稳。

踩坑记录:西瓜视频的反爬和CDN

别高兴太早,抓了十几个视频后,突然开始返回403 Forbidden,原来西瓜视频的CDN有Referer检查,浏览器发请求时带了https://www.ixigua.com,我直接裸请求当然被拦。

解决办法很简单:伪装User-Agent和Referer,我甚至加了Cookie池,模拟登录态,但后来发现“365dni”的大部分视频是公开的,只做Referer检查就够了。

还有个坑——部分字幕文件的CDN链接有时效性,必须先用视频ID拼接出签名URL,这签名算法藏在西瓜视频的前端JS里,我用Go写了个小工具跑github.com/robertkrimen/otto这个JS引擎,在Go里直接执行解密函数。这招挺脏的,但有效

给字幕加上一点点“人情味”

我还做了个实验——把那些生硬的机翻结果,用Go调用百度翻译API或者微软翻译API重新翻一遍,每次请求之间加time.Sleep(500ms),免得触发限流,新翻译过来的中文句子流畅多了,“365dni”里那些意大利台词(Ti amo”)总算能正确显示成“我爱你”而不是“钛阿莫”。

不过这事儿得注意翻译API的配额,我免费版额度一天就200万字符,翻50个电影字幕刚好用光。

最终成果长什么样?

跑完整个流程后,本地会生成类似这样的文件结构:

/365dni_subtitles/
├── movie1_cleaned.srt
├── movie2_cleaned.srt
└── log.txt

每一条字幕都被清洗过,时间轴对齐,中英文对照,还去掉了那些恼人的“字幕君手滑”错误。你只需要在播放器里加载这个SRT文件,就能享受流畅的中文字幕体验

一些不算完美的尾声

说实话,这个工具到现在还有bug——比如有些视频的字幕文件乱码到连GBK都救不了,我猜可能是BIG5编码,还有特殊情况:如果视频内置了多条字幕流(一条中文一条英文),我还得手动指定选择哪条。但这些都不妨碍它解决“365dni”视频中文字幕90%的实际问题

你可能会问,为什么不直接用成熟的字幕下载工具?因为那些工具要么不支持西瓜视频自定义域名,要么解析逻辑过时了,写个Go爬虫最实在——你想改哪儿就改哪儿,全部在自己手里攥着,这种掌控感,就像大夏天喝第一口冰可乐那样,爽得实在。

要是你也遇到“365dni”的字幕问题,不妨自己动手试试,Go语言的编译快、部署简单,一个二进制文件扔到服务器上,跑就是了,唯一要注意的是:别太沉迷抓字幕,该看的视频还是要看

本文来自作者[kyadmin]投稿,不代表be365立场,如若转载,请注明出处:http://www.hljbesthome.com/fnagchan/1065.html

(5)

文章推荐

发表回复

本站作者才能评论

评论列表(4条)

  • kyadmin
    kyadmin 2026-07-02

    我是be365的签约作者“kyadmin”!

  • kyadmin
    kyadmin 2026-07-02

    希望本篇文章《用Go语言写个365dni西瓜视频中文字幕爬虫?这事儿我干过》能对你有所帮助!

  • kyadmin
    kyadmin 2026-07-02

    本站[be365]内容主要涵盖:be365,be365网站,be365网址,ball365体育,Be365排名

  • kyadmin
    kyadmin 2026-07-02

    本文概览:这事儿得从去年夏天说起,那天晚上我瘫在沙发上刷手机,翻到一个叫“365dni”的西瓜视频合集,点进去一看,好家伙,全是外文电影,字幕还是...

    联系我们

    工作时间:周一至周五,9:30-18:30,节假日休息

    关注我们