Go 站点地图生成器:从首页爬全站,一键生成 sitemap.xml

Go 站点地图生成器:从首页爬全站,一键生成 sitemap.xml

sitemap 是网站给谷歌的"目录",列出你有哪些页面、在哪。很多外贸独立站要么没有 sitemap,要么是建站时生成一次就再也没更新过,新页面迟迟不被收录。自己维护一份准确的 sitemap 最靠谱。这篇用 Go 写一个站点地图生成器:从首页出发,顺着内部链接爬全站,自动生成一份 sitemap.xml 骨架。

sitemap 的标准和生成要求看谷歌官方说明:构建 sitemap。

工具能做什么

  1. 从首页出发,顺着站内链接自动爬取
  2. 只收集本站页面,过滤外链、锚点、JS 链接
  3. 去重、排序,输出标准 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 系统实操。

觉得有用欢迎点赞、收藏、转发,有疑问评论区留言或私信交流。

相关推荐
长弓三石1 小时前
Spring Boot 4.1 + AgentScope:企业级 Agent 平台的 MCP 双向集成实战
人工智能·spring boot·后端·harness·开源智能体
乌恩大侠2 小时前
从 5G 通信到厘米级感知:基于 NVIDIA Aerial、SRS 与 UL-TDOA 构建 6G 无线定位实验平台
人工智能·5g·电信大模型
懂点Tech9 小时前
ctfshow misc28:GIF 高度修改解题与脚本实现
开发语言·windows·python
云和数据.ChenGuang9 小时前
Python 重写(Override)深度解析:从 MRO 到 super() 的完整机制
java·开发语言·人工智能·python·langchain·1024程序员节
西西木科技丨Shopify开发机构9 小时前
CalDigit TS4案例:AI产品图的Shopify整站接入与验收
人工智能·shopify·独立站
2601_9654488710 小时前
AI视频制作:做系列节气民俗视频音色不统一,AI 音色克隆省事的方法
人工智能·机器学习·音视频
美狐美颜SDK开放平台10 小时前
视频美颜SDK试用DEMO阶段应该测试什么?直播APP接入实操指南
开发语言·人工智能·深度学习·音视频·美颜sdk·直播美颜sdk·第三方美颜sdk
dtq042410 小时前
C++小案例 - 日志实战
开发语言·c++
HRaitest10 小时前
秋招技术岗招聘提效:三类 AI 招聘方案的技术底层与选型逻辑
大数据·人工智能·求职招聘·ai-native