[node.js]
- 자바스크립트 런타임
- 자바스크립트를 해석할 인터프리터 + 라이브러리(모듈)
[데이터수집]
- 크롤링 : 데이터 수집 과정을 크롤링(crawling)이라 함
- 두 단계로 나뉘어짐
1) 스크래핑(scraping) : 데이터를 가져오는 방법
- 데이터가 존재하는 곳의 형태에 따라 스크래핑 방법을 정해야함 : 인증이 필요하거나 어떤 버튼 누르는 절차가 필요하거나 등
2) 파싱(parsing) : 가져온 데이터에서 필요한 데이터를 추출하는 방법
- 각각의 역할에 맞는 모듈을 사용하기
1) 스크래핑 : http, https, request
2) 파싱 : cheerio, JSDOM
- 두 단계를 합친 모듈이 있을 것
[node 모듈을 사용해서 데이터 수집해보기]
- request, cheerio 모듈 사용하기 : 디렉토리 만들고 -g 로 모듈 인스톨하지말고 해당 디렉토리에서만 사용하게 인스톨하기
1) request : http 요청해서 응답 결과받기
const request = require('request');
const url = 'http://news.nate.com/recent?cate=pol&mid=n0201&type=c&date=20170702';
request({
uri: url,
method: 'GET',
headers: {
'Accept-Charset': 'utf-8'
}
}, function(err, res, body){
console.log(body);
});
request(url, function(err, res, body){
if(err){
throw err;
}
console.log(body); //응답받은 html 문서의 body tag 내용을 콘솔에 출력함
});
- 내장모듈인 http를 사용해도되나 request 모듈이 사용하기 편함 : https도 지원
- async 인 것은 코딩할 때 까먹지않기
- request는 req HTTP 구성(첫번째 파라미터)하고 요청하고, 응답을 받으면 콜백함수 호출
- res는 response HTTP를 볼 수 있음
=> 지금은 응답받은 문서하나를 스크래핑한거지만(가장 기본), request 모듈 api 문서를 보면 다양한 상황에 대한 대처방법이 있음
=> 예를 들어 페이지 내 페이지 접근 : pipe 제공
2) cheerio : 받아온 데이터에서 필요한 데이터 추출하기
const cheerio = require('cheerio');
const $ = cheerio.load(body, {
decodeEntities: false
});
console.log( $('.list_allnews li .cont_thumb .tit_thumb .link_txt') );
- $ 변수에 스크래핑한 데이터를 로드하고(cheerio 메서드), jquery처럼 사용 : querySelector나 querySelectorAll
- load할 때 옵션값은 두번째 파라미터 : decodeEntities를 false로 주지않으면 텍스트 노드 한글이 다 깨지더라구요
- 필요한 데이터를 추출하기위해서 DOM API를 어떻게 구성해야할지 알아놓기 : CSS Selector
=> 필요한 cheerio 메서드 사용하기 : object 타입으로 리턴받음(기본적으로)
[결론]
- 좋은 모듈은 많음 : 적절하게 혼용하면 됨, 좋은 모듈을 만들 수 있는 개발자가 되는 것이 중요하겠지?
=> 그럴려면 기초는 탄탄해야한다는 것
- 앞으로 정치 키워드 관련 크롤러를 만들기위해서 : 여러 사이트를 어떻게 처리할건지, 데이터를 파싱한 후 어떤 형태로 저장할건지 등 알기
[참고자료]
- 위키피디아, 파싱 : https://en.wikipedia.org/wiki/Parsing
'nodejs' 카테고리의 다른 글
[node.js] mysql 모듈 - aws rds mysql 인스턴스 연동하기 (0) | 2017.07.05 |
---|---|
[node.js] node + 외부 db - mysql 세팅, db, table 생성, 다루기 (0) | 2017.07.04 |
[node.js] 외부DB 연동 전 준비하기 #1 - RHEL + mysql (0) | 2017.06.26 |
[node.js] express - 라우터, 컨트롤러 나누기 (1) | 2017.06.20 |
[node.js] express - session : 로그인 (0) | 2017.06.19 |
댓글