[계획과 실행 혹은 테스트 코드]
- 첫번째 모듈 : 크롤링, 코드는 아래에 있음
(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;
});
[참고자료]
'nodejs' 카테고리의 다른 글
[node.js] 핫키워드 서비스 관련 모듈 - 타이머 (0) | 2017.07.29 |
---|---|
[node.js] 프로젝트에서 실제 동작할 때 쓰일 크롤러 (0) | 2017.07.19 |
[node.js] mysql 모듈 - aws rds mysql 인스턴스 연동하기 (0) | 2017.07.05 |
[node.js] node + 외부 db - mysql 세팅, db, table 생성, 다루기 (0) | 2017.07.04 |
[node.js] node.js에서 데이터 수집하기 (0) | 2017.07.02 |
댓글