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 를 묶어줄 때 비어있는 값 등으로 문제 발생.
댓글 없음:
댓글 쓰기