2013-12-13 4 views
1

첫째, 여기 내 코드입니다 : 당신이 볼 수 있듯이node.js + cheerio scrape : 다운로드 할 URL 배열을 전달 하시겠습니까? 지금까지 진행 한으로

var http = require("http"); 

// Utility function that downloads a URL and invokes 
// callback with the data. 
function download(url, callback) { 
    http.get(url, function(res) { 
    var data = ""; 
    res.on('data', function (chunk) { 
     data += chunk; 
    }); 
    res.on("end", function() { 
     callback(data); 
    }); 
    }).on("error", function() { 
    callback(null); 
    }); 
} 

var cheerio = require("cheerio"); 

var url = "http://www.bloglovin.com/en/blogs/1/2/all"; 
var myArray = []; 
var a = 0; 

var getLinks = function(){download(url, function(data) { 
    if (data) { 
    // console.log(data); 
    var $ = cheerio.load(data); 
    $(".content").each(function(i, e) { 
     var blogName = $(e).find(".blog-name").text(); 
     var followLink = $(e).find("a").attr("href"); 
     var blogSite = $(e).find(".description").text(); 

     myArray[a] = [a]; 
     myArray[a]["blogName"] = blogName; 
     myArray[a]["followLink"] = "http://www.bloglovin.com"+followLink; 
     myArray[a]["blogSite"] = blogSite; 

     a++; 

     console.log(myArray); 

    }); 
    } 
}); 
} 

getLinks(); 

, followLinks가 나는 'url' 다운로드를 통과하고 싶은의 followUrl로 연결됩니다 그래서 효과적으로, I 해당 CSS 규칙을 사용하여 각 페이지를 긁어서 해당 블로거의 다차원 배열에 추가합니다.

어떻게해야합니까? 배열 키로만 정수를 가질 수 있기 때문에 당신은 a = 0;을 정의

+0

두 호출 - 다른 배열로 내 parseRow 기능과 각각의 HTML 세그먼트를 밀어 배열로 각 데이터 행의 HTML을 가져, 각각의 반복을 처리하기 위해 async.parallel를 사용할 수 있습니까? 붙여 넣기 오류 인 – sachinjain024

+0

중 하나를 제거하십시오! – user3015175

답변

0

그래서

myArray[a] = [a]; // => myArray[0] = [0]; myArray[0] becomes an array with 0 as only member in it 

이 모든 문은 오류가 발생.

myArray[a]["blogName"] = blogName; 
myArray[a]["followLink"] = "http://www.bloglovin.com"+followLink; 
myArray[a]["blogSite"] = blogSite; 

대신이 시도 : 루프 내부

var obj = { 
    index: a, 
    blogName: blogName, 
    followLink: "http://www.bloglovin.com" + followLink, 
    blogSite: blogSite 
} 

myArray.push(obj); 
console.log(myArray); 
0

을, 단지 특성을 가진 개체를 만들려면 다음 배열에 객체를 밀어 쳤어요.

var blogInfo = { 
    blogName: blogName, 
    followLink: "http://www.bloglovin.com"+followLink; 
    blogSite: blogSite 
}; 
myArray.push(blogInfo); 
+0

멋진데. 그렇다면 어떻게 followLink 내의 URL을 사용하여 각 페이지를 다 쓸 수 있습니까? – user3015175

1

내 근근이 작업 중 하나에서 비슷한 작업을하지만, 수행하기 위해 async.js 라이브러리를 사용합니다. 또한 나는 모듈과 cheerio.js을 사용하고 있습니다. 하나의 웹 페이지에서 데이터 행을 가져 와서 다 쳤지 만, URL을 가져오고 같은 방식으로 요청/긁기와 비슷한 작업을 할 수 있다고 의심해보십시오.

나는 또한 이것이 매우 기본적인 코딩임을 인정하며, 약간의 리팩토링으로 확실히 최적화 될 수있다.

첫째, 내 구문 분석 함수 페이지를 가져 오지 및 전화 요청을 사용하여 ... 당신 적어도 몇 가지 아이디어를 제공 희망 -

var url = 'http://www.target-website.com'; 
function(lastCallback) { 
    request(url, function(err, resp, body) { 
     if(!err) { parsePage(err, resp, body, lastCallback); } 
      else { console.log('web request error:' + resp.statusCode); } 
    } 
} 

다음으로, 내 parsePage 기능에, 나는 힘내라에 웹 사이트를로드 `http` 모듈을 포함하는

var rows = []; 
function parsePage(err, resp, body, callback1) { 
    var $ = cheerio.load(body); 
    $('div#targetTable tr').each(function(i, elem) { 
     rows.push($(this).html()); 
    }); 

    var scrRows = []; 
    rows.forEach(function(row) { 
     scrRows.push(function(callback2) { 
      parseRow(err, resp, row); 
      callback2(); 
    }); 

    async.parallel(scrRows, function() { 
     callback1(); 
    }); 
}