SEO优化 - 使用nodejs动态生成网站sitemap.xml 优化抓取

SEO优化 - 使用nodejs动态生成网站sitemap.xml 优化抓取

2017, Jan 19    

主要讲一下如何用Nodejs + express + sitemap.js 来动态生成 sitemap.xml。 自己的博客前端动态生成 sitemap.xml 来让搜索引擎(google_site:diamondfsd.com)抓取,生成了 sitemap.xml 过后,果然自己博客的收录速度快了很多。 下面就简单的介绍一下 sitemap.xml 的作用以及 一个简单的例子。

sitemap 介绍

sitemap,翻译过来就是站点地图。是告诉搜索引擎这个网站上有那些页面可以抓取。 sitemap最简单的格式 txt 格式, 只需要每行列出一个链接就可以: sitemap.txt

https://diamondfsd.com/xxx/xxx
https://diamondfsd.com/xxx/xxx
.......

另外一种比较丰富的格式就是xml格式,xml格式由 <urlset></urlset> 作为根元素,内嵌多个<url></url> 子元素 https://diamondfsd.com/sitemap.xml

<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
xmlns:news="http://www.google.com/schemas/sitemap-news/0.9"
xmlns:xhtml="http://www.w3.org/1999/xhtml"
xmlns:mobile="http://www.google.com/schemas/sitemap-mobile/1.0"
xmlns:image="http://www.google.com/schemas/sitemap-image/1.1">
  <url>
    <loc>
      http://diamondfsd.com/article/0514fe5c-3925-4175-9486-940c0ee9c054
    </loc>
    <lastmod>2017-01-14</lastmod>
    <changefreq>daily</changefreq>
  </url>
  <url>
    <loc>
      http://diamondfsd.com/article/35caae5b-78f5-4728-9170-92144570c7a3
    </loc>
    <lastmod>2017-01-22</lastmod>
    <changefreq>daily</changefreq>
  </url>
</urlset>

[Sitemap] XML格式标签定义

标签 | 参数 | 描述 —-| ——- | —- <urlset>| 必须 | 属性内写了当前使用的协议标准 <url> | 必须 | 每个url条目的父标签,内包含了url的一些其他信息描述 <loc>| 必须| 网页的网址(网址以协议开头 http://|https://<lastmod> | 可选 | 网页的最后一次修改时间,使用W3C的时间标准,例如 YYYY-MM-DD <changefreq> | 可选| 网页的更新频率,可以供搜索引擎参考抓取频率 always, hourly, daily, weekly, monthly, yearly, never(搜索引擎的会有自己的抓取策略,所以这个值仅供搜索引擎参考) <priority> | 可选| 优先级取值范围 0.1 至 1。 —– 也是一个供搜索引擎参考的值

如何动态生成sitemap.xml 文件

毫无疑问,sitemap.xml 拥有更丰富的语义,可以更好的让搜索引擎抓取。本博客使用的sitemap.js 来生成 sitemap.xml 文件。

import express from 'express'
import sm from 'sitemap'
import service from  './service/ArticleService'

const app = express()
const host = 'https://diamondfsd.com'

/* service.allNames 获取一个文章list 结构如下
*  {
      title: String,
      id: String,
      updateTime: Long
    }
*/

app.get('/sitemap.xml', (req, res) => {
  service.allNames().then(data => {
    let smOption = {
      hostname: host,
      cacheTime: 600000,
      urls: [host]
    }
    data.forEach(art => {
      smOption.urls.push({
        url: `/article/${art.id}`,
        changefreq: 'daily',
        lastmod: new Date(art.updateTime)
      })
    })
    let xml = sm.createSitemap(smOption).toString()
    res.header('Content-Type', 'application/xml')
    res.send(xml)
  }).catch(e => {
    res.send(e)
  })
})

具体的文档,可以去 ekalinin/sitemap.js 去看,这里只说一下本博客中的实际使用。 我将所有的文章的id以及更新时间获取到,然后生成 url 对象

{
  url: `/article/${article.id}`,
  changefreq: 'daily',
  lastmod: new Date(art.updateTime)
}

然后构成 创建sitemap.xml 所需要的 对象

{
      hostname: host,
      cacheTime: 600000,
      urls: [url, url, url, url...]
}

最后用 sitemapcreateSitemap(opt).toString() 方法获得 xml 字符串 然后发送到客户端。

每次搜索引擎请求https://diamondfsd.com/sitemap.xml的时候,就会获取最新的文章列表,然后生成最新的sitemap.xml。 这样能够让搜索引擎更快,跟全面的获取到网站想要被抓取的网页地图。