这篇文章,我们就把上文中采集到的所有文章列表的信息整理一下,开始采集文章并且生成静态html文件了.先看下我的采集效果,我的博客目前77篇文章,1分钟不到就全部采集生成完毕了,这里我截了部分的图片,文件名用文章的id生成的,生成的文章,我写了一个简单的静态模板,所有的文章都是根据这个模板生成的.

项目结构:
好了,接下来,我们就来讲解下,这篇文章主要实现的功能:
1,抓取文章,主要抓取文章的标题,内容,超链接,文章id(用于生成静态html文件)
2,根据jade模板生成html文件
一、抓取文章如何实现?
非常简单,跟上文抓取文章列表的实现差不多
function crawlerArc( url ){
var html = '';
var str = '';
var arcDetail = {};
http.get(url, function (res) {
res.on('data', function (chunk) {
html += chunk;
});
res.on('end', function () {
arcDetail = filterArticle( html );
str = jade.renderFile('./views/layout.jade', arcDetail );
fs.writeFile( './html/' + arcDetail['id'] + '.html', str, function( err ){
if( err ) {
console.log( err );
}
console.log( 'success:' + url );
if ( aUrl.length ) crawlerArc( aUrl.shift() );
} );
});
});
}
参数url就是文章的地址,把文章的内容抓取完毕之后,调用filterArticle( html ) 过滤出需要的文章信息(id, 标题,超链接,内容),然后用jade的renderFile这个api,实现模板内容的替换,
模板内容替换完之后,肯定就需要生成html文件了, 所以用writeFile写入文件,写入文件时候,用id作为html文件名称。这就是生成一篇静态html文件的实现,
接下来就是循环生成静态html文件了, 就是下面这行:
if ( aUrl.length ) crawlerArc( aUrl.shift() );
aUrl保存的是我的博客所有文章的url, 每次采集完一篇文章之后,就把当前文章的url删除,让下一篇文章的url出来,继续采集
完整的实现代码server.js:
var fs = require( 'fs' );
var http = require( 'http' );
var cheerio = require( 'cheerio' );
var jade = require( 'jade' );
var aList = [];
var aUrl = [];
function filterArticle(html) {
var $ = cheerio.load( html );
var arcDetail = {};
var title = $( "#cb_post_title_url" ).text();
var href = $( "#cb_post_title_url" ).attr( "href" );
var re = /\/(\d+)\.html/;
var id = href.match( re )[1];
var body = $( "#cnblogs_post_body" ).html();
return {
id : id,
title : title,
href : href,
body : body
};
}
function crawlerArc( url ){
var html = '';
var str = '';
var arcDetail = {};
http.get(url, function (res) {
res.on('data', function (chunk) {
html += chunk;
});
res.on('end', function () {
arcDetail = filterArticle( html );
str = jade.renderFile('./views/layout.jade', arcDetail );
fs.writeFile( './html/' + arcDetail['id'] + '.html', str, function( err ){
if( err ) {
console.log( err );
}
console.log( 'success:' + url );
if ( aUrl.length ) crawlerArc( aUrl.shift() );
} );
});
});
}
function filterHtml(html) {
var $ = cheerio.load(html);
var arcList = [];
var aPost = $("#content").find(".post-list-item");
aPost.each(function () {
var ele = $(this);
var title = ele.find("h2 a").text();
var url = ele.find("h2 a").attr("href");
ele.find(".c_b_p_desc a").remove();
var entry = ele.find(".c_b_p_desc").text();
ele.find("small a").remove();
var listTime = ele.find("small").text();
var re = /\d{4}-\d{2}-\d{2}\s*\d{2}[:]\d{2}/;
listTime = listTime.match(re)[0];
arcList.push({
title: title,
url: url,
entry: entry,
listTime: listTime
});
});
return arcList;
}
function nextPage( html ){
var $ = cheerio.load(html);
var nextUrl = $("#pager a:last-child").attr('href');
if ( !nextUrl ) return getArcUrl( aList );
var curPage = $("#pager .current").text();
if( !curPage ) curPage = 1;
var nextPage = nextUrl.substring( nextUrl.indexOf( '=' ) + 1 );
if ( curPage < nextPage ) crawler( nextUrl );
}
function crawler(url) {
http.get(url, function (res) {
var html = '';
res.on('data', function (chunk) {
html += chunk;
});
res.on('end', function () {
aList.push( filterHtml(html) );
nextPage( html );
});
});
}
function getArcUrl( arcList ){
for( var key in arcList ){
for( var k in arcList[key] ){
aUrl.push( arcList[key][k]['url'] );
}
}
crawlerArc( aUrl.shift() );
}
var url = 'http://www.cnblogs.com/ghostwu/';
crawler( url );
layout.jade文件:
doctype html
html
head
meta(charset='utf-8')
title jade+node.js express
link(rel="stylesheet", href='./css/bower_components/bootstrap/dist/css/bootstrap.min.css')
body
block header
div.container
div.well.well-lg
h3 ghostwu的博客
p js高手之路
block container
div.container
h3
a(href="#{href}" rel="external nofollow" ) !{title}
p !{body}
block footer
div.container
footer 版权所有 - by ghostwu
后续的打算:
1,采用mongodb入库
2,支持断点采集
3,采集图片
4,采集小说
等等....
以上这篇Node.js+jade抓取博客所有文章生成静态html文件的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
# nodejs
# 生成静态html
# 利用Vue.js+Node.js+MongoDB实现一个博客系统(附源码)
# 基于Node.js搭建hexo博客过程详解
# node.js博客项目开发手记
# node.js实现博客小爬虫的实例代码
# Node.js完整实现博客系统详解
# 就把
# 给大家
# 这篇文章
# 文章列表
# 我的博客
# 的是
# 都是
# 超链接
# 好了
# 这就是
# 之路
# 博客
# 希望能
# 下一
# 写了
# 这篇
# 小编
# 先看
# 一篇文章
# 大家多多
相关文章:
建站DNS解析失败?如何正确配置域名服务器?
开封网站制作公司,网络用语开封是什么意思?
宝塔面板如何快速创建新站点?
建站之星多图banner生成与模板自定义指南
弹幕视频网站制作教程下载,弹幕视频网站是什么意思?
香港网站服务器数量如何影响SEO优化效果?
如何获取上海专业网站定制建站电话?
官网网站制作腾讯审核要多久,联想路由器newifi官网
如何快速启动建站代理加盟业务?
免费网站制作模板下载,除了易企秀之外还有什么H5平台可以制作H5长页面,最好是免费的?
如何在IIS中新建站点并解决端口绑定冲突?
网站制作的软件有哪些,制作微信公众号除了秀米还有哪些比较好用的平台?
c# F# 的 MailboxProcessor 和 C# 的 Actor 模型
制作宣传网站的软件,小红书可以宣传网站吗?
公司网站制作需要多少钱,找人做公司网站需要多少钱?
活动邀请函制作网站有哪些,活动邀请函文案?
如何在Golang中指定模块版本_使用go.mod控制版本号
Android滚轮选择时间控件使用详解
建站之星在线版空间:自助建站+智能模板一键生成方案
如何用狗爹虚拟主机快速搭建网站?
猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?
北京建设网站制作公司,北京古代建筑博物馆预约官网?
网站制作价目表怎么做,珍爱网婚介费用多少?
建站主机功能解析:服务器选择与快速搭建指南
如何在建站之星绑定自定义域名?
定制建站价位费用解析与套餐推荐全攻略
建站主机选择指南:服务器配置与SEO优化实战技巧
专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?
台州网站建设制作公司,浙江手机无犯罪记录证明怎么开?
如何高效完成独享虚拟主机建站?
如何基于云服务器快速搭建网站及云盘系统?
想学网站制作怎么学,建立一个网站要花费多少?
建站之星代理如何获取技术支持?
怀化网站制作公司,怀化新生儿上户网上办理流程?
广州美橙建站如何快速搭建多端合一网站?
学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?
专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?
网站制作大概多少钱一个,做一个平台网站大概多少钱?
建站中国官网:模板定制+SEO优化+建站流程一站式指南
网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?
如何通过PHP快速构建高效问答网站功能?
天津个人网站制作公司,天津网约车驾驶员从业资格证官网?
宝塔Windows建站如何避免显示默认IIS页面?
专业网站制作服务公司,有哪些网站可以免费发布招聘信息?
测试制作网站有哪些,测试性取向的权威测试或者网站?
网站制作的步骤包括,正确网址格式怎么写?
安徽网站建设与外贸建站服务专业定制方案
网站制作费用多少钱,一个网站的运营,需要哪些费用?
手机怎么制作网站教程步骤,手机怎么做自己的网页链接?
网站好制作吗知乎,网站开发好学吗?有什么技巧?
*请认真填写需求信息,我们会在24小时内与您取得联系。