码迷,mamicode.com
首页 > Web开发 > 详细

golang 根据基础的url下载静态服务器上所有的文件

时间:2019-09-06 01:40:45      阅读:361      评论:0      收藏:0      [点我收藏+]

标签:Golan   std   error   lse   contain   nil   运用   sep   date   

功能

  • 根据静态服务器上基础的url,获取所有的文件

运用到的知识点

  • 日志处理
    • 能在控制台打印,又能写入文件
  • 向服务端发送get请求
    • http.Get(url)
  • 递归获取文件夹和创建文件夹
package main



import (

?    "fmt"

?    "io"

?    "io/ioutil"

?    "log"

?    "net/http"

?    "os"

?    "regexp"

?    "strings"

?    "time"

)



var (

?    baseurl = "基础url"  

?    basePath = "D:\\staticFile"  //本地地址

?    logger *log.Logger

)



func init(){

?    fmt.Println("创建日记录日志文件")

?    f,err:=os.OpenFile("Log.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 666)

?    if err!=nil{

?        log.Fatal("os.OpenFile err",err)

?    }

?    writers := []io.Writer{

?        f,

?        os.Stdout}

?    //defer f.Close()  因为这里,就已经将文件关闭了,看来不能够随便使用defer

?    fileAndStdoutWriter := io.MultiWriter(writers...)

?    logger = log.New(fileAndStdoutWriter, "", log.Ldate|log.Ltime|log.Lshortfile)

?    logger.Println("---> logger:check to make sure is works")

}



func main(){

?    logger.Println("开始计算时间")

?    t1:=time.Now()

?    HandleFile(baseurl)

?    t2:=time.Now()

?    logger.Println("下载所有的文件总耗时:",t2.Sub(t1))

}



//遍历指定路径下的所有文件,filepath.Walk("路径",walkFunc)

func walkFunc(path string,info os.FileInfo,err error)error{

?    fmt.Println(path)

?    return nil

}



//处理文件信息

func HandleFile(url string)error{

?    if url==""{

?        err:=fmt.Errorf("url是空的")

?        logger.Println(err)

?        return err

?    }

?    logger.Println("发起get请求")

?    htmlData,err:= HttpGet(url)

?    if htmlData==""{

?        err:=fmt.Errorf("HttpGet中有错啦,请检查HttpGet数据")

?        logger.Println(err)

?        return err

?    }

?    if err!=nil{

?        logger.Println(err)

?        return err

?    }

?    cutUrl := strings.Split(url,"基础url")[1]

?    logger.Println("正则匹配信息")

?    re:=regexp.MustCompile(<a href="(.*?)">(.*?)</a>)

?    result := re.FindAllStringSubmatch(htmlData,-1)

?    if result==nil{

?        err:=fmt.Errorf("正则匹配的数据为空")

?        logger.Println(err)

?        return err

?    }

?    logger.Println("正则匹配数据")

?    for i:=0;i<len(result);i++{

?        publicPath := cutUrl

?        if len(result[i])!=3{

?            err:=fmt.Errorf("正则出来的东西不是我想要的")

?            logger.Println(err)

?            return err

?        }

?        fmt.Println(result[i][2])

?        if strings.Contains(result[i][2],"/"){

?            logger.Println(result[i][2]+"是个文件夹")

?            floderName:=strings.Replace(result[i][2],"/","",-1)

?            if floderName!=result[i][2]{

?                publicPath = publicPath+"/"+floderName

?                fmt.Println("publicPath=============>",publicPath)

?                logger.Println("创建文件夹")

?                err=CreateFloder(publicPath)

?                if err!=nil{

?                    logger.Println("CreateFloder error",err)

?                    return err

?                }

?                urlPath := baseurl+publicPath+"/"

?                fmt.Println("urlPath============>",urlPath)

?                logger.Println("递归")

?                HandleFile(urlPath)

?            }

?        }else{

?            publicPath = publicPath+result[i][2]

?            logger.Println("遇到是文件,就将数据写入文件")

?            err:=WriteFile(publicPath)

?            if err!=nil{

?                logger.Println(err)

?                return err

?            }

?        }

?    }

?    return nil

}



//发起get请求

func HttpGet(url string)(string,error){

?    if url==""{

?        err:= fmt.Errorf("传入的url为空")

?        logger.Println(err)

?        return "",err

?    }

?    if !strings.Contains(url,"http:"){

?        err:=fmt.Errorf("传入的url不正确")

?        logger.Println(err)

?        return "",err

?    }

?    resp,err:=http.Get(url)

?    if err!=nil{

?        err1:= fmt.Errorf("http.Get error===========>%v",err)

?        logger.Println(err1)

?        return "",err1

?    }

?    defer resp.Body.Close()

?    body,err := ioutil.ReadAll(resp.Body)

?    if err!=nil{

?        err1:=fmt.Errorf("ioutil.ReadAll error===========>%v",err)

?        logger.Println(err1)

?        return "",err1

?    }

?    if strings.Contains(string(body),"404 page not found"){

?        err:=fmt.Errorf("找不到该网页")

?        logger.Println(err)

?        return "",err

?    }

?    return string(body),nil

}



//判断文件是否存在

func IsExist(path string)(bool){

?    if path==""{

?        return false

?    }

?    _,err:=os.Stat(path)

?    if err!=nil{

?        if os.IsExist(err){

?            return true

?        }else{

?            return false

?        }

?    }

?    return true

}



//创建文件夹

func CreateFloder(publicPath string)(error){

?    if publicPath==""{

?        err:=fmt.Errorf("传入urlpath的地址空")

?        logger.Println(err)

?        return err

?    }

?    logger.Println(publicPath,"创建文件夹")

?    err:=os.MkdirAll(basePath+"//"+publicPath,os.ModePerm)

?    if err!=nil{

?        err:=fmt.Errorf("创建文件错误啦:%v",err)

?        logger.Println(err)

?        return err

?    }

?    return nil

}



//写入文件

func WriteFile(publicPath string)error{

?    if publicPath==""{

?        err:=fmt.Errorf("传入的参数为空,请注意!!!")

?        logger.Println(err)

?        return err

?    }

?    htmlData,err:=HttpGet(baseurl+publicPath)

?    if htmlData==""{

?        err:=fmt.Errorf("HttpGet中有错啦,请检查HttpGet数据")

?        logger.Println(err)

?        return err

?    }

?    if err!=nil{

?        logger.Println(err)

?        return err

?    }

?    file,err:=os.Create(basePath+publicPath)

?    defer file.Close()

?    if err!=nil{

?        err:=fmt.Errorf("os.Open失败,err=%v",err)

?        logger.Println(err)

?        return err

?    }

?    if file==nil{

?        err:=fmt.Errorf("创建文件失败")

?        logger.Println(err)

?        return err

?    }

?    file.WriteString(htmlData)

?    return nil

}

golang 根据基础的url下载静态服务器上所有的文件

标签:Golan   std   error   lse   contain   nil   运用   sep   date   

原文地址:https://www.cnblogs.com/MyUniverse/p/11470434.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!