抓取网页生成电子书(这篇.+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')

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.+jade从博客爬取所有文章静态html文件的例子就是编辑器分享的所有内容。希望能给大家一个参考,也希望大家多多支持前端开发者。

  » 本文来自:前端开发者» 《Node.js+jade爬取文章的所有实例从blogs生成静态html文件_萌西_前端开发者》

  » 本文链接:

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线