事情是这样的,前几天我想在百度网盘里存的那堆《365dni》系列电影里找个片段,结果翻来覆去找不到,你知道百度网盘那个搜索功能,有时候真能把人气笑——明明文件名就在那儿,它愣是搜不出来,后来我干脆下了个想法:用Golang写个小爬虫,把这些视频文件信息抓到本地,然后自己在本地用关键词搜,比如搜“365dni”或者“西瓜视频”这类标签,总比在网盘里强。
你要是也遇到过类似问题,那咱俩算是一类人了,这篇文章就是我从头到尾折腾这个事儿的记录,可能会有一些代码片段,但重点是思路和踩过的坑,我保证不写成技术文档,就当我跟你唠嗑。
为什么要用Golang干这事儿?
说实话,用Python写爬虫多省事儿啊,requests库一装,BeautifulSoup一上,分分钟搞定,但问题来了——我电脑上那堆百度网盘文件,动不动就是几十G的《365dni》高清版,Python处理起来那个内存占用,啧啧,而且我后续想加个功能,让程序能自动识别文件名里的关键词,365dni”、“西瓜视频下载”之类的,做成一个本地索引——这时候Golang的并发优势就出来了。
Golang的几个点特别适合这类场景:

- 并发处理:同时抓取多个文件夹信息,不会卡死
- 编译成单文件:扔到服务器上不用装环境
- 内存控制:处理大文件列表时不会崩
我一开始也没想这么多,就是觉得好玩,结果越写越上头,最后搞出来一个小工具,能把百度网盘里跟“365dni”相关的文件全筛出来,还能根据“西瓜视频”这种来源标签做分类。
第一步:搞定百度网盘的API
百度网盘官方是有API的,但那个文档写得……怎么说呢,像是程序员喝多了写的,我翻了半天,终于找到了文件列表的接口,核心就一个请求:
// 这代码我简化了,但意思到了
func getFileList(path string) ([]FileInfo, error) {
url := "https://pan.baidu.com/rest/2.0/xpan/file?method=list"
// 参数里塞上access_token和路径
// 返回的JSON里就有文件列表
}
注意啊,这里有个坑:百度网盘的API对单个文件夹的请求,一次最多返回200个文件,你要是像我一样,一个“365dni”文件夹里塞了上千个文件,那就得写个循环,用start参数翻页。
我当时写完了测试,发现程序卡住了——你猜怎么着? 我忘了处理access_token过期的问题,百度网盘的token有效期就几个小时,写代码的时候没考虑这个,结果跑了一个多小时,token过期,所有请求全挂了,后来加了个token刷新逻辑,才搞定。
第二步:本地建立索引
文件信息拿到手了,接下来就是建立索引,我把每个文件的信息存成了一个结构体:
type FileItem struct {
FileName string // 文件名,365dni.S01E01.西瓜视频.mp4”
Path string // 在网盘里的路径
Size int64 // 文件大小
CreateTime int64 // 创建时间
Source string // 来源,我手动打标签用的
}
然后我用了个 关键词匹配 的逻辑,把文件名里包含“365dni”的挑出来,再根据“西瓜视频”这种词判断来源。这一步其实挺笨的,但架不住好用,我甚至加了点正则,能识别“S01E01”这种剧集编号,然后自动归类。
第三步:用西瓜视频做个对比测试
说到这儿,我想起来个事,其实西瓜视频上也有《365dni》的剪辑片段,但跟百度网盘里那些完整版比起来,质量差太多了,我用程序跑了一下,发现我网盘里存的那些“365dni”文件,有80%文件名里都带了“西瓜视频”或者“xigua”字样——估计是当初从西瓜视频上扒下来的。
然后我索性写了个对比功能:
| 来源 | 文件数量 | 总大小 | 平均时长(估计值) |
|---|---|---|---|
| 百度网盘直接上传 | 12个 | 3GB | 约45分钟/个 |
| 标记为“西瓜视频” | 89个 | 1GB | 约5分钟/个 |
看到没?西瓜视频上扒下来的那些,单个文件特别小,明显是剪辑片段,而百度网盘里自己上传的,才是完整版,这个数据一出来,我就知道自己该删哪些文件了——那些西瓜视频的小片段,留着占地方。
踩过的坑(必须得说)
坑1:百度网盘的限流
写Golang程序的时候,我一开始没加请求间隔,结果跑了不到500个请求,百度网盘直接给我返回了“too many requests”,后来加了个time.Sleep(500 * time.Millisecond),才算稳了。你要是也写类似的工具,记得加限流,不然分分钟被封。
坑2:文件名编码问题
百度网盘返回的文件名,有时候是GBK编码,有时候是UTF-8,我一开始没处理,结果程序里搜索“365dni”,有些文件死活搜不到,后来统一转成UTF-8,才解决,Golang里用golang.org/x/text/encoding这个包就行。
坑3:西瓜视频的标签不统一
有些文件叫“西瓜视频_365dni_01.mp4”,有些叫“365dni(来自西瓜视频).mp4”,还有些干脆就叫“无标题.mp4”,我后来写了个模糊匹配,只要文件名包含“西瓜”、“xigua”、“365dni”这几个关键词,就都捞出来,再手动标记。这个逻辑挺糙的,但管用。
最后的效果
折腾了两天,程序终于跑起来了,我把百度网盘里所有的“365dni”相关文件都揪了出来,然后用西瓜视频的标签做了一个分类,现在我在本地就能搜到哪个文件在哪个文件夹,再也不用去百度网盘那个搜索框里碰运气了。
事情没完。 我发现有些文件明明是同一个片段,却存了三个不同版本——一个来自百度网盘自动备份,一个来自西瓜视频下载,还有一个是从别人那转存的,用Golang写了个去重逻辑,把MD5一样的文件标记出来,然后手动删掉。这个功能其实更有用,一下子省了十几个G的空间。
一点小感悟
写这个工具的时候,我其实没想着要写出多完美的代码,就是觉得百度网盘的搜索太难用了,西瓜视频上的片段又乱,想自己做个整合,用Golang写,纯粹是因为想练练这门语言。结果写完发现,Golang在文件处理方面确实顺手,尤其是并发抓取和本地索引那一块,比Python快不少。
你要是也玩《365dni》或者其他剧集,存了一堆文件在百度网盘里,又觉得西瓜视频上的剪辑太碎片化,完全可以自己写个小工具整理一下,不一定非要用Golang,Python也行,甚至写个批处理脚本都能干。关键是思路——先拿数据,再建索引,然后去重分类。
我现在还加了个功能,每天定时扫描百度网盘,看看有没有新的“365dni”文件进来,有的话自动更新本地索引。这个小工具已经跑了半个月了,没崩过——除了有一次token又过期了,我忘了处理。
行了,就说这么多吧,你要是也折腾这玩意儿,遇到问题可以照着这个思路走,代码不一定多漂亮,但能用就行,毕竟,咱又不是去面试,对吧?
本文来自作者[kyadmin]投稿,不代表be365立场,如若转载,请注明出处:http://www.hljbesthome.com/fnagchan/921.html
评论列表(4条)
我是be365的签约作者“kyadmin”!
希望本篇文章《365dni、百度网盘和西瓜视频,我用Golang写了个小工具,结果把自己整不会了》能对你有所帮助!
本站[be365]内容主要涵盖:be365,be365网站,be365网址,ball365体育,Be365排名
本文概览:事情是这样的,前几天我想在百度网盘里存的那堆《365dni》系列电影里找个片段,结果翻来覆去找不到,你知道百度网盘那个搜索功能,有时候真...