标准网页Sitemap:最基础的,包含所有需要被搜索引擎索引的页面URL。每个sitemap文件上限50000个URL或50MB(未压缩)。
图片Sitemap:如果网站图片靠JS加载或图片URL不在HTML里,需要单独的图片sitemap让Google发现图片。电商和图片站必须配。
视频Sitemap:视频内容独立提交,包含标题、描述、缩略图、时长等元数据。YouTube嵌入的视频不需要,自有视频平台需要。
新闻Sitemap:新闻类网站专用,只包含最近48小时内发布的新闻页面。需要申请Google News Publisher资格。
Sitemap Index:当单个sitemap超过50000条URL时,用sitemap index文件统筹多个子sitemap,是一个"sitemap的sitemap"。
⚠️ 注意:百度站长平台只接受标准网页Sitemap(XML和TXT格式),不支持图片/视频/新闻sitemap。Google才支持全类型。如果你的主要流量来源是百度,不需要折腾图片和视频sitemap。
| 工具 | 类型 | 免费上限 | 生成方式 | 核心优势 | 短板 |
|---|---|---|---|---|---|
| Rank Math | WordPress插件 | 无限制 | 自动扫描+自动更新 | 免费版功能最全,支持自定义排除页面、分拆sitemap、优先级配置,发文章自动更新 | 仅限WordPress,其他CMS用不了 |
| Yoast SEO | WordPress插件 | 无限制 | 自动扫描+自动更新 | 老牌稳定,用户基数大,出问题能找到大量教程。图片sitemap需付费版 | 免费版功能比Rank Math少,高级sitemap设置需付费 |
| XML-Sitemaps.com | 在线 | 500页 | 输入网址自动爬取 | 零安装、零配置,输入网址等几分钟下载XML。适合静态HTML小站 | 500页限制,不能自动更新,每次要手动重新生成。不支持JS渲染 |
| Screaming Frog | 桌面软件 | 500页 | 爬取全站后导出 | 爬完可以精细控制哪些URL进sitemap(按状态码/深度/类型筛选),支持自定义lastmod和priority | 桌面软件,不能自动更新,适合一次性审计+导出。付费版£199/年才解锁无限页 |
| 哲涛sitemap | 在线 | 无限制 | 输入网址自动爬取 | 国产工具里最良心的,免费且无页数限制,支持XML/TXT/HTML/RSS四种格式同时生成 | 爬取速度较慢,大站可能等很久。同样不能自动更新 |
| 微视界sitemap | 在线 | 无限制 | 输入网址自动爬取 | 同样免费无限制,抓取速度比哲涛稍快,界面更现代 | 纯在线工具,大站可能因超时而中断 |
| 自建脚本 | 代码 | 无限制 | 扫描数据库+自动生成 | 完全可控,支持定时任务自动更新,百万级URL分片生成sitemap index | 需要编程能力,调试和部署有门槛 |
小站(500页以内,个人博客/小型企业站)
首选:WordPress用Rank Math或Yoast(装好即用,自动生成+自动更新)。非WordPress用哲涛sitemap或XML-Sitemaps.com在线生成,上传到网站根目录。
维护方式:每次新增5-10个页面后重新生成一次。或者直接用手动在线工具每个月更新一次。
注意:小站不需要折腾分拆sitemap和图片/视频sitemap,一个标准的sitemap.xml足够。
中型站(500-50000页,电商/内容站)
首选:WordPress用Rank Math付费版(支持图片/视频sitemap,自定义程度更高)。非WordPress用Screaming Frog付费版,爬完全站后筛选导出,或直接上自建脚本。
维护方式:必须自动化——设置cron定时任务每天自动重新生成sitemap,并自动提交到GSC和百度站长平台。手动维护50000条URL不现实。
注意:50000条是单个sitemap上限,接近这个数就要拆分成多个,用sitemap index管理。
大型站(50000页以上,门户/大电商/站群)
唯一方案:自建脚本。没有现成的免费工具能处理百万级URL的sitemap生成。需要写Python/PHP脚本连接数据库,按分类/日期/ID范围分片生成多个sitemap文件,再用sitemap index汇总。
维护方式:定时任务+增量更新。全量重新生成太慢(百万页可能跑几个小时),改为每天只扫描新增/修改的URL,更新对应的分片sitemap。配合GSC API自动提交。
注意:sitemap文件不要超过50000条和50MB,大站分片后可能有几十个sitemap文件,sitemap index本身也有50000条限制(但基本够用)。
# Python版:扫描数据库生成sitemap(支持分片)import osfrom datetime import datetimefrom xml.etree.ElementTree import Element, SubElement, ElementTreedef generate_sitemap(urls, output_dir="sitemaps", max_per_file=50000):"""将URL列表分片生成多个sitemap文件"""os.makedirs(output_dir, exist_ok=True)today = datetime.now().strftime("%Y-%m-%d")sitemap_files = []for i in range(0, len(urls), max_per_file):chunk = urls[i:i + max_per_file]idx = i // max_per_file + 1filename = f"sitemap-{idx}.xml"filepath = os.path.join(output_dir, filename)urlset = Element("urlset", xmlns="http://www.sitemaps.org/schemas/sitemap/0.9")for url in chunk:url_elem = SubElement(urlset, "url")SubElement(url_elem, "loc").text = urlSubElement(url_elem, "lastmod").text = todaySubElement(url_elem, "changefreq").text = "weekly"SubElement(url_elem, "priority").text = "0.8"tree = ElementTree(urlset)tree.write(filepath, xml_declaration=True, encoding="utf-8")sitemap_files.append(filename)# 生成sitemap indexsitemapindex = Element("sitemapindex", xmlns="http://www.sitemaps.org/schemas/sitemap/0.9")for fname in sitemap_files:sitemap = SubElement(sitemapindex, "sitemap")SubElement(sitemap, "loc").text = f"https://你的网站.com/{output_dir}/{fname}"SubElement(sitemap, "lastmod").text = todayElementTree(sitemapindex).write(f"{output_dir}/sitemap-index.xml",xml_declaration=True, encoding="utf-8")print(f"生成 {len(sitemap_files)} 个分片sitemap,共 {len(urls)} 条URL")# 用法:从数据库查询所有需要收录的URL# urls = fetch_all_page_urls_from_database()# generate_sitemap(urls)// PHP版:适合虚拟主机环境,直接放到网站根目录';echo '';// 从数据库查询所有页面URL(根据你的表结构调整)$mysqli = new mysqli("localhost", "用户名", "密码", "数据库");$result = $mysqli->query("SELECT slug, updated_at FROM posts WHERE status='published'");while ($row = $result->fetch_assoc()) {$url = "https://你的网站.com/" . htmlspecialchars($row['slug']);$lastmod = date("Y-m-d", strtotime($row['updated_at']));echo " ';?>";echo " \n";}echo '$url ";echo "$lastmod ";echo "weekly ";echo "0.8 ";echo "
PHP版本直接放到网站根目录,访问 yoursite.com/sitemap.php 就是最新sitemap。配合.htaccess做URL重写可以把sitemap.php伪装成sitemap.xml。设置cron定时任务每天跑一次Python版本即可自动更新。
五、Sitemap配置的三个关键参数生成的sitemap里每个URL有三个可配置参数,很多人都是瞎填的:lastmod(最后修改时间)—— 最重要的参数,必须填对

这是Google最看重的sitemap参数。爬虫会比较sitemap中的lastmod和它上次抓取时记录的日期,只抓有更新的页面。填错的后果:所有页面写同一个日期→爬虫以为全站都没更新→不抓;永远写当天日期→爬虫以为全站每天更新→浪费抓取预算。正确做法:每个页面填真实的最后修改时间,只有内容变了才更新lastmod。
changefreq(更新频率)—— 建议值,不是强制值
可选值:always/hourly/daily/weekly/monthly/yearly/never。搜索引擎只是参考,不强制遵守。实际抓取频率由搜索引擎根据页面质量和更新历史自行决定。常规内容填weekly,新闻类填daily,关于我们/联系我们这种静态页填monthly。
priority(优先级)—— 几乎没用
取值范围0.0-1.0。Google官方早就明确表态不参考priority参数。百度也不看。这个参数可以填,但不要指望它影响收录顺序。如果真的想区分优先级,把重要页面放sitemap前面就行(搜索引擎倾向于优先处理sitemap中排在前面的URL)。
Google Search Console
左侧菜单 → 站点地图 → 输入sitemap URL → 提交。提交后GSC会显示"已发现X个URL"和"已编入索引X个",这两个数字的差距就是你的收录缺口。支持提交sitemap index文件,一次提交管理所有子sitemap。
百度站长平台
左侧菜单 → 数据引入 → 链接提交 → Sitemap。支持XML和TXT两种格式。百度对sitemap的解析比Google慢,提交后可能1-3天才开始处理。建议同时配置API主动推送,sitemap作为兜底。
robots.txt引用

在robots.txt文件末尾加一行:Sitemap: https://你的网站.com/sitemap.xml。这样即使你没主动提交,搜索引擎爬robots.txt时也会发现你的sitemap。Bing和Yandex等非主流引擎主要靠这个方式发现sitemap。
💡 最佳实践:三步同时做——①GSC提交sitemap(Google专用)②百度站长提交sitemap+API主动推送(百度专用)③robots.txt加sitemap引用(兜底其他引擎)。三个动作5分钟搞定,之后让搜索引擎自己来拉更新。
翻车一:sitemap里塞了一堆不该索引的URL
标签归档页、搜索参数页、分页第10页之后的内容、管理后台登录页——这些页面被放进sitemap,等于告诉搜索引擎"请爬这些垃圾"。每次生成sitemap前先做URL过滤:排除noindex页面、排除非200状态码的URL、排除robots.txt里屏蔽的路径。
翻车二:sitemap和实际页面不同步
删了页面但sitemap里还有、改了URL但sitemap里是旧的、加了一百篇新文章但sitemap没更新。这是手动维护sitemap最大的坑。解决方法是自动化——WordPress用插件、自建站用定时脚本。sitemap和网站内容不同步的时间越长,搜索引擎对你网站的信任度越低。
翻车三:sitemap URL写的是HTTP,但网站已经全站HTTPS
sitemap里写http://,实际网站301跳转到https://。搜索引擎跟着sitemap里的HTTP地址去抓,遇到301跳转再跟到HTTPS,白浪费一次跳转的抓取预算。所有URL统一用https://,并确认sitemap里没有混入http://的老链接。
翻车四:GSC提交了sitemap就以为万事大吉
GSC的站点地图报告里会显示"已发现X个URL"和"已编入索引X个",如果这两个数字差距很大(比如发现5000但只索引2000),说明你的页面质量有问题。定期回来看这个数字,发现收录率低于50%就要排查页面质量,不是sitemap的问题。
