golang高效生成XML网站地图插件库go-sitemap-generator的使用

Golang高效生成XML网站地图插件库go-sitemap-generator的使用

简介

go-sitemap-generator是Go语言中最简单的生成网站地图(Sitemap)的方式。从2.0.0版本开始,该库已作为Go模块提供。

基本使用示例

package main

import (
    "github.com/ikeikeikeike/go-sitemap-generator/v2/stm"
)

func main() {
    sm := stm.NewSitemap(1)

    // 在添加条目之前必须先调用Create方法
    sm.Create()

    sm.Add(stm.URL{{"loc", "home"}, {"changefreq", "always"}, {"mobile", true}})
    sm.Add(stm.URL{{"loc", "readme"}})
    sm.Add(stm.URL{{"loc", "aboutme"}, {"priority", 0.1}})

    sm.Finalize().PingSearchEngines()
}

安装

作为Go模块安装

go get github.com/ikeikeikeike/go-sitemap-generator/v2/stm

传统安装方式

go get gopkg.in/ikeikeikeike/go-sitemap-generator.v1/stm
go get gopkg.in/ikeikeikeike/go-sitemap-generator.v2/stm

主要特性

  • 支持生成多种类型的网站地图:

    • 新闻网站地图
    • 视频网站地图
    • 图片网站地图
    • 地理位置网站地图
    • 移动网站地图
    • 替代链接
  • 支持网站地图存储适配器:

    • 文件系统
    • S3存储
  • 自定义网站地图工作方式

  • 通知搜索引擎(Google, Bing)有新网站地图

  • 完全控制网站地图内容和命名方案

详细使用指南

设置并发度

禁用并发(设置为1个CPU):

sm := stm.NewSitemap(1)

使用所有可用CPU:

sm := stm.NewSitemap(0)

禁用非必要输出

sm := stm.NewSitemap(1)
sm.SetVerbose(false)

通知搜索引擎

sm.Finalize().PingSearchEngines()

添加新的搜索引擎:

sm.Finalize().PingSearchEngines("http://newengine.com/ping?url=%s")

配置选项

// 设置网站主机名
sm.SetDefaultHost("http://www.example.com")

// 设置网站地图远程主机
sm.SetSitemapsHost("http://s3.amazonaws.com/sitemap-generator/")

// 设置本地写入路径
sm.SetPublicPath("tmp/")

// 设置网站地图路径
sm.SetSitemapsPath("sitemaps/")

// 设置S3适配器
sm.SetAdapter(&stm.S3Adapter{Region: "ap-northeast-1", Bucket: "your-bucket", ACL: "public-read"})

// 更改输出文件名
sm.SetFilename("new_filename")

高级功能示例

上传到S3

package main

import (
    "github.com/aws/aws-sdk-go/aws/credentials"
    "github.com/ikeikeikeike/go-sitemap-generator/stm"
)

func main() {
    sm := stm.NewSitemap(1)
    sm.SetDefaultHost("http://example.com")
    sm.SetSitemapsPath("sitemap-generator") // 默认: public
    sm.SetSitemapsHost("http://s3.amazonaws.com/sitemap-generator/")
    sm.SetAdapter(&stm.S3Adapter{
        Region: "ap-northeast-1",
        Bucket: "your-bucket",
        ACL:    "public-read",
        Creds:  credentials.NewEnvCredentials(),
    })

    sm.Create()

    sm.Add(stm.URL{{"loc", "home"}, {"changefreq", "always"}, {"mobile", true}})
    sm.Add(stm.URL{{"loc", "readme"}})
    sm.Add(stm.URL{{"loc", "aboutme"}, {"priority", 0.1}})

    sm.Finalize().PingSearchEngines()
}

新闻网站地图

sm.Add(stm.URL{
    {"loc", "/news"},
    {"news", stm.URL{
        {"publication", stm.URL{
            {"name",     "Example"},
            {"language", "en"},
        },
        },
        {"title",            "My Article"},
        {"keywords",         "my article, articles about myself"},
        {"stock_tickers",    "SAO:PETR3"},
        {"publication_date", "2011-08-22"},
        {"access",           "Subscription"},
        {"genres",           "PressRelease"},
    },},
})

视频网站地图

sm.Add(stm.URL{
    {"loc", "/videos"},
    {"video", stm.URL{
        {"thumbnail_loc", "http://www.example.com/video1_thumbnail.png"},
        {"title",         "Title"},
        {"description",   "Description"},
        {"content_loc",   "http://www.example.com/cool_video.mpg"},
        {"category",      "Category"},
        {"tag",           []string{"one", "two", "three"}},
        {"player_loc",    stm.Attrs{"https://example.com/p/flash/moogaloop/6.2.9/moogaloop.swf?clip_id=26", map[string]string{"allow_embed": "Yes", "autoplay": "autoplay=1"}}},
    },
    },
})

图片网站地图

sm.Add(stm.URL{
    {"loc", "/images"},
    {"image", []stm.URL{
        {{"loc", "http://www.example.com/image.png"}, {"title", "Image"}},
        {{"loc", "http://www.example.com/image1.png"}, {"title", "Image1"}},
    },},
})

地理位置网站地图

sm.Add(stm.URL{
    {"loc", "/geos"},
    {"geo", stm.URL{
        {"format", "kml"},
    },},
})

移动网站地图

sm.Add(stm.URL{{"loc", "mobiles"}, {"mobile", true}})

完整示例

package main

import (
    "github.com/ikeikeikeike/go-sitemap-generator/stm"
)

func main() {
    sm := stm.NewSitemap(0)
    sm.SetDefaultHost("http://yourhost.com")
    sm.SetSitemapsHost("http://s3.amazonaws.com/sitemaps/")
    sm.SetSitemapsPath("sitemaps/")
    sm.SetFilename("anothername")
    sm.SetCompress(true)
    sm.SetVerbose(true)
    sm.SetAdapter(&stm.S3Adapter{Region: "ap-northeast-1", Bucket: "your-bucket"})

    sm.Create()

    sm.Add(stm.URL{{"loc", "/home"}, {"changefreq", "daily"}})

    sm.Add(stm.URL{{"loc", "/abouts"}, {"mobile", true}})

    sm.Add(stm.URL{{"loc", "/news"},
    {"news", stm.URL{
        {"publication", stm.URL{
            {"name",     "Example"},
            {"language", "en"},
        },
        },
        {"title",            "My Article"},
        {"keywords",         "my article, articles about myself"},
        {"stock_tickers",    "SAO:PETR3"},
        {"publication_date", "2011-08-22"},
        {"access",           "Subscription"},
        {"genres",           "PressRelease"},
    },},
    })

    sm.Add(stm.URL{{"loc", "/images"},
    {"image", []stm.URL{
        {{"loc", "http://www.example.com/image.png"}, {"title", "Image"}},
        {{"loc", "http://www.example.com/image1.png"}, {"title", "Image1"}},
    },},
    })

    sm.Add(stm.URL{{"loc", "/videos"},
    {"video", stm.URL{
        {"thumbnail_loc", "http://www.example.com/video1_thumbnail.png"},
        {"title",         "Title"},
        {"description",   "Description"},
        {"content_loc",   "http://www.example.com/cool_video.mpg"},
        {"category",      "Category"},
        {"tag",           []string{"one", "two", "three"}},
        {"player_loc",    stm.Attrs{"https://example.com/p/flash/moogaloop/6.2.9/moogaloop.swf?clip_id=26", map[string]string{"allow_embed": "Yes", "autoplay": "autoplay=1"}}},
    },},
    })

    sm.Add(stm.URL{{"loc", "/geos"},
    {"geo", stm.URL{
        {"format", "kml"},
    },},
    })

    sm.Finalize().PingSearchEngines("http://newengine.com/ping?url=%s")
}

Web服务器示例

package main

import (
    "log"
    "net/http"

    "github.com/ikeikeikeike/go-sitemap-generator/stm"
)

func buildSitemap() *stm.Sitemap {
    sm := stm.NewSitemap(1)
    sm.SetDefaultHost("http://example.com")

    sm.Create()
    sm.Add(stm.URL{{"loc", "/"}, {"changefreq", "daily"}})

    // 注意: 不要调用sm.Finalize(),因为它会将底层数据结构从内存刷新到磁盘
    
    return sm
}

func main() {
    sm := buildSitemap()

    mux := http.NewServeMux()
    mux.HandleFunc("/sitemap.xml", func(w http.ResponseWriter, r *http.Request) {
        // Go的web服务器会自动设置正确的Content-Type头
        w.Write(sm.XMLContent())
        return
    })

    log.Fatal(http.ListenAndServe(":8080", mux))
}

测试

准备:

$ go get github.com/clbanning/mxj

运行测试:

$ go test -v -cover -race ./...

更多关于golang高效生成XML网站地图插件库go-sitemap-generator的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang高效生成XML网站地图插件库go-sitemap-generator的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


使用go-sitemap-generator高效生成XML网站地图

go-sitemap-generator是一个高效的Go语言库,专门用于生成符合标准的XML网站地图(Sitemap)。网站地图对于SEO优化非常重要,它帮助搜索引擎爬虫更好地发现和索引网站内容。

安装

首先安装go-sitemap-generator库:

go get github.com/ikeikeikeike/go-sitemap-generator/v2

基本使用示例

package main

import (
	"log"
	"time"

	sm "github.com/ikeikeikeike/go-sitemap-generator/v2"
)

func main() {
	// 创建sitemap生成器
	sm := sm.NewSitemap()
	
	// 设置基本配置
	sm.SetVerbose(true)
	sm.SetCompress(true)
	sm.SetPublicPath("public") // 输出目录
	sm.SetSitemapsPath("sitemaps") // sitemap文件存放子目录
	sm.SetHostname("https://www.example.com") // 你的网站域名
	
	// 创建sitemap索引文件
	sm.Create()
	
	// 添加URL到sitemap
	sm.Add(sm.URL{
		Loc:        "https://www.example.com/page1",
		Lastmod:    time.Now(),
		Changefreq: "daily",
		Priority:   0.8,
	})
	
	sm.Add(sm.URL{
		Loc:        "https://www.example.com/page2",
		Lastmod:    time.Now().Add(-24 * time.Hour),
		Changefreq: "weekly",
		Priority:   0.5,
	})
	
	// 生成sitemap文件
	err := sm.Finalize()
	if err != nil {
		log.Fatal(err)
	}
	
	log.Println("Sitemap generated successfully!")
}

高级功能

1. 分块生成大sitemap

当URL数量很多时(超过50,000个),可以自动分块生成:

sm := sm.NewSitemap()
sm.SetMaxURLs(50000) // 设置每个sitemap文件最大URL数
// ...添加URL...
sm.Finalize()

2. 自定义文件名

sm.SetFilename("custom_sitemap") // 设置基础文件名

3. 添加图片和视频sitemap

// 添加带图片的URL
sm.Add(sm.URL{
	Loc: "https://www.example.com/image-page",
	Image: []sm.Image{
		{
			Loc: "https://www.example.com/image1.jpg",
			Title: "Image 1",
		},
		{
			Loc: "https://www.example.com/image2.jpg",
			Title: "Image 2",
		},
	},
})

// 添加带视频的URL
sm.Add(sm.URL{
	Loc: "https://www.example.com/video-page",
	Video: []sm.Video{
		{
			ThumbnailLoc: "https://www.example.com/video1-thumb.jpg",
			Title:       "Video 1",
			Description: "Description of video 1",
			ContentLoc:  "https://www.example.com/video1.mp4",
		},
	},
})

4. 自动ping搜索引擎

生成后自动通知搜索引擎:

sm.SetPing(true) // 启用自动ping
sm.SetPingGoogle(true)
sm.SetPingBing(true)

实际应用示例

下面是一个更完整的示例,模拟从数据库获取数据生成sitemap:

package main

import (
	"log"
	"time"

	sm "github.com/ikeikeikeike/go-sitemap-generator/v2"
)

type Page struct {
	URL      string
	Modified time.Time
	Priority float32
}

func getPagesFromDB() []Page {
	// 模拟从数据库获取页面数据
	return []Page{
		{"https://www.example.com/home", time.Now(), 1.0},
		{"https://www.example.com/about", time.Now().Add(-24 * time.Hour), 0.8},
		{"https://www.example.com/contact", time.Now().Add(-48 * time.Hour), 0.5},
	}
}

func main() {
	sm := sm.NewSitemap()
	sm.SetVerbose(true)
	sm.SetCompress(true)
	sm.SetPublicPath("public")
	sm.SetHostname("https://www.example.com")
	sm.SetPing(true)
	
	sm.Create()
	
	pages := getPagesFromDB()
	for _, page := range pages {
		sm.Add(sm.URL{
			Loc:        page.URL,
			Lastmod:    page.Modified,
			Changefreq: "weekly",
			Priority:   page.Priority,
		})
	}
	
	err := sm.Finalize()
	if err != nil {
		log.Fatal(err)
	}
	
	log.Println("Sitemap generated and search engines notified")
}

最佳实践

  1. 更新频率:根据内容实际更新频率设置changefreq,不要夸大
  2. 优先级:合理设置priority,首页通常设为1.0,重要页面0.8-0.9,次要页面0.5左右
  3. 自动生成:建议设置定时任务定期重新生成sitemap
  4. robots.txt:确保在robots.txt中引用你的sitemap位置
  5. 验证:生成后使用Google Search Console验证sitemap

go-sitemap-generator库提供了灵活而强大的功能,可以满足大多数网站的sitemap生成需求,是Go语言项目中实现SEO优化的好帮手。

回到顶部