使用工具:golang
ffmpeg.exe
一.得到u3m8链接
我这里的的情况是u3m8藏到了irame 一共爬了两次
(建议自己先看看要爬的网站F12看元素u3m8在哪)

如果直接拉去的话
会发现少了一大段资源而我们的u3m8就在里面

如果不是这种情况 一次chrome就行了(chrome主要是要爬需要动态加载的前端元素 有些元素如果你直接爬 会加载不出来)
代码呈上
package main
import (
"context"
"log"
"regexp"
"time"
"github.com/chromedp/chromedp"
)
func main() {
url := "你要爬的url"
m3u8URL, err := extractM3U8URL(url)
if err != nil {
log.Fatalf("Error extracting m3u8 URL: %v", err)
}
if m3u8URL != "" {
log.Printf("Found m3u8 URL: %s", m3u8URL)
} else {
log.Println("No m3u8 URL found.")
}
}
func extractM3U8URL(url string) (string, error) {
// 创建一个新的浏览器上下文
ctx, cancel := chromedp.NewContext(context.Background())
defer cancel()
// 创建一个超时上下文,以免过长时间等待
ctx, cancel = context.WithTimeout(ctx, 30*time.Second)
defer cancel()
var iframeSrc string
err := chromedp.Run(ctx,
chromedp.Navigate(url),
chromedp.AttributeValue(`iframe.single-video`, "src", &iframeSrc, nil),
)
if err != nil {
return "", err
}
// 拼接完整的 iframe 源地址
iframeURL := "https:" + iframeSrc // 根据实际情况调整
// 访问 iframe 源地址
var htmlContent string
err = chromedp.Run(ctx,
chromedp.Navigate(iframeURL),
chromedp.WaitReady("body"), // 等待 body 标签加载完成
chromedp.OuterHTML("html", &htmlContent),
)
if err != nil {
return "", err
}
// 使用正则表达式查找 M3U8 URL
re := regexp.MustCompile(`"source":\s*"(https?://.*?\.m3u8[^"]*)`)
matches := re.FindStringSubmatch(htmlContent)
if len(matches) > 1 {
return matches[1], nil // 返回找到的第一个 m3u8 URL
}
return "", nil // 如果没有找到,返回空字符串和 nil 错误
}
如果要获得iframe的资源必须再访问iframe,所以在代码里面又做了一次 访问拼接处iframe地址 访问才能得到隐藏的iframe内容
二.用ffmpeg.exe下载视频
package main
import (
"fmt"
"os"
"os/exec"
)
func main() {
// 设置输入的 m3u8 URL 和输出的 mp4 文件名
m3u8URL := "你刚刚爬到的url"
outputFile := "output.mp4"
ffmpegPath := "C:\\Users\\admin\\Desktop\\ffmpeg.exe"
// 创建 ffmpeg 命令
cmd := exec.Command(ffmpegPath, "-i", m3u8URL, "-c", "copy", outputFile)
// 运行命令并捕获输出
output, err := cmd.CombinedOutput()
if err != nil {
fmt.Printf("Error executing ffmpeg: %v\n", err)
fmt.Println(string(output))
return
}
// 确保视频文件存在且完整
if _, err := os.Stat(outputFile); os.IsNotExist(err) {
fmt.Printf("Output file %s does not exist.\n", outputFile)
} else {
fmt.Printf("Video has been downloaded successfully to %s\n", outputFile)
}
}
参考文章:Go语言与chromedp结合:实现Instagram视频抓取的完整流程 - 知乎 (zhihu.com)
4234

被折叠的 条评论
为什么被折叠?



