Node.js+jade+mongodb+mongoose 파충류 분리 입고 및 정적 파일 생 성 방법
그러면 제 가 선택 한 데이터 베 이 스 는 mongodb 입 니 다.왜 이 데이터 베 이 스 를 사용 합 니까?이 데이터 베 이 스 는 집합 을 바탕 으로 하 는 것 이기 때문에 데이터 의 조작 은 기본적으로 json 입 니 다.dom 모듈 cheerio 와 매우 큰 친화력 을 가지 고 있 습 니 다.cheerio 는 걸 러 낸 데 이 터 를 처리 하고 mongodb 를 직접 삽입 할 수 있 습 니 다.어떠한 처리 도 거치 지 않 아 도 매우 편리 합 니 다.물론 node.js 와 의 친화력 은 말 할 필요 도 없습니다.더 중요 한 것 은 성능 이 좋다 는 것 이다.이 글 은 저 는 mongodb 의 기본 적 인 용법 을 구체 적 으로 쓰 지 않 습 니 다.그 때 는 다른 글 을 0 부터 mongodb 의 기본 적 인 상용 용법 을 쓸 것 입 니 다.먼저 입고 효과 와 정적 파일 생 성 효 과 를 살 펴 보 겠 습 니 다.
나 는 이 단계 에서 파충 류 를 2 개의 모듈 로 분리 하여 입고(crawler.js)를 수집 하여 정적 파일(MakeHtml.js)을 생 성 한다.
crawler.js:
var http = require('http');
var cheerio = require('cheerio');
var mongoose = require('mongoose');
mongoose.Promise = global.Promise;
var DB_URL = 'mongodb://localhost:27017/crawler';
var aList = []; //
var aUrl = []; // url
var db = mongoose.createConnection(DB_URL);
db.on('connected', function (err) {
if (err) {
console.log(err);
} else {
console.log('db connected success');
}
});
var Schema = mongoose.Schema;
var arcSchema = new Schema({
id: Number, // id
title: String, //
url: String, //
body: String, //
entry: String, //
listTime: Date //
});
var Article = db.model('Article', arcSchema);
function saveArticle(arcInfo) {
var arcModel = new Article(arcInfo);
arcModel.save(function (err, result) {
if (err) {
console.log(err);
} else {
console.log(`${arcInfo['title']} `);
}
});
}
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,
url: 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);
saveArticle(arcDetail);
if ( aUrl.length ) {
setTimeout(function () {
if (aUrl.length) {
crawlerArc(aUrl.shift());
}
}, 100);
}else {
console.log( ' ' );
return;
}
});
});
}
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);
다른 핵심 모듈 은 별로 바 뀌 지 않 았 습 니 다.주로 데이터 베이스 연결,데이터 베이스 생 성,집합 생 성(관계 형 데이터 베이스 에 해당 하 는 표 집합),Schema(관계 형 데이터 베이스 에 해당 하 는 표 구조)를 추 가 했 습 니 다.mongoose 작업 데이터베이스(save:데이터 삽입).파일 생 성 모듈 을 분리 합 니 다.
makeHtml.js 파일
var fs = require('fs');
var jade = require('jade');
var mongoose = require('mongoose');
mongoose.Promise = global.Promise;
var DB_URL = 'mongodb://localhost:27017/crawler';
var allArc = [];
var count = 0;
var db = mongoose.createConnection(DB_URL);
db.on('connected', function (err) {
if (err) {
console.log(err);
} else {
console.log('db connected success');
}
});
var Schema = mongoose.Schema;
var arcSchema = new Schema({
id: Number, // id
title: String, //
url: String, //
body: String, //
entry: String, //
listTime: Date //
});
var Article = db.model('Article', arcSchema);
function makeHtml(arcDetail) {
str = jade.renderFile('./views/layout.jade', arcDetail);
++count;
fs.writeFile('./html/' + count + '.html', str, function (err) {
if (err) {
console.log(err);
}
console.log( `${arcDetail['id']}.html ` + count );
if ( allArc.length ){
setTimeout( function(){
makeHtml( allArc.shift() );
}, 100 );
}
});
}
function getAllArc(){
Article.find( {}, function( err, arcs ){
allArc = arcs;
makeHtml( allArc.shift() );
} ).sort( { 'id' : 1 } );
}
getAllArc();
이상 의 Node.js+jade+mongodb+mongoose 는 파충류 분리 입고 와 정적 파일 생 성 을 실현 하 는 방법 은 바로 소 편 이 여러분 에 게 공유 하 는 모든 내용 입 니 다.참고 하 시기 바 랍 니 다.여러분 들 도 많이 응원 해 주시 기 바 랍 니 다.