Go 站点地图生成器:从首页爬全站,一键生成 sitemap.xml
sitemap 是网站给谷歌的"目录",列出你有哪些页面、在哪。很多外贸独立站要么没有 sitemap,要么是建站时生成一次就再也没更新过,新页面迟迟不被收录。自己维护一份准确的 sitemap 最靠谱。这篇用 Go 写一个站点地图生成器:从首页出发,顺着内部链接爬全站,自动生成一份 sitemap.xml 骨架。
sitemap 的标准和生成要求看谷歌官方说明:构建 sitemap。
工具能做什么
- 从首页出发,顺着站内链接自动爬取
- 只收集本站页面,过滤外链、锚点、JS 链接
- 去重、排序,输出标准 sitemap.xml 骨架
用 Go 标准库实现,不需要任何第三方依赖。
完整代码
go
package main
import (
"fmt"
"io"
"net/http"
"net/url"
"os"
"regexp"
"sort"
"strings"
)
var hrefRe = regexp.MustCompile(`(?i)href=["']([^"']+)["']`)
func main() {
start := "https://example.com"
if len(os.Args) > 1 {
start = os.Args[1]
}
base, err := url.Parse(start)
if err != nil {
fmt.Println("URL 解析失败:", err)
os.Exit(1)
}
visited := map[string]bool{}
queue := []string{start}
client := &http.Client{}
for len(queue) > 0 {
current := queue[0]
queue = queue[1:]
if visited[current] {
continue
}
visited[current] = true
resp, err := client.Get(current)
if err != nil || resp.StatusCode != 200 {
if resp != nil {
resp.Body.Close()
}
continue
}
body, _ := io.ReadAll(resp.Body)
resp.Body.Close()
for _, m := range hrefRe.FindAllSubmatch(body, -1) {
raw := strings.TrimSpace(string(m[1]))
if raw == "" || strings.HasPrefix(raw, "#") ||
strings.HasPrefix(raw, "javascript:") || strings.HasPrefix(raw, "mailto:") {
continue
}
u, err := url.Parse(raw)
if err != nil {
continue
}
abs := base.ResolveReference(u)
abs.Fragment = ""
abs.RawQuery = ""
if abs.Host != base.Host {
continue
}
if !visited[abs.String()] {
queue = append(queue, abs.String())
}
}
}
keys := make([]string, 0, len(visited))
for k := range visited {
keys = append(keys, k)
}
sort.Strings(keys)
fmt.Println(`<?xml version="1.0" encoding="UTF-8"?>`)
fmt.Println(`<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">`)
for _, k := range keys {
fmt.Printf(" <url><loc>%s</loc></url>\n", k)
}
fmt.Println(`</urlset>`)
fmt.Printf("\n共 %d 个页面,把上面这段保存成 sitemap.xml 放到网站根目录\n", len(keys))
}
怎么用
bash
go run sitemap-gen.go https://你的域名
程序会从首页开始爬,把站内所有能顺着链接到达的页面找出来,输出一份标准 sitemap.xml。把输出重定向到文件:
bash
go run sitemap-gen.go https://你的域名 > sitemap.xml
三个要注意的点
依赖内链,孤立页面进不来。 这个生成器是靠内链爬的,所以"从任何页面都链不到的孤立页面"不会被收录进 sitemap。如果爬出来发现少了页面,说明那些页面有孤立问题,先补内链。
只收集 200 页面。 返回 404、500 的页面不会被加进 sitemap,这是对的。sitemap 里不该有死链,否则谷歌会认为你的 sitemap 质量差。
生成后记得提交。 sitemap.xml 放到网站根目录后,去 Search Console 里提交一下地址,谷歌才会尽快来读。提交一次,后面它自己会定期重抓。
写在最后
sitemap 是站点收录的"目录表",一份准确、完整的 sitemap,能让谷歌更快发现并收录你的页面。这个生成器胜在零依赖、能跑出真实的站点结构,配合定期重新生成,sitemap 就不会一直是建站时那份过期的老目录。
延伸阅读:谷歌 SEO 系统实操。
觉得有用欢迎点赞、收藏、转发,有疑问评论区留言或私信交流。