2013-06-04 24 views
0

我試圖爲nodeJS構建一個非常簡單的刮板函數 - 只是一個函數,我可以將URL傳遞給它,並且它返回所刮取的數據爲var data構建一個簡單的Node.js刮板函數

我完全新的Node.js而不能工作,爲什麼下面不工作:

var request = require('request'); 
var cheerio = require('cheerio'); 

function scrape(url) { 
    console.log("Scraping: " + url); 
    request(url, function(err, resp, body) { 

      if (err) { 
       throw err; 
      } 
      var html = cheerio.load(body); 
      return html; 
     }); 
} 


var data = scrape('http://www.stackoverflow.com'); 

$ = data; 
var logo = $('#hlogo a').text(); 
console.log(logo); 

上面的代碼應該返回"Stack Overflow"但顯然不會。當我在控制檯中運行時,出現錯誤:

var logo = $('#hlogo a').text(); 
     ^
TypeError: Property '$' of object #<Object> is not a function 

任何想法爲什麼這不適用於我?

回答

2

您的data將不確定,因爲scrape函數沒有返回值,因此它意味着它是異步的。

您需要更改的邏輯是這樣的:

function scrape(url, oncomplete) { 
    console.log("Scraping: " + url); 
    request(url, function(err, resp, body) { 

     if (err) { 
      throw err; 
     } 
     var html = cheerio.load(body); 
     oncomplete(html); 
    }); 
} 


scrape('http://www.stackoverflow.com', function(data) { /* do work here*/ }); 
+0

能不能介紹一下爲什麼異步是壞在這裏解釋一下?我希望能夠在它上面放置多個URL並統一拖放它們(例如,在一個數組中有100個URL),並使用'for循環'遍歷它們並在每個URL上並行調用'scrape()'。或者我不是undertsanding異步? – Jascination

+0

我說異步是不好的?因爲JS是單線程的異步請求是實現「並行」抓取的唯一方法,但是你的代碼沒有考慮到異步。邏輯應該如何看 – Tommi

+0

啊,有道理,乾杯隊友。 – Jascination