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 流中
准备工作
出自:node.js 利用 sitemap 为你的站点生成站点地图
选定你的更新频率,比如我的博客,我打算发布博文时生成一次 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();
}
干货啊