본문 바로가기
nodejs

[node.js] 프로젝트 개발 - 크롤링, 형태소 분석, mysql서버 insert

by jinbro 2017. 7. 11.
[계획과 실행 혹은 테스트 코드]
- 첫번째 모듈 : 크롤링, 코드는 아래에 있음
(1) request 헤더, 메세지 설정한 후 요청 날림 : request module
(2) request에 대한 response가 날아오면 두번째 파라미터 콜백함수가 실행됨 : cheerio 파싱
=> 1, 2번은 Promise를 리턴하는 함수로 만들기, 모듈화해서 두번째 모듈에서 함수 호출, then에서 형태소 분석 기능 호출
    => 크롤링이 완료되면 크롤링 결과에 따라 형태소 분석 함수가 호출되거나, 에러 메세지를 띄울 수 있도록 하기위해
    => 콜백 지옥을 벗어나는 길, 콜백함수에 대한 순서를 보장하기위한 방법 : 상태를 가짐
    => crawl 함수는 Promise 인스턴스를 리턴 : 파라미터로 성공했을 때, 실패했을 때에 대한 처리함수를 호출할 수 있는 콜백함수를 가짐
        => 콜백함수 내에 하려고 한 비동기 작업 코드를 넣음 
        => Promise 생성자로 인스턴스 생성되면 콜백함수는 자동적으로 호출 : 비동기 작업 시작~!
    
=> 주의할 것 : for문을 돌릴 때 request 콜백함수가 i를 참조하면 window.i를 참조하게됨
    => 호출할 때 window.i를 참조해서 호출하기때문에 0,1,2,3 이게 아니라 마지막 index값을 i로 참조
    => let을 쓰면 window 스코프에 추가되지않음


=> 비동기 작업 : 요청에 대한 응답 처리(콜백함수) 함수 호출이 비동기(언제 결과가 올지 모름)이기 떄문에 요청은 for i 기준
    => 콜백함수 처리가 3일 때(count 전역변수 - 콜백 한번 처리할 때마다 +1)  resolve 호출
        => cnt는 클로저 개념 : return 시 crawl의 cnt 참조


- 두번째 모듈 : 형태소 분석
(0) 1, 2번 단계가 있지만 3번 단계에서 1, 2번을 모두 할 수 있음 : 이런게 있구나 3번에서 저걸 왜 하지 정도를 알기위해 1, 2번도 적음

(1) 형태소 분석을 위해서 필요한 프로젝트를 다운로드 받아야함 : mecab-ko 
=> mecab은 일본어 분석을 위해 만들어진 것인데 은전한닢 프로젝트 라는 한국어 형태소 분석 프로젝트가 mecab을 포크하고 만듦
=> mecab-ko 와 mecab-ko-dic 설치해야함

(2) 설치 후 mecab 명령어 엔터 친 후 문장 입력해보기 
=> 아래는 분석 결과
=> 품사 별로 나열

(3) mecab-ko를 nodejs 환경에서 js 코드로 제어 가능한 모듈 설치 : mecab-ya
=> mecab-ya readme.md를 보면 1, 2번을 한꺼번에 할 수 있는 파일까지 포함되어있음
=> 1,2번 설치 방법을 제대로 하지못했다면 mecab-ya를 npm으로 설치하고 mecab-ko를 설치하는 방법에 따라 그대로 설치하면 됨
=> 예제 스크립트
conconst mecab = require('mecab-ya');

mecab.nouns('안녕하세요', function (err, result) {
    console.log(result);

    /* string 형태로, 없다면 여기서 끝내도록 하고 insert에서도 연결하지못하도록 해야함 */
    return ;
});
=> 아래 이미지 : 설치 방법에 따라 설치 후 예제 스크립트를 돌린 다음에 나온 결과



[코드 모듈화 결과]
- 여러 기능을 하는 코드가 한 데에 모여있으면 나중에 유지보수하기 어려울 것 같아서 모듈화함
=> 크롤링하고 형태소 분석까지 하는 것 모두 비동기처리라서 Promise 사용

- 아직 파싱 처리는 하지않음 : 커다란 구조(골격)부터 완성 시켜놓은 후 프로그래밍적인 것을 다듬어 갈 것
- 아직 control 처리는 하지않음 : 발생할 수 있는 경우의수 생각해서 처리할 것


(1) 크롤링
'use strict';

const request = require('request');

const url = [
        'http://media.daum.net/breakingnews/politics'
];

var crawl = function(){

    var cnt = 0;

    return new Promise(function(resolve, reject){
        for(let i=0; i= url.length){
                     /* 파싱 결과 넣기 */
                     resolve('끝');
                  }
           });
           /* end request function */
        }
  });
  /* end promise instance return */
};

module.exports = crawl;






(2) 형태소 분석 및 mysql 접속 후 데이터 추가
const crawler = require('./crawler.js');
const mecab = require('mecab-ya');
const mysql = require('mysql');

const connection = mysql.createConnection({
    host     : process.env.DB_HOST,
    port     : parseInt(process.env.DB_PORT, 10),
    user     : process.env.DB_USER,
    password : process.env.DB_PASSWD,
    database : process.env.DB_NAME
});

crawler()
    .then(function(data){
        console.log(data);

        /* 파싱된 결과를 첫번째 파라미터로 : string 형태로 넣어야함 */
        mecab.nouns('안녕하세요', function (err, result) {
            console.log(result);

            /* string 형태로, 없다면 여기서 끝내도록 하고 insert에서도 연결하지못하도록 해야함 */
      /* mysql */
      connection.connect(function(err) {
      if (err) {
            console.error('error connecting: ' + err.stack);
              return;
      }
    

    connection.query('SELECT * FROM word', function(err, res, fields){
        if(err){
      console.error(err.stack);
      return;
        }

        console.log(res[0]);
        connection.end();   
    });
      });
   
        });
    }, function(msg){
          console.log(msg);
    })
    .catch(function(err){
       throw err;
    });




[참고자료]




댓글