暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Golang简单实现批量下载文件

运维DevOps 2023-07-31
89

本脚本中通过Golang与wget配置来实现文件的批量下载

下载流程:

  • 首先读取本地的url.txt文件,将其中的url数据读取出来,并追加到切片中

  • 接下来调用函数checkurl来检查这些url中哪些可以下载,哪些不能下载,并将不能下载的单独封装到一个切片中

  • 在原始的url数据中,找到上面封装的不能下载的url,并将这些url删除,从而获取可以正常下载的url

  • 最后调用downurl,来下载文件

注意:有些url在国内是访问不了的,因此会提示无法到达,如果用境外服务器来访问其实又可以下载

1、脚本wget.go内容如下:

    package main


    import (
    "bufio"
    "fmt"
    "io"
    "log"
    "os"
    "os/exec"
    "strings"
    )


    func main() {
    //打开本地url文件,获取url数据
    file, err := os.Open("url.txt")
    if err != nil {
    log.Fatal(err)
    }
      //创建一个缓存读取对象
    rd := bufio.NewReader(file)
    var urlSlice []string
    for {
        //逐行读取数据并追加到切片urlSlice中
    by, _, errs := rd.ReadLine()
    if string(by) != "" {
    urlSlice = append(urlSlice, string(by))
    }
    if errs == io.EOF {
    break
    }
    }
      //检查url是否可以访问,如果不可达是不能下载的,此处是以切片形式封装
    errURL := checkurl(urlSlice)
      //将不可达的url从源切片中删除
    okURL := deleteSlice(urlSlice, errURL)
    if len(okURL) != 0 {
      //删除了异常的url后如果源切片中还有正常的url则执行下载
    downpath, err := downurl(okURL)
    if err != nil {
    log.Fatal(err)
    }
    fmt.Printf("文件已下载完成,存储路径为:%s\n", downpath)
      }
    fmt.Printf("无法下载的URL地址为:%v\n", errURL)
    }
    //此函数主要功能就是检查url是否正常
    func checkurl(urls []string) []string {
    var errURL []string
      for _, urlValue := range urls {
      //执行wget命令检测url是否正常,如果异常后面的err中会有exit status提示
    cmd := exec.Command("wget", "--spider", "--timeout=5", "--tries=1", urlValue)
    _, err := cmd.CombinedOutput()
    if err != nil {
        //如果err中有exit,说明此url异常,将异常的url添加到errURL中
    if strings.Contains(err.Error(), "exit") {
    errURL = append(errURL, urlValue)
    }
    }
    }
    return errURL
    }


    //下载url
    func downurl(url []string) (string, error) {
    //文件下载路径,可自定义
    downpath := "/root/test"
    for _, v := range url {
    cmd := exec.Command("wget", "-c", "-P", fmt.Sprintf("%s", downpath), v)
    stdout, _ := cmd.StdoutPipe()
    stderr, _ := cmd.StderrPipe()
    go func() {
    io.Copy(os.Stdout, stdout)
    }()
    go func() {
    io.Copy(os.Stderr, stderr)
    }()
    err := cmd.Start()
    if err != nil {
    return "", err
    }
    err = cmd.Wait()
    if err != nil {
    return "", err
    }
    }
    return downpath, nil
    }


    //删除切片url中异常的url
    func deleteSlice(url, delslice []string) []string {
    //从url切片中删除delslice切片中的元素,因此需要借助map
    m := make(map[string]bool)
    var res []string
      //先遍历url,判断map中是否有此元素,如果没有就添加
    for _, v := range url {
    if !m[v] {
    m[v] = true
    }
    }
      //遍历delslice,通过map的delete函数删除元素
    for _, v1 := range delslice {
    delete(m, v1)
    }
    for k, _ := range m {
    res = append(res, k)
    }
    return res
    }

    2、在脚本同级目录下定义url.txt文件,内容如下:

    上图中最后一个url是自定义的网络不可达的url

    3、下面运行脚本,看下效果,如图:

    脚本执行后会显示下载过程,下载进度,并在最后提示下载后的路径在哪里以及哪个url不能下载

    验证无问题后即可通过如下命令将脚本制作成二进制文件了

      go build wget.go

      注意:有些url并不一定真的是不能下载,可能是被墙给挡住了,破解此法就是将此脚本放在墙外面运行,有其他任何问题可与我联系

      文章转载自运维DevOps,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

      评论