본문 바로가기

Node.js

node js 웹 크롤링 예제 - request로 사진(웹툰 프리뷰) 수집하기



웹 크롤링을 이용해 네이버 웹툰 페이지에 있는 프리뷰들을 모두 수집하고,

그것을 통해 새로 html파일에 정리하는 예제를 만들어보겠습니다.



● getSrc.js

프리뷰들의 img src 및 정보들을 data.json에 json형식으로 저장해주는 모듈


var request=require('request');
var cheerio=require('cheerio');
var fs=require('fs');
var url="http://comic.naver.com/webtoon/weekday.nhn";

//getting img srcs from the url
function getSrc(){
	var dataArr=[];
	var dataPath='data.json';
	request(url, async function(err, res, body){
		var $=cheerio.load(body);
		var lastLen=$('.col').eq(6).find('img').length;
		//it means the length of last one, sunday
		
		$('.col ').each(async function (day, item){
			var index=0;
			$(item).find('img').each(function(num, item){;
				var src=$(item).attr('src');
				if(src.substr(src.length-3, 3)=='jpg'){
					console.log(day+', '+index);
					var data={
						day:day,
						num:getNumberInFormat(index),
						title:'No Tiltle yet',
						src:src
					};
					index++;
					dataArr.push(data);
				}
				//console.log(day+' , '+num);
				if(day==6 &&num==lastLen-1){
					
					//this means last, should be modified
					fs.writeFileSync(dataPath, JSON.stringify(dataArr));
					console.log('wrote json file!');
				}
			});
		});
	});	
};

function getNumberInFormat(num){
	var min=0, max=99;
	if(min<=num && num<=max){
		if(0<=num && num<=9){
			return '0'+num;
		}
		else{
			return num;
		}
	}
}

module.exports=getSrc;



● naver.js

getSrc.js를 통해 data를 data.json에 담고

data.json의 정보를 불러와 분류하는 앱

express를 이용한 기타 라우터 및 index라우터를 제공한다.

//COLLECTING WEBTOON PREVIEWS
var url="http://comic.naver.com/webtoon/weekday.nhn";	//now url is naver webtoon site
var request=require('request');
var requestP=require('request-promise');
var cheerio=require('cheerio');
var fs=require('fs');
var getSrcs=require('./getSrcs.js');
var dataPath='data.json';
var dataArr=[];
var tasksArr=[];

getSrcs();

setTimeout(async function(){
	console.log('go');
	var string=await fs.readFileSync(dataPath, 'utf-8');
	var data=JSON.parse(string);
	var _i=-1;	//to check if it's first src
	for(var i=0; i<data.length; i++){
		var item=data[i];
		var src=item.src;
		var day=item.day;
		var num=item.num;
		if(_i!=day){
			console.log("Day "+day+" pipe");
			_i++;
		}
		request(src).pipe(fs.createWriteStream(__dirname+'/imgs/'+day+'_'+num+'.jpg'));
	}
}, 4000);


var express=require('express');
var app=express();
app.listen(80);
app.use(express.static(__dirname));
//image files are saved in Directory imgs.
//and set routes for them
app.use(express.static('imgs'));

app.get('/', function(req, res){
	console.log('someone in');
	res.sendFile(__dirname+'/index.html');
});
app.get('/renew', function(req, res){
	fs.readdir(__dirname+'/imgs', function(err, fileArr){
		var body="<h1>Naver Webtoon Previews</h1>";
		for(var i=0; i<fileArr.length; i++){
			var day=fileArr[i].charAt(0);
			var num=fileArr[i].substr(2, 2);
			console.log(fileArr[i]);
			if(num==='00'){
				console.log('true');
				switch(day){
					//case 0: - unavailable
					//case '0': - good
					case '0':body+='<h1>MON</h1>'; break;
					case '1':body+='<h1>TUE</h1>'; break;
					case '2':body+='<h1>WED</h1>'; break;
					case '3':body+='<h1>THU</h1>'; break;
					case '4':body+='<h1>FRI</h1>'; break;
					case '5':body+='<h1>SAT</h1>'; break;
					case '6':body+='<h1>SUN</h1>'; break;
				}
			}
				body+='<img src="';
				body+='/'+fileArr[i];
				body+='">';	
			}
		fs.writeFile('index.html', body, function(){
			res.send('Sent!!');	
		});
	});
});