2016년 2월 17일 수요일

[nodejs] cheerio + monk 크롤링 후 mongodb 에 삽입 패턴


var client = require('cheerio-httpcli');
var request = require('request');
var monk = require('monk');
var db = monk('localhost:27017/test');


var step = function(x) {
        if (x < 16) {
                doit(x, function(res) {
                        step(x+1);
                }); 
        }   
};
    
step(1);

function doit(index, next) {
        var url = "http://myurl.com/" + index + ".page";
        var coll = db.get('my_mongo_collection');
        client.fetch(url, {}, function(err, $, res) {
                for (var i = 1 ; i <= 50 ; i++) {
                        var item1_path = "#content > li:nth-child(" + i + ") > span > span";
                        var item2_path =  "#content > li:nth-child(" + i + ") > span > a";
          
                        var item1 = $(item1_path).text();
                        var item2 = $(item2_path).text();
                        
                        if (item1 === "" && item2 === "") break; 

                        var doc = { 
                                'type' : 'myitem',
                                'item1' : item1, 
                                'item2' : item2
                        };  

                        coll.insert(doc);
                }   
                next();
        }); 
}

step function : doit function 을 16번 수행해주기위한 일종의 for 문.
                        동기적으로 순차적으로 진행하기 위해서 재귀형식으로 구현

page 에 순차적으로 접근해서 거기 안에 있는 아이템들을 순차적으로 획득
item1과 item2가 의미적으로 묶여져야 할 경우에 차라리 위와 같이 구현하는게 속편했음.
일반적으로는 li:nth-child(i) 를 쓰지 않고 li 로 전부 다 싹 가져오는 식으로 사용.
그럼 item1 과 item2 를 묶어줄 때 비어있는 값 등으로 문제 발생.

댓글 없음:

댓글 쓰기