본문 바로가기
nodejs

[node.js] 프로젝트에서 실제 동작할 때 쓰일 크롤러

by jinbro 2017. 7. 19.
[사용하는 모듈 및 문법]
(1) require : 필요한 데이터가 있는 문서를 서버에 요청하고 응답받는 모듈(스크래핑 작업)
(2) cheerio : 응답받은 문서에서 필요한 데이터를 쉽게 가져오기위한 모듈(파싱 작업)
(3) mecab-ya : 파싱한 문장 안에서 진짜 필요한 명사만을 긁어내기위해 사용하는 모듈(+ mecab 프로그램 설치해야함)
(4) Promise : 여러번 처리하는 require(비동기) 요청-응답 완료 후 mecab을 실행시키기위해 사용하는 ES6 문법


[실행코드]
"use strict";

const request = require('request');
const cheerio = require('cheerio');
const mecab = require('mecab-ya');

function crawler(){
    var promises = [];
    //var pageNum = 1;

    for(var pageNum=1; pageNum<10; pageNum++){
        var p = new Promise(function(resolve, reject){
            request(`http://media.daum.net/breakingnews/politics?page=${pageNum}®Date=20170716`, function(err, res, body){      
                var $ = cheerio.load(body);
                resolve($('.cont_thumb .tit_thumb .link_txt').text());
            });
        }); /* end create Promise obj */

        promises.push(p);   
    }

    return promises;
}

Promise.all(crawler()).then(function(data){
    mecab.nouns(data.toString(), function(err, result){
        console.log(result);
    });
});
- 함수를 실행하면 바로 Promise 객체 리턴하지않고, 객체를 쟁여두었다가 한번에 실행
=> Promise.all
=> 페이지가 여러개이기때문에 이렇게 처리

- nouns()는 파싱된 데이터(문장)에서 명사만 추려내는 메서드
=> then(function(data)) 의 data는 배열(array - 특화 object) : toString() 사용해서 string 타입 변환

- 아래는 크롤러 및 형태소 분석 결과



[더하기]

- 데이터 저장 : 수많은 명사를 어떻게 관리할 것인가

=> 하나하나 다 저장하면 낭비일 것 : mysql 모듈로 mysql 접속해서 쿼리 던질 때 해당 날짜에 해당 키워드 있는지 체크하고 카운팅 or 생성해야겠음

- 날짜마다 몇개의 페이지까지 긁을 것인가 : 끝까지 다할 것인가? 아니면 제한 개수를 둘 것인가?

- 크롤링 타임 정하기 : crond(crontab) 돌릴 타임을 정해야함



댓글