golang下载桌面壁纸

package main

import (
	"fmt"
	"io/ioutil"
	"net/http"
	"os"
	"regexp"
	"strings"
)

/*建立通道,用于限制*/
var ch chan int

/*图片下载,最大并发量*/
const MAX = 100

/*URL截止连接数*/
const MAXURL = 23000

func main(){
	url := ``
	restr := `<img[\s\S]*?src="(http[\s\S]+?)"`

	ch = make(chan int, MAX)	//下载图片,最大协程 MAX

	for i := 0; i <= MAXURL; i++{
		/*拼凑出网页的URL链接*/
		url = fmt.Sprintf("http://www.netbian.com/desk/%d-1920x1080.htm", i)

		/*获取html源码*/
		html := GetHtml(url)

		/*解析源码*/
		rt := RegexpParse(html, restr)

		/*遍历解析结果*/
		for _, data := range rt{
			ch<-0
			go DownFile(data[1], 100*1024, 10*1024*1024, `./DOWN`, "")
		}
		fmt.Println("当前进度:", i, "/", MAXURL, "占比:", i / MAXURL * 100, "%")
	}

	/*用于填充通道,来确保每个并发下载,都结束*/
	for i := 0; i < MAX; i++{
		ch<-0
	}
}

/*
* 判断文件(注意,是文件)是否存在
* path:文件的地址
* 返回值:true存在,false不存在
*/
func FileYESNO(path string) (bool) {
	_, err := os.Stat(path)
	if err != nil{
		return false
	}
	return true
}

/*
* 获取指定URL的网页源代码
* url:网页链接,string类型
* 返回值:网页的html代码,string类型
*/
func GetHtml(url string) (string) {
	resp, err := http.Get(url)
	if err != nil{
		return ""
	}
	defer resp.Body.Close()
	bytes, err := ioutil.ReadAll(resp.Body)
	if err != nil{
		return ""
	}
	return string(bytes)
}

/*
* 根据正则表达式,解析指定html代码。
* html:网页源码
* restr:正则表达式
* 返回值:正则搜索的结果,[][]string类型
*/
func RegexpParse(html string, restr string) ([][]string) {
	compile, e := regexp.Compile(restr)
	if e != nil{
		fmt.Println("正则表达式错误:", e)
		return nil
	}
	submatch := compile.FindAllStringSubmatch(html, -1)
	return submatch
}

/*
* 下载资源文件
* url:资源文件的URL链接
* minsize:要下载的资源文件,最小大小。单位字节。
* maxsize:要下载的资源文件,最大大小。单位字节。
* filepath:指定要下载的位置,为空,将会默认下载到当前目录下
* filename:指定要生成的文件名,为空,将会根据资源文件url文件名来命名
* 返回值:是否下载成功,true成功,false失败。
*/
func DownFile(url string, minsize int, maxsize int, filepath string, filename string) (bool) {
	defer func() {
		<-ch
	}()
	if filepath == ""{
		filepath = "./"
	}else if strings.HasSuffix(filepath, "/")||strings.HasSuffix(filepath, "\\"){
		_ = os.MkdirAll(filepath, 0666)
	}else{
		filepath += "/"
		_ = os.MkdirAll(filepath, 0666)
	}
	if filename == ""{
		split := strings.Split(url, "/")
		filename = split[len(split) - 1]
	}
	if FileYESNO(filepath+filename){
		/*文件已存在,那就无需再下载了。*/
		return true
	}
	resp, err := http.Get(url)
	if err != nil{
		return false
	}
	defer resp.Body.Close()
	bytes, err := ioutil.ReadAll(resp.Body)
	if err != nil{
		return false
	}
	if len(bytes) > maxsize || len(bytes) < minsize{
		fmt.Println("超出文件限制", minsize, "-", maxsize, ",当前大小:", len(bytes), "\t", "URL=", url)
		return false
	}
	
	err = ioutil.WriteFile(filepath+filename, bytes, 0666)
	if err != nil{
		fmt.Println("文件下载失败:", err, "URL=", url)
		return false
	}else{
		fmt.Println("文件下载成功:", filepath+filename, "URL=", url)
		return true
	}
}
发布了155 篇原创文章 · 获赞 57 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/weixin_43764814/article/details/103113035