抓取网页生成电子书(这篇.+jade博客所有文章生成静态html文件的实例小编)
优采云 发布时间: 2022-03-29 21:12抓取网页生成电子书(这篇.+jade博客所有文章生成静态html文件的实例小编)
在这个文章中,我们将从上面的采集中整理出所有文章列表的信息,启动采集文章,生成静态html文件。来看看我的采集的效果,我的博客目前有77篇文章文章,不到1分钟就全部生成了采集,这里我截了一些图片,文件name是生成文章的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、title、hyperlink、content),然后使用jade的renderFile的api替换模板内容,
模板内容替换后,肯定要生成html文件,所以使用writeFile写入文件,写入文件时,使用id作为html文件的名称。这是生成静态html文件的实现,
下一步就是循环生成一个静态html文件,就是下面这行:
if (aUrl.length) crawlerArc(aUrl.shift());
aUrl 保存了我博客的所有文章 url,每次采集 写完一篇文章,删除当前文章 的url,让下一篇文章 @文章的url出来了,继续采集
完整的实现代码服务器:
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')
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.+jade从博客爬取所有文章静态html文件的例子就是编辑器分享的所有内容。希望能给大家一个参考,也希望大家多多支持前端开发者。
» 本文来自:前端开发者» 《Node.js+jade爬取文章的所有实例从blogs生成静态html文件_萌西_前端开发者》
» 本文链接: