본문 바로가기
프레임워크/[JS] node.js

[nodejs][cheerio] cheerio를 이용한 네이버 IT 뉴스 페이지 파싱하기

by hs_seo 2016. 4. 6.

nodejs 의 cheerio 모듈을 이용하여

네이버의 IT 뉴스 홈페이지를 파싱하는 소스이다.


한글파싱을 위하여 iconv-list 모듈을 이용하였다.



var request = require("request");
var cheerio = require('cheerio');
var iconv  = require('iconv-lite');

var requestOptions  = { method: "GET"
	 			,uri: "http://news.naver.com/main/list.nhn?mode=LS2D&mid=shm&sid1=105&sid2=731"
				,headers: { "User-Agent": "Mozilla/5.0" }
				,encoding: null
			};

request(requestOptions, function(error, response, body) {
	
    iconv.extendNodeEncodings();
    var strContents = new Buffer(body);
    //console.log(strContents.toString('euckr'));	// 한글로 바디 전체를 출력 

    $ = cheerio.load(strContents.toString('euckr'));
    //console.log($('.list_body.newsflash_body').html());	// 기사 목록을 출력 
    
    result = []
    $('.list_body.newsflash_body').find('li').each(function(index, ele) {


    	var dt1 = $(this).find('dt').eq(0);
    	console.log(dt1.find('a').attr('href'));
    	console.log(dt1.find('img').attr('src'));
    	console.log("***");

    	// 이미지가 없는 경우도 있기 때문에, 이를 확인하여 처리 
		var dt2;
    	if($(this).find(".photo").length == 1) {
    		dt2 = $(this).find('dt').eq(1);
    	} else {
    		dt2 = dt1;
    	}

    	//var dt2 = $(this).find('dt').eq(1);
    	console.log(dt2.find('a').attr('href'));
    	console.log(dt2.find('a').text());
    	console.log("***");
    	var dd = $(this).find('dd').eq(0);
    	console.log(dd.text());
    	console.log(dd.find(".writing").text());
    	console.log(dd.find(".date").text());
    	
    	// 기사의 정보를 result 에 맵으로 입력 1
    	result.push({'url' : dt1.find('a').attr('href'),
    				 'img' : dt1.find('img').attr('src'),
    				 'title' : dt2.find('a').text().trim(),
    				 'content' : dd.text().trim(),
    				 'writing' : dd.find(".writing").text().trim(),
    				 'date' : dd.find(".date").text().trim()});

    	console.log(new Buffer($(this).html()).toString('euckr'));
    	console.log("---------------------------");
    });

    console.log(result); 
});





반응형