2011-11-28 2 views
0

나는 예두 개 이상의 페이지를 동시에 스크랩하는 가장 좋은 전략은 무엇입니까?

http://net.tutsplus.com/tutorials/javascript-ajax/how-to-scrape-web-pages-with-node-js-and-jquery/comment-page-1/

을 따라 아주 잘했다.

하지만 내 경우 사용자가 양식을 제출할 때 하나 이상의 페이지를 스크랩해야합니다. 모든 요청은 내가 브라우저에 응답을 보낼 돌아 오면

내 코드는

app.get('/lookup', function (req, res) { 

var pagesToScrap = []; 
var callbackCounter = 0; 
var items = []; 

var callback = function(){ 
    if(pagesToScrap == callbackCounter){ 
     res.render('list', { 
      title: "Hello World", 
      items: items 
     }); 
    } 
    callbackCounter++; 
} 

var pageAResolver = function() { 
    request.get({ 
      uri: 'http://a.com', 
      //... 
     items.push[jsonData]; 
     callback(); 
    ); 
} 
var pageBResolver = function() { 
    request.get({ 
      uri: 'http://b.com', 
      //... 
     items.push[jsonData]; 
     callback(); 
    ); 
} 
var pageCResolver = function() { 
    request.get({ 
      uri: 'http://c.com', 
      //... 
     items.push[jsonData]; 
     callback(); 
    ); 
} 
pagesToScrap[0] = {url: "http://a.com", resolver: pageAResolver} 
pagesToScrap[1] = {url: "http://b.com", resolver: pageBResolver} 
pagesToScrap[2] = {url: "http://c.com", resolver: pageCResolver} 

for(var i = 0; i < pagesToScrap.length; i++){ 
    pagesToScrap[i].resolver(); 
} 
}); 

처럼 보인다. 때로는 많은 시간이 걸릴 수 있습니다. 이 데이터를 더 빨리 보여주기 위해 캐싱없이 최상의 전략은 무엇입니까?

socket.io에 대해 생각하고 있는데 데이터를 동시에 내보낼 수 있습니까? 얘들 아, 너 그것에 대해 어떻게 생각하니?

건배, 파블로 Cantero

답변

1

내가 https://github.com/caolan/async, 좋은 비동기 워크 플로우 라이브러리를 사용하는 것이 좋습니다. 비동기 페이지의 전체 목록을 처리,하지만 한 번에 N 페이지 기다리고 -

당신은 많은 수의 페이지를 긁어하는 경우
var async = require('async'); 

var pagesToScrape = [ 
    { url: "http://a.com" }, 
    { url: "http://b.com" }, 
    { url: "http://c.com" } 
]; 

// `async.map` will fire off all requests simultaneously 
// and collect the results for you: 

async.map(pagesToScrape, function(opts, callback) { 

    request.get(opts, function(res) { 
    // Do whatever analysis you need to get data from the page 
    var jsonData = getJsonDataFrom(res); 

    // Call callback when you've successfully scraped each page 
    // The first parameter to callback is for "errors" (null if no error) 
    // The second parameter is the jsonData object you want to use later. 
    callback(null, jsonData); 
    }); 
}, function done(err, items) { 
    // This function gets called when all the pages are finished 
    // items contains the list of jsonData returned to callback 
    console.log(items.length); // -> 3 

    var jsonData0 = items[0]; 
    console.log(jsonData0); // -> "{\"somedata":"fromthepage"... 
}); 

, forEachLimit 더 좋을 수 있습니다.

+0

내가 말한 예를 따라 https://github.com/mikeal/request를 사용하고 있습니다. 요청 모듈도 비동기입니다.이 데이터로 푸셔/혜성/긴 풀링을 만드는 것이 큰 문제입니다. 이 데이터를 개별적으로 응답에 보내고 싶습니다. 응답을 받으면 응답에 보내고 싶습니다. –

관련 문제