如何用golang语言下载未加密的u3m8网站视频

使用工具:golang

ffmpeg.exe

 

一.得到u3m8链接

 

我这里的的情况是u3m8藏到了irame 一共爬了两次

(建议自己先看看要爬的网站F12看元素u3m8在哪)

 e91718372e7442fbb00013fe25f302d1.png

 

如果直接拉去的话

会发现少了一大段资源而我们的u3m8就在里面 

592b31b57ade4d5ba1f558714805ddf9.png

 

如果不是这种情况 一次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)

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值