2013-07-20 3 views
0

GitHub에 로봇 호스팅이라는 프로젝트를 진행 중입니다. 내 프로젝트의 일은 XML 구성 파일에서 제공되는 URL에서 미디어를 가져 오는 것입니다. xml 구성 파일은 스크립트 디렉토리에서 볼 수있는 것처럼 정의 된 형식을가집니다.노드 js의 미디어 스파이더

  1. 웹 링크가 얼마나 깊은 나타내고, 목록 항목에서 선택 (CSS 선택기)에 따른 목록, 내가 찾을 수 있습니다 : below.There 두 인수가 같은

    내 문제입니다 미디어 URL 또는 하위 페이지 URL에서 미디어를 찾을 수 있습니다.

  2. 하위 페이지 URL을 포함하는 arr입니다.

로 아래의 간단한 예 :

node_list = {..., next = {..., next= null}}; 
url_arr = [urls]; 

나는 URL의 편곡에있는 모든 항목을 반복 할, 그래서 아래와 같이 수행

function fetch(url, node) { 
    if(node == null) 
     return ; 
    // here do something with http request 
    var req = http.get('www.google.com', function(res){ 
     var data = ''; 
     res.on('data', function(chunk) { 
      data += chunk; 
     }.on('end', function() { 
      // maybe here generate more new urls 
      // get another url_list 
      node = node.next; 
      fetch(url_new, node); 
     } 
} 

// here need to be run in sync 
for (url in url_arr) { 
    fetch(url, node) 
} 

당신이 볼 수 있듯이, 경우 비동기 http 요청을 사용하면 모든 시스템 자원을 필요로합니다. 그리고 나는 그 과정을 통제 할 수 없다. 누구든지이 문제를 해결할 좋은 아이디어가 있습니까? 또는 nodejs가 그런 작업을 수행하는 적절한 방법이 아닙니까?

답변

1

너무 많은 HTTP 요청을받는 것이 문제라면 fetch 함수를 변경하여 URL 스택에서 작동하도록 할 수 있습니다.

기본적으로 당신이 할 것 :

fetch가 호출
  • , 스택에 URL을 삽입하고 요청이 진행중인 경우 확인 : 요청이 실행되지
  • 경우, 첫 번째 URL을 선택 스택 및 프로세스에서, 그렇지 않으면 아무것도하지
  • HTTP 요청이 완료
  • , 그것은

이 방법은 당신이있을 수 있습니다 스택 및 프로세스에서 새 URL을 가지고 있습니다 for 루프는 지금처럼 모든 URL을 추가하지만, 한 번에 하나의 URL 만 처리되므로 너무 많은 리소스가 사용되지 않습니다.

+0

[node_curl] (https://github.com/fengmk2/node-curl.git) 프로젝트가 정상적으로 내 문제를 해결했습니다. –