Sitemap(即站点地图)就是您网站上各网页的列表。创建并提交Sitemap有助于Spider发现并了解网站上的所有网页。还可以使用Sitemap提供有关网站的其他信息,如上次更新日期、Sitemap文件的更新频率等,供Spider参考。
一般来说搜索引擎对已提交的数据,不保证一定会抓取及索引所有网址。但是,会使用Sitemap中的数据来了解网站的结构等信息,这样可以帮助改进抓取策略,并在日后能更好地对网站进行抓取。
此外,Sitemap 与搜索排名一般没有关系。
sitemap文件一般有体积和数量上的限制,就百度来说不应超过5万条,体积不能超过10M,当然这不是永恒不变的,可以查询各个搜索引擎的规则。
sitemap可以通过离线的方式一次性生成为文件,供访问,另外对于数量不大的网站来说,动态的生成会更精确,下面罗列一下动态生成的代码,主要使用 spring boot,但原理几乎类似。
// 使用 hutool 的 xml 工具生成 xml 文档,之后使用 java xml 接口拼装文件,最后再由 hutool xml 工具类生成文本写入数据。
@GetMapping(value = "sitemap.xml")
public void sitemap(HttpServletResponse response) throws IOException {
response.setCharacterEncoding("UTF-8");
response.setContentType(MediaType.APPLICATION_XML_VALUE);
Writer writer = response.getWriter();
Document document = XmlUtil.createXml();
//不显示standalone="no"
document.setXmlStandalone(true);
Element urlset = document.createElementNS("http://www.sitemaps.org/schemas/sitemap/0.9","urlset");
//增加移动端
urlset.setAttribute("xmlns:mobile","http://www.baidu.com/schemas/sitemap-mobile/1/");
// appUrl 为网站的域名
String siteUrl = "https://www." + appUrl;
//增加了首页,几个输入参数根据实际页面信息来填写
appendUrlElement(document,urlset,loc, lastmod,changefreq,priority);
//继续增加子页
appendUrlElement(document,urlset,siteUrl+"/" + url, date,"daily","1");
//写入文档
document.appendChild(urlset);
//写入客户端
writer.append(XmlUtil.toStr(document));
}
为了方便直接实现在了 controller 层,再增加一个 url 写入函数
private Element appendUrlElement(Document document, Element urlSet, String loc, String lastmod, String changefreq, String priority) {
Element url = document.createElement("url");
Element locElement = document.createElement("loc");
locElement.setTextContent(loc);
url.appendChild(locElement);
Element mobileElement = document.createElement("mobile:mobile");
mobileElement.setAttribute("type","pc,mobile");
url.appendChild(mobileElement);
Element lastmodElement = document.createElement("lastmod");
lastmodElement.setTextContent(lastmod);
url.appendChild(lastmodElement);
Element changefreqElement = document.createElement("changefreq");
changefreqElement.setTextContent(changefreq);
url.appendChild(changefreqElement);
Element priorityElement = document.createElement("priority");
priorityElement.setTextContent(priority);
url.appendChild(priorityElement);
urlSet.appendChild(url);
return url;
}
组合一下可以最小化的解决 sitemap 的功能,当然有一些开源工具比较方便,但是这么一个小功能引入开源项目似乎也没有必要。
具体的规则还要参考不同的搜索引擎文档。