node.js 利用 sitemap 为你的站点生成站点地图
 发布于 10 年前  作者 zzhi191  8116 次预览  最后一次回复是 10 年前  来自 分享 

node.js 下利用 sitemap 生成站点地图.

大致的工作就是,我们生成一份提供给搜索引擎的 Sitemap 之前你获取在网络上找过各种在线生成 sitemap 工具或者服务,使用起来却都不尽人意.有的收费,有的最大抓取2层url ,还有的最大链接数限制在500个. 所以今天和大家分享的是如何用 node.js 来为站点生成 sitemap

什么是sitemap


借用百科的一段话

Sitemap 可方便网站管理员通知搜索引擎他们网站上有哪些可供抓取的网页。最简单的 Sitemap 形式,就是XML 文件,在其中列出网站中的网址以及关于每个网址的其他元数据(上次更新的时间、更改的频率以及相对于网站上其他网址的重要程度为何等),以便搜索引擎可以更加智能地抓取网站。

sitemap 的结构是什么样?

<url> 
	<loc>http://yijiebuyi.com/</loc> 
<changefreq>daily</changefreq> 
<priority>0.5</priority>
</url>

url 这个节点包含3种信息

    • loc:链接地址
    • changefreq:更新频率
    • priority:权重

使用开源包 sitemap

地址:https://github.com/ekalinin/sitemap.js 引用: npm install --save sitemap

sitemap api

结合 express ,根据 sitemap 访问地址,访问 sitemap 路径时动态生成 xml 流,然后 pipe 到 response

var express = require('express')
  , sm = require('sitemap');

var app = express()
  , sitemap = sm.createSitemap ({
      hostname: 'http://example.com',
      cacheTime: 600000,        // 600 sec - cache purge period
      urls: [
        { url: '/page-1/',  changefreq: 'daily', priority: 0.3 },
        { url: '/page-2/',  changefreq: 'monthly',  priority: 0.7 },
        { url: '/page-3/'},    // changefreq: 'weekly',  priority: 0.5
        { url: '/page-4/',   img: "http://urlTest.com" }
      ]
    });

app.get('/sitemap.xml', function(req, res) {
  sitemap.toXML( function (err, xml) {
      if (err) {
        return res.status(500).end();
      }
      res.header('Content-Type', 'application/xml');
      res.send( xml );
  });
});

app.listen(3000);

生成静态 sitemap.xml 文件

var sm = require('sitemap')
    , fs = require('fs');

var sitemap = sm.createSitemap({
    hostname: 'http://www.mywebsite.com',
    cacheTime: 600000,  //600 sec (10 min) cache purge period
    urls: [
        { url: '/' , changefreq: 'weekly', priority: 0.8, lastmodrealtime: true, lastmodfile: 'app/assets/index.html' },
        { url: '/page1', changefreq: 'weekly', priority: 0.8, lastmodrealtime: true, lastmodfile: 'app/assets/page1.html' },
        { url: '/page2'    , changefreq: 'weekly', priority: 0.8, lastmodrealtime: true, lastmodfile: 'app/templates/page2.hbs' } /* useful to monitor template content files instead of generated static files */
    ]
});

fs.writeFileSync("app/assets/sitemap.xml", sitemap.toString());

我在博客中使用的是上面2个方法的一个结合


首先根据拼接的 url 生成静态 sitemap.xml 文件 然后 sitemap 路由去加载 sitemap.xml 文件,并 pipe 到response 流中

准备工作

<p style=“color:white;”>出自:<a style=“color:white;” href=“http://yijiebuyi.com/blog/e3d0dca76e7433551cf6da90d725df2e.html” >node.js 利用 sitemap 为你的站点生成站点地图</a></p>

选定你的更新频率,比如我的博客,我打算发布博文时生成一次 sitemap 每次生成 sitemap 后在根目录下创建一个 sitemap.xml 文件 然后创建一个路由,当访问 /sitemap.xml 路径时,我们用文件流读取 sitemap.xml 然后 pipe 到 response 流中,返回给客户端.

首先我们要定义个生成 sitemap 的方法 createSiteMap()

//引入包文件
var sm = require('sitemap');
var fs = require('fs');
var config = require('config');
var async = require('async');
var lodash = require('lodash');
var blog = require('./lib/blog');

//创建 sitemap文件的方法
var createSiteMap = function () {
	// 定义 urls 数组存放路径
    var urls = [
        { url: '/index.html', changefreq: 'daily', priority: 0.7 }
    ];
    async.waterfall([
        function (done) {
            getBlogPageUrls(function (url) {
                urls = lodash.union(urls, url);
                done();
            });
        },
        function (done) {
            getBlogTimeCount(function (url) {
                urls = lodash.union(urls, url);
                done();
            });
        },
        function (done) {
            getBlogTag(function (url) {
                urls = lodash.union(urls, url);
                done();
            });
        },
        function (done) {
            getBlogCategory(function (url) {
                urls = lodash.union(urls, url);
                done();
            });
        }
    ], function () {
		// 把 关于我 页面 url push 到 urls 数组中
        urls.push(
            {url: '/about.html', changefreq: 'monthly', priority: 0.4}
        );
        //生成 sitemap.xml 文件
        createSiteMapFile(urls);
    })
};

var getBlogPageUrls=function(callback){
	var urls=[];
	//获取博客列表,分页后拼接成url,然后 push 到 urls 数组中
	calllback(urls);
}

var getBlogTimeCount=function(callback){
	var urls=[];
	//获取博客日历列表,拼接好的 url push 到 urls中
	callback(urls);
}

var getBlogTag=function(callback){
	var urls=[];
	//获取博客 tag ,分页后拼接 url ,然后 push 到 urls 数组中
	callback(urls);
}

var getBlogCategory=function(callback){
	var urls=[];
	//获取博客分类, 分页后拼接 url ,然后 push 到 urls 数组中
	callback(urls);
}

var createSiteMapFile=function(urls){
	//生成 sitemap.xml 静态文件
	var sitemap = sm.createSitemap({
        hostname: 'http://yijiebuyi.com',
        cacheTime: 12 * 60 * 60, 
        urls: urls
    });
    fs.writeFileSync("sitemap.xml", sitemap.toString());
}

访问 sitemap.xml 路由时,把上面的文件读取成文件流 pipe 到 response 流中

定义 sitemap 路由 app.get('/sitemap.xml', pageBlog.siteMap); 读取文件流

function siteMap(req, res, next) {
    var stream = fs.createReadStream('./sitemap.xml', {
        flags: 'r'
    });
    stream.pipe(res);
}

然后我在发布博文成功后 调用 上面定义的方法 createSiteMap()

引入生成 sitemap 文件的 js 文件 var sitemap=require('../siteMap'); 发布博文成功后,调用 siteMap.js 中的 createSiteMap() 方法

function pagePost(req, res, next) {
	//当博文发布成功
	sitemap.createSiteMap();
}

出自:一介布衣 node.js 利用 sitemap 为你的站点生成站点地图

1 回复