Node.js+jade+mongodb+mongoose 파충류 분리 입고 및 정적 파일 생 성 방법

이 어 이 글 은Node.js+jade 블 로그 의 모든 글 을 캡 처 하여 정적 html 파일 을 만 드 는 인 스 턴 스계속 되 었 다.이 글 에서 채집 과 정적 파일 의 생 성 을 실현 했다.실제 채집 항목 에 서 는 먼저 입고 한 다음 에 선택 적 으로 정적 파일 을 생 성 해 야 한다.
그러면 제 가 선택 한 데이터 베 이 스 는 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 는 파충류 분리 입고 와 정적 파일 생 성 을 실현 하 는 방법 은 바로 소 편 이 여러분 에 게 공유 하 는 모든 내용 입 니 다.참고 하 시기 바 랍 니 다.여러분 들 도 많이 응원 해 주시 기 바 랍 니 다.

좋은 웹페이지 즐겨찾기