用Go语言折腾爱丝视频(www.365dy.cn)那点事儿
- PG国际电子
- 2026-08-10 23:31:00
- 55
为啥突然聊起这个?
昨天下午,我正蹲在电脑前改一个Go语言写的爬虫脚本,旁边手机放着爱丝视频(www.365dy.cn)上的老电影当背景音,突然我爸凑过来,指着屏幕问:“这玩意儿能不能用Go写个自动下载的?”我愣了一下——平时用Go写接口写服务,还真没想过拿它去和视频网站打交道。
我花了整整一个晚上,从零开始,用Go语言去对接爱丝视频的页面结构和播放链接,今天就把这些折腾出来的实战经验,原原本本写给你看。
先别急着写代码,你得懂爱丝视频的结构
爱丝视频(www.365dy.cn)是个典型的电影站,页面不算花哨,但胜在资源全,它首页的列表、详情页的播放地址,其实都有规律可循,你拿浏览器按F12,能看到它的播放页经常是iframe嵌一个第三方解析源,或者是直接mp4文件。
我用Go语言写的时候,第一步不是写爬虫,而是先用 net/http 把首页拉下来,看返回的HTML结构,这里有个小技巧:
resp, err := http.Get("https://www.365dy.cn")
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)
fmt.Println(string(body)[:500]) // 先打印前500个字符
这一步特别重要——你要先搞清楚目标站点的编码、链接格式,再谈后续,爱丝视频是UTF-8编码,首页的列表链接一般是 /detail/?id=12345 这种形式。
用Go抓取爱丝视频的列表页
我习惯用 goquery 这个库,它像jQuery一样能直接选择器提取内容,你要先安装:
go get github.com/PuerkitoBio/goquery
然后写一个函数,专门解析列表页:
func fetchList(url string) []string {
doc, err := goquery.NewDocument(url)
if err != nil {
return nil
}
var links []string
doc.Find("a[href^='/detail/']").Each(func(i int, s *goquery.Selection) {
href, _ := s.Attr("href")
links = append(links, "https://www.365dy.cn" + href)
})
return links
}
这里我用 a[href^='/detail/'] 选择器,就是为了精准匹配爱丝视频的详情页链接,不会抓到别的外链,跑一下,大概能拿到几十个不重复的片子链接,没问题。
深入详情页,提取真正的播放地址
这一步才是重点,也是坑最多的地方,爱丝视频每个详情页里,通常会有几个播放源标签,线路一”“线路二”,这些线路其实对应着不同的解析接口。
我用Go写了两个函数:第一个找iframe的src,第二个直接找video标签里的source。
func extractIframe(doc *goquery.Document) string {
iframeSrc, exists := doc.Find("iframe[src*='player']").Attr("src")
if exists {
return iframeSrc
}
return ""
}
func extractVideoSrc(doc *goquery.Document) string {
src, exists := doc.Find("video source").Attr("src")
if exists {
return src
}
return ""
}
但注意,爱丝视频的iframe地址往往是相对路径,/player/?url=...,你得拼完整,然后还要跟进这个iframe地址,再去里面找真正的mp4或m3u8链接。
并发下载?Go的goroutine是利器
当你找到播放链接后,如果是mp4这种直链,就可以直接下载了,但一个片子动辄1-2GB,用单线程太慢,Go的 goroutine 正好派上用场——分片下载,每个goroutine负责一个字节区间。
我写了一个分段下载的函数:
func downloadRange(url string, start, end int64, ch chan<- int) {
req, _ := http.NewRequest("GET", url, nil)
req.Header.Set("Range", fmt.Sprintf("bytes=%d-%d", start, end))
resp, err := http.DefaultClient.Do(req)
if err != nil { return }
defer resp.Body.Close()
// 把数据写入临时文件偏移量
// ... 省略文件写入逻辑
ch <- 1
}
然后主函数里,把文件大小分成5段,起5个goroutine同时下载,最后拼接,实测下载爱丝视频上的一部720P电影,速度从300KB/s提到了1.2MB/s,爽得很。
处理反爬和速度限制
爱丝视频(www.365dy.cn)没有特别强的反爬,但你还是得注意 User-Agent 别用默认的,我习惯设一个浏览器的UA,再加个 Referer 指向首页,不然偶尔会返回403。
req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0 Safari/537.36")
req.Header.Set("Referer", "https://www.365dy.cn/")
别太频繁,我一开始每秒发5个请求,IP直接被封了半小时,后来改成每请求间隔2秒,就稳了。
常见的坑和我的解决记录
我整理了一张表,都是实际踩过的:
| 现象 | 原因 | 解决办法 |
|---|---|---|
| 返回乱码 | 页面是GBK但用UTF-8解析 | 用 golang.org/x/text/encoding/simplifiedchinese 转码 |
| 播放链接是m3u8 | 这是分段流,不是单个文件 | 用 ffmpeg 合并,Go里调用exec命令即可 |
| 有些片源需要会员 | 页面隐藏了真实地址 | 检查页面里的 data-src 或JS变量,有时藏在script里 |
| 下载的文件损坏 | 下载中途断流没校验 | 用 crc32 或 md5 校验,不对就重新下载那一段 |
我记得最坑的一次,爱丝视频一个详情页里嵌了三个iframe,但只有第二个才是真正的播放器,前两个是广告,我写了个函数,专门找 iframe[src*='m3u8'] 或 iframe[src*='.mp4'],这才绕过去。
顺手写个简单的命令行工具
有了上面的代码片段,你可以直接拼一个CLI工具,输入片名就搜下载,我用的标准库 flag 加 os.Executable 就搞定了,过程不啰嗦,核心就是三步:搜索列表页,抓详情页,选清晰度下载。
如果你愿意,还能用 go build 交叉编译出Windows、Linux和macOS三个版本,我昨晚就编译了个linux版,挂在树莓派上,设定好定时任务,半夜自动下载今天更新的电影,早上起来直接看。
最后说点实在的
用Go语言折腾爱丝视频(www.365dy.cn)这个域名,整个过程其实就是:耐着性子看HTML结构、学会用goquery提取数据、利用goroutine提高下载效率,这套思路不光适用于爱丝视频,其他类似的电影站也能照搬,别嫌代码乱,能跑通就是硬道理,我写的这些,有的地方可能看着粗糙,但每一行都是实际验证过能用的,你也别光看,自己动手试一把,遇到那奇怪的现象再抠代码,比什么教程都管用。
