您现在的位置是:首页 > 经验记录>日常笔记>使用Golang写一个站点的sitemap生成工具,可命令指定站点url,输出地址,并发数等 网站首页 日常笔记
使用Golang写一个站点的sitemap生成工具,可命令指定站点url,输出地址,并发数等
使用包:
"flag"
"github.com/PuerkitoBio/goquery"
"github.com/douyacun/gositemap"
"github.com/gocolly/colly"
"github.com/gocolly/colly/extensions"
"regexp"
"time"
思路:
一、基于gocolly/colly遍历全站,且通过正则限制仅遍历指定网站链接内路径。 通过PuerkitoBio/goquery匹配页面 href循环遍历 二、使用douyacun/gositemap进行sitemap xml生成
代码如下:
package main
import (
"flag"
"fmt"
"github.com/PuerkitoBio/goquery"
"github.com/douyacun/gositemap"
"github.com/gocolly/colly"
"github.com/gocolly/colly/extensions"
"regexp"
"time"
)
var priority float64 = 1
func main() {
//命令参数获取
targetUrl := flag.String("url","","目标站点地址")
path := flag.String("path","","目标站点地址")
Parallelnum := flag.Int("parallel",500,"并发数")
Delay := flag.Int("delay",0,"延迟(毫秒)")
MaxLinks := flag.Int("maxlink",50000,"最大链接数")
//[必须调用]:从 arguments 中解析注册的 flag,不然参数获取都没值
flag.Parse()
//参数验证
if len(*targetUrl) == 0{
panic("请传递目前站点地址")
}
if len(*path) == 0{
*path = fmt.Sprintf("gositemap/%s/",time.Now().Format("20060102_150405"))
}
st := gositemap.NewSiteMap()
st.SetDefaultHost(*targetUrl)
st.SetPretty(true)
// 每个sitemap文件不能多于50000个链接,这里可以自己配置每个文件最多,如果超过MaxLinks,会自动生成sitemap_index.xml文件
st.SetMaxLinks(*MaxLinks)
//xml文件输出地址
st.SetPublicPath(*path)
t := time.Now()
number := 1
//初始化 创建收集器
c := colly.NewCollector(func(c *colly.Collector) {
extensions.RandomUserAgent(c) // 设置随机头
c.Async = true
},
//过滤url,去除外链
colly.URLFilters(
//regexp.MustCompile("^(https://www\\.uppdd\\.com/)"),
regexp.MustCompile("^("+*targetUrl+"/(.*))"),
),
)
//控制下速度
c.Limit(&colly.LimitRule{
//DomainGlob: "*uppdd.*", //过滤规则的作用域,不限制则全部链接皆使用该规则
DomainGlob: "*",
Parallelism: *Parallelnum,
Delay: time.Duration(*Delay),
})
// 响应的格式为HTML,提取页面中的链接
c.OnHTML("a[href]", func(e *colly.HTMLElement) {
link := e.Attr("href")
href := e.Request.AbsoluteURL(link)
// 访问url 内部会检查 是否符合 正则表达式 。如果不符合 终止访问该url
c.Visit(href)
})
c.OnHTML("body", func(e *colly.HTMLElement) {
e.DOM.Each(func(i int, selection *goquery.Selection) {
//匹配数据(页面dom结构)
href := e.Request.AbsoluteURL(e.Attr("href"))
//写入链接
url := gositemap.NewUrl()
url.SetLoc(href)
url.SetLastmod(time.Now())
url.SetChangefreq(gositemap.Daily)
//获取页面权重
url.SetPriority(getPriority(number))
st.AppendUrl(url)
number += 1
fmt.Printf("计数:%d,链接:%s \n",number,href)
})
})
c.OnError(func(response *colly.Response, err error) {
//fmt.Println(err)
})
c.Visit(*targetUrl+"/")
c.Wait()
fmt.Printf("连接收集花费时间:%s,收集链接:%d个", time.Since(t),number)
//bt,err := st.ToXml()
//if err != nil{
// fmt.Printf("异常:%v", err)
// return
//}
//byte切片转string,好查看是否有错误
//btString := string(bt)
//输出
//fmt.Println(btString)
//生成文件导出
filePath,err := st.Storage()
if err != nil {
fmt.Printf("%v", err)
return
}
fmt.Println(filePath)
}
//递减乱获取权重|很随意
func getPriority(num int) float64 {
if num < 20{
return 1
}
newS := float64(num)/priority
numQ := int(newS)
//fmt.Printf("权重:%d \n",numQ)
if num >= numQ{
priority -= 0.01
}
return priority
}---------------------------------------------分割线----------------------------------------------
使用(这里示例我只指定了目标地址,其他参数可看代码自行提供):
go run . -url=https://www.uppdd.com
结果:
... 计数:75,链接:https://www.uppdd.com/info?id=79 计数:76,链接:https://www.uppdd.com/info?id=115 计数:77,链接:https://www.uppdd.com/info?id=117 计数:78,链接:https://www.uppdd.com/info?id=90 计数:79,链接:https://www.uppdd.com/info?id=103 计数:80,链接:https://www.uppdd.com/info?id=83 计数:81,链接:https://www.uppdd.com/info?id=112 计数:82,链接:https://www.uppdd.com/module?module_id=6&page=1 计数:83,链接:https://www.uppdd.com/info?id=92 连接收集花费时间:9.0064424s,收集链接:83个sitemap.xml
随机推荐
文章评论
未开放






