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
}
分类:
go语言学习
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)