zoukankan      html  css  js  c++  java
  • golang 根据基础的url下载静态服务器上所有的文件

    功能

    • 根据静态服务器上基础的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
    
    }
    
    
    
  • 相关阅读:
    java.lang.NoSuchMethodError:antlr.collections.AST.getLine() I
    T7 java Web day01 标签HTML
    T6 s1 day19
    T5 s5 Day18
    T5 s4 Day 17
    T5 s3 day16
    T5 s2 Day 15
    T5 s1 day14
    T4 S03 day 12
    T4 S01 day1
  • 原文地址:https://www.cnblogs.com/MyUniverse/p/11470434.html
Copyright © 2011-2022 走看看