本脚本中通过Golang与wget配置来实现文件的批量下载
下载流程:
首先读取本地的url.txt文件,将其中的url数据读取出来,并追加到切片中
接下来调用函数checkurl来检查这些url中哪些可以下载,哪些不能下载,并将不能下载的单独封装到一个切片中
在原始的url数据中,找到上面封装的不能下载的url,并将这些url删除,从而获取可以正常下载的url
最后调用downurl,来下载文件
注意:有些url在国内是访问不了的,因此会提示无法到达,如果用境外服务器来访问其实又可以下载
1、脚本wget.go内容如下:
package mainimport ("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 []stringfor {//逐行读取数据并追加到切片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 []stringfor _, 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}//下载urlfunc 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中异常的urlfunc deleteSlice(url, delslice []string) []string {//从url切片中删除delslice切片中的元素,因此需要借助mapm := 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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




