go语言抓取文件中整个URL(可递归目录)


可递归

package Createfile

import (
    "fmt"
    "log"
    "os"
    "os/exec"
    "sync"
    "time"
)

var create sync.Once

func createdir()  {
    cmd := exec.Command("mkdir","OutPut")
    if _,cmderr := cmd.CombinedOutput();cmderr !=nil{
        log.Println(cmderr)
    }
}

func CreateFile() *os.File {
    create.Do(func() {
        f,err := os.Stat("OutPut")
        if !os.IsExist(err){
            createdir()
        }
        if f.IsDir(){
            log.Println("OutPut目录已经存在")
        }
        createdir()
    })

    osfile,err := os.OpenFile("OutPut/geturl" + fmt.Sprintf("-%d%d%d%d%d%d.log",
        time.Now().Year(),
        time.Now().Month(),
        time.Now().Day(),
        time.Now().Hour(),
        time.Now().Minute(),
        time.Now().Second(),
    ),os.O_CREATE|os.O_WRONLY|os.O_APPEND,0644)
    if err != nil{
        log.Println(err)
    }
    return osfile
}
package Readfile

import (
    "io/ioutil"
    "log"
)

func ReadFile(filename string) []byte {
    filebyte,fileerr := ioutil.ReadFile(filename)
    if fileerr != nil {
        log.Println(fileerr)
    }
    return filebyte
}
package Treelist

import (
    "fmt"
    "io/ioutil"
    "path"
)

var FileSlice []string

func Recursion(dir string) {

    files, errRead := ioutil.ReadDir(dir)
    if errRead != nil {
        fmt.Println(errRead)
    }
    for _, file := range files {
        if file.IsDir() {
            filename := file.Name()
            path := dir + filename + "/"
            Recursion(path)
        }else {
            filename := path.Base(file.Name())
            pwd := dir + filename
            FileSlice = append(FileSlice, pwd)
        }
    }
}
package UrlGet

import (
    "fmt"
    "littletools/GetUrl/Createfile"
    . "littletools/GetUrl/Readfile"
    "log"
    "mvdan.cc/xurls/v2"
    "regexp"
)

func UrlGet(filename string) {
    file := Createfile.CreateFile()
    defer file.Close()
    arraybyte := xurls.Relaxed().FindAll(ReadFile(filename), -1)
    for k, v := range arraybyte {
        if match,err := regexp.MatchString(`^(https://){1}|^(http://){1}`,string(v));match{
            if err!=nil{
                log.Println(err)
            }
            if matchgov,errgov := regexp.MatchString(`(匹配不要的正则){1}`,string(v));matchgov{
                if errgov != nil{
                    log.Println(errgov)
                }
                continue
            }
            file.WriteString(fmt.Sprintf(" %s %d %s\n",filename, k, v))
        }
    }
}
package main

import (
    "fmt"
    "littletools/GetUrl/Treelist"
    "littletools/GetUrl/UrlGet"
    "os"
    "sync"
)

var wg sync.WaitGroup

//给写入文件加锁,不然会发生并发不安全
var lock sync.Mutex

func main()  {

    if arg_num := len(os.Args[1:]);arg_num < 1{
        fmt.Println("Waring:请输入路径的名称")
        return
    }
    for _, v := range os.Args[1:] {
        dir := v + "/"
        Treelist.Recursion(dir)
    }
    for _, v := range Treelist.FileSlice {
        wg.Add(1)
        go func(filepath string) {
            lock.Lock()
            defer wg.Done()
            defer lock.Unlock()
            UrlGet.UrlGet(filepath)
        }(v)
    }
    wg.Wait()
}

测试目录结构

删除正则二次筛选结果会包含不要的正则部分

加上二次筛选结果不会包含不要的正则部分

纯个人手写思维,转载请注明出处,感谢。