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)