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
}
}
golang下载桌面壁纸
猜你喜欢
转载自blog.csdn.net/weixin_43764814/article/details/103113035
今日推荐
周排行