Node.js+jade 블 로그 의 모든 글 을 캡 처 하여 정적 html 파일 을 만 드 는 인 스 턴 스

이 글 에서 우 리 는 위 에서 수집 한 모든 글 목록 의 정 보 를 정리 하고 글 을 수집 하 며 정적 html 파일 을 만 들 기 시 작 했 습 니 다.먼저 나의 수집 효 과 를 보 세 요.나의 블 로 그 는 현재 77 편의 글 을 1 분 도 안 되 어 모두 수집 하여 생 성 되 었 습 니 다.여기 서 나 는 일부 그림 을 캡 처 했 습 니 다.파일 이름 은 문장의 id 로 생 성 되 었 고 생 성 된 글 입 니 다.나 는 간단 한 정적 템 플 릿 을 썼 다.모든 글 은 이 템 플 릿 에 따라 생 성 되 었 다.
프로젝트 구성:



자,다음은 이 글 이 주로 실현 하 는 기능 에 대해 설명 하 겠 습 니 다.
1.글 을 캡 처 합 니 다.주로 글 의 제목,내용,하이퍼링크,글 id(정적 html 파일 생 성 에 사용)를 캡 처 합 니 다.
2,jade 템 플 릿 에 따라 html 파일 생 성
1.글 을 캡 처 하 는 것 은 어떻게 실현 합 니까?
아주 간단 합 니 다.위의 글 목록 을 캡 처 하 는 것 과 차이 가 많 지 않 습 니 다.

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 은 글 의 주소 입 니 다.글 의 내용 을 캡 처 한 후에 filter Article(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 파일 을 생 성 하 는 인 스 턴 스 는 바로 작은 편집 이 여러분 에 게 공유 하 는 모든 내용 입 니 다.참고 하 시기 바 랍 니 다.여러분 들 이 저 희 를 많이 지지 해 주시 기 바 랍 니 다.

좋은 웹페이지 즐겨찾기