Please Enable JavaScript!
Gon[ Enable JavaScript ]

NodeJS 를 이용해서 웹 사이트 스크래핑(크롤링) 하는 방법

NodeJS
반응형

NodeJS 를 이용해서 웹 사이트 스크래핑(크롤링) 하는 방법

 

환경: Eclipse Mars

 

스크래핑이란 웹 사이트에 접속해서 HTML을 다운받은 후 데이터를 가공, 수집하는  행위를 말합니다. 방대한 웹 페이지를 사람이 일일이 분석해서 필요한 정보를 얻기에는 비효율적입니다. 스크래핑은 사람 대신 웹 문서를 검색하고 분석하는 일을 자동으로 수행합니다. 물론 스크래핑 프로그램은 사람이 작성해야겠죠. 수집한 정보는 데이터베이스에 저장했다가 재활용합니다. 요즘은 스크래핑 서버로 NodeJS 를 많이 이용합니다. 오늘은 기본 기능인 웹 사이트로 접속해서 HTML 전체를 다운받아 파일로 저장하거나 콘솔에 출력해 보겠습니다.

 

먼저 http fs 모듈을 이용해서 웹사이트 정보를 다운받아 저장해 보겠습니다. 분석을 위한 가장 기초적인 로직입니다. 접속 URL 은 제가 운영하는 블로그 주소 입니다. http 모듈을 이용해서 사이트에 접속한 후 fs 로 파일을 저장합니다.

var http = require('http');
var fs = require('fs');

var url = "http://mainia.tistory.com/2884";
var path = "article.html";

var outfile = fs.createWriteStream(path);

http.get(url, function(res){
	res.pipe(outfile);
	res.on('end', function(){
		outfile.close();
		console.log("file down end.");
	});
	
});


그림처럼 http 모듈의 get 함수를 이용하면 입력한 주소에 소스를 다운받을 수 있습니다.

 

다음은 분석 모듈을 이용해서 HTML 본문을 콘솔에 출력해 보겠습니다. cheerio-httpcli 모듈을 다운받습니다. 이 모듈은 파일을 쉽게 다운로드 할 수 있을 뿐만 아니라 jQuery 처럼 웹 페이지 내에 지정한 요소를 쉽게 꺼낼 수 있습니다. 앞으로 웹 페이지 분석할 때 자주 사용할 모듈입니다. npm 을 이용해서 모듈을 다운 받습니다.

 

C:\ > npm install cheerio-httpcli --save

 

> spawn-sync@1.0.15 postinstall D:\node_modu

les\spawn-sync

> node postinstall

 

WorkingServer@0.0.0 D:\Project\ProjectNodeJS\workplace\WorkingServer

`-- cheerio-httpcli@0.7.2

  +-- @types/cheerio@0.22.7

  +-- @types/node@8.9.4

  +-- async@2.6.0

  | `-- lodash@4.17.5

.....(생략)

 

npm WARN WorkingServer@0.0.0 No repository field.

 

소스는 다음과 같습니다. cheerio-httpcli 모듈의 fetch 함수를 사용합니다. fetch 에 필요한 인자는 “URL”, “파라미터”, “콜백 함수 입니다. 파라미터는 아무것도 없으므로 공백을 넘깁니다. URL 을 접속해서 가져온 정보는 $ 에 담겨 있습니다. html() 함수를 이용해서 값을 꺼냅니다

var client = require('cheerio-httpcli');

var url = "http://mainia.tistory.com/2884";
var param = {};

client.fetch(url, param, function(err, $, res){
	// 에러 체크 
	if(err){
		console.log("err");
		return;
	}
	
	var body = $.html();
	console.log(body);
});

그림은 cheerio-httpcli 을 이용해서 추출한 HTML 을 콘솔에 출력한 결과 입니다.


반응형
Posted by 녹두장군1
,