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://)|^(http://) `,string(v));match{             if err!=nil{                 log.Println(err)             }             if matchgov,errgov := regexp.MatchString(`(www.gov.cn)$`,string(v));matchgov{                 if errgov != nil{                     log.Println(errgov)                 }                 continue             }             file.WriteString(fmt.Sprintf(" %s %d %sn",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() }

 

测试目录结构

 

 

 

删除正则二次筛选结果

 

 

加上二次筛选结果

 

 

 

 

 

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

推荐这些文章:

《go语言圣经》练习答案--1.5. 获取URL

练习 1.7: 函数调用io.Copy(dst, src)会从src中读取内容,并将读到的结果写入到dst中,使用这个函数替代掉例子中的ioutil.ReadAll来拷贝响应结构体到os.Stdout,避免申请一个缓冲区(例子中的b)来存储。记得处理io.Copy返回结果中的错误。
package main

import (
"fmt"
"io"
"net/http"
"os"
)

func main() {
for _, url := range os.Args[1:] {
resp, err := http.Get(url)
if err != nil {...

go语言之文件读写

文件操作用到os库。涉及到几个函数分别为os.Open/os.Create/os.OpenFile/os.Remove/os.RemoveAll
(1) 当文件不存在的时候,使用os.Create
var buffer bytes.Bufferbuffer.WriteString("abcd")
file,error:=os.Create("test.txt")defer file.Close()if error !=nil{ fmt.Println("file create fail")}file.Write(buffer.Bytes()) //写入字节file.WriteStrin...

go语言中viper包简单使用

github.com/spf13/viper   配置解决方案,支持 JSON/TOML/YAML/HCL/envfile/Java properties 等多种格式的配置文件

func main() {
var config = "config.yaml" // 文件名及路径

v := viper.New()
v.SetConfigFile(config)
v.SetConfigType("yaml") // 配置类型
err := v.ReadInConfig()
if err != nil {
panic(err)
}
fmt.P...

《go语言圣经》练习答案--第七章

练习 7.1: 使用来自ByteCounter的思路,实现一个针对对单词和行数的计数器。你会发现bufio.ScanWords非常的有用。
package main

import (
"bufio"
"bytes"
"fmt"
)

type ByteCounter int

func (c *ByteCounter) Write(p []byte) (int, error) {
scan := bufio.NewScanner(bytes.NewReader(p))
scan.Split(bufio.ScanWords)
for scan.Scan() {
*c...

go语言圣经课后练习题

 

//1.1、修改 echo 程序,使其能够打印 os.Args[0] ,即被执行命令本身的名字。
 

package mainimport (
"fmt"
"os"
)

func main() {

var s, sep string
for i := 0; i < len(os.Args); i++ {
s += sep + os.Args[i]
sep = ""
}
fmt.Println(s)

}

  
//1.2、修改 echo 程序,使其打印每个参数的索引和值,每个一行。

//1.2、修改 echo 程序,使其打印...

go语言之UDP通信

服务端

package main

import (
"fmt"
"net"
)

func main() {
listen, err := net.ListenUDP("udp", &net.UDPAddr{
IP: net.IPv4(0, 0, 0, 0),
Port: 30000,
})
if err != nil {
fmt.Println("listen failed, err:", err)
return
}
defer listen.Close()
for {
var data [1024]byte
n, addr, err...

go strconv标准库需要注意

package mainimport ( "fmt" "log" "os" "strconv" "strings")func DemoTest() { var Name string var Version string { fmt.Printf("%s-%s",Name,Version) }}func main(){ v:=strings.TrimSpace((string)("100")) if f,err:=os.Open("config.yaml");err!=nil{ log.Fatalln(err) fmt...

go语言递归函数

Go语言递归函数
目录Go语言递归函数格式阶乘斐波那契数列
Go语言递归函数
格式
递归,就是在运行的过程中调用自己。
语法格式如下:
func recursion() {
recursion() /* 函数调用自身 */
}

func main() {
recursion()
}

Go 语言支持递归。但我们在使用递归时,需要设置退出条件,否则递归将陷入无限循环中。
递归函数对于解决数学上的问题是非常有用的,就像计算阶乘,生成斐波那契数列等。

阶乘
package main

import "fmt"

func oper(n uint64) (result uint64)...

go 中 interface 返回

package main

import "fmt"

type task struct {
}

func main() {
i := args()
j := argsV2()

fmt.Println(fmt.Sprintf("%T", i))
fmt.Println(fmt.Sprintf("%T", j))
}

func args() interface{} {

var t *task
return t
}

func argsV2() interface{} {

//var t *task
return nil...

go 及时通信-建立客户端

package main

import (
"fmt"
"net"
)

type Client struct {
ServerIp string
ServerPort int
Name string
Conn net.Conn
}

func NewClient(serverIp string, serverPort int) *Client {
client := &Client{
ServerIp: serverIp,
ServerPort: serverPort,
}

conn, err := net.Dial(...

文章标题:go语言抓取文件中整个URL(可递归目录)
文章链接:https://www.dianjilingqu.com/725.html
本文章来源于网络,版权归原作者所有,如果本站文章侵犯了您的权益,请联系我们删除,联系邮箱:saisai#email.cn,感谢支持理解。
THE END
< <上一篇
下一篇>>