API는 제공하지 않는 웹사이트에서 데이터를 쓰고 싶을 때에는 웹스크래핑 방식으로 데이터를 많이 들 가져오는데요. nodejs용으로 엄청 편한 라이브러리가 있어서 소개합니다. 예전에 이거 할 때 잘 모르던 꼬꼬마 시절에 html을 불러와서 indexOf같은 걸로 찾아서 substring해서 했던 것 같은데...찾아보니 훨씬 편한 라이브러리들이 많이 있네요.

제가 롯데마트를 주로 애용하는데요. 롯데마트에서 데이터를 다 긁어와서 어제보다 떨어진 상품 목록을 가져오는 기능과 상품가격이 떨어지면 유저에게 푸쉬를 보내는 앱을 만드려고 했는데, 어떤 분이 더 완벽하게 만드셔서...다른 아이템을 제작하기로...-_-

마트 자주 가시는 분들 마트모어 앱 쓰세요! 디게 좋네요!

https://play.google.com/store/apps/details?id=com.mart.trace


그래도 삽질한 것은 정리!!

cheerio 사이트

http://cheeriojs.github.io/cheerio/

cheerio github

https://github.com/cheeriojs/cheerio


예제 코드

코드를 잘 보면 jquery selector를 그대로 쓰는 것을 알 수 있습니다. request 라이브러를 통해서 웹사이트 html을 가져온 다음 cheerio를 이용해 파싱 후 jquery selector를 이용해 그대로 원하는 데이터를 가져오면 됩니다.

var request = require('request');
var cheerio = require('cheerio');

request({
    url: 'http://www.lottemart.com/category/categoryList.do?CategoryID=C001001100010001',
    headers: {
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.99 Safari/537.36'
    }
}, function(err, res, html) {
    if (err) {
        console.log(err);
        return;
    }
    var $ = cheerio.load(html);
    var liList = $('#list_prod_1').children('ul').children('li');
    for (var i = 0; i < liList.length; i++) {
        // productId를 가져오기 위함.
        var split = $(liList[i]).find('.pr_price .t_roman > span').attr('id').split('_');
        if (split.length < 2) {
            continue;
        }
        var productId = split[1];
        var price = $(liList[i]).find('#ItemCurrSalePrc_' + productId).text();
        price = price.replace(/,/gi, "");
        var title = $(liList[i]).find('#prodNm_' + productId).val();
        console.log(productId + ':' + title + '(' + price + ')');
    }
});


결과

node test.js 
8808836972445:고향의 향기미(20kg/국내산)(35900)
8804595000023:임금님표 이천쌀(10KG)(35800)
8809001961639:고시히카리(10Kg)(36500)
8808509000420:대왕님표 여주쌀(10kg)(35500)
8808433100029:GAP 철원오대미(10KG)(35000)
8808836972438:고향의 향기미(10Kg)(25000)
8809001740135:황토배기신동진쌀(10Kg)(28000)
8809013191468:금싸라기(10Kg)(28500)
8808433200026:철원평야쌀(10Kg)(30000)
8809001564052:서천농협 순미(20Kg)(58000)
8809088510638:즉석오대미(10KG)(39800)
L000000120009:경기도 김포금쌀 20kg [1,000포한정](49900)


 
Posted by 머드초보
,