2015-10-21 62 views
1

我們正在製作一個簡單的腳本來瀏覽網站的站點地圖,並獲取所有鏈接和href值,然後將其保存到.json列表中,這是另一個模塊可以用來截取這些訪問過的頁面的屏幕截圖。使用節點騎馬人將節點鏈接保存爲.json

到目前爲止,我們可以獲得抓取列表的功能。當它在控制檯中運行時,我們想要放入數組的數據顯示出來。

在終端中運行時,沒有發現任何內容,並且該數組未填充。在測試運行時

var fs = require('fs'); 
 

 
var Horseman = require('node-horseman'); 
 
var horseman = new Horseman(); 
 

 
function findAllUrls(selector) { 
 

 
    var urls = []; 
 

 
    // get all the anchors 
 
    $(selector).each(function() { 
 

 
    // loop through each anchor and get the href value 
 
    var url = { 
 
     title: $(this).text(), 
 
     url: $(this).attr("href") 
 
    }; 
 

 
    // put the href value in a new array 
 
    urls.push(url); 
 
    }); 
 

 
    // finally return the array of all the href value 
 
    console.log("Log all urls from findAllUrls", urls); 
 
    return urls; 
 
}; 
 

 
horseman 
 
    .open(URL goes here) 
 
    .evaluate(findAllUrls, '.sitemap-links a') 
 
    .then(function(urls) { 
 
    console.log(urls); 
 
    // Save the urls to a json file (lookup node 'fs' module) 
 
    fs.writeFile('urls.json', urls, function (err) { 
 
     if (err) throw err; 
 
     console.log('saved to urls.json'); 
 
    }); 
 
    }) 
 
    .close();

東西是越來越跳過。我有一種感覺,就是用PhantomJS模擬瀏覽器,而不是讓數組繼續通過。

回答

0

Horseman是一個基於Promise的API。因此,findAllUrls必須返回一個承諾。然後期待一個承諾,而不是一個數組。發生了什麼是。然後在findAllUrls返回之前運行,因爲它不期望任何事情。我建議你閱讀承諾hereThis是另一篇有關承諾的優秀文章。最後,來自騎士文檔的this example與您正在嘗試的操作非常相似。

像這樣的東西應該會很適合你正在嘗試做的(未測試)工作:

function findAllUrls(selector) { 
    return horseman.evaluate(function() { 
     var urls = []; 

     // get all the anchors 
     $(selector).each(function() { 

     // loop through each anchor and get the href value 
     var url = { 
      title: $(this).text(), 
      url: $(this).attr("href") 
     }; 

     // put the href value in a new array 
     urls.push(url); 
     }); 

     // finally return the array of all the href value 
     console.log("Log all urls from findAllUrls", urls); 
     return urls; 
    }); 
}; 
0

我遇到了類似的問題。它只是意味着你的評估函數的某個地方,騎手遇到了一個錯誤(但是根據經驗,它沒有顯示它是什麼錯誤)。如果遇到錯誤,它將自動返回null。

解決方案是仔細檢查您的評估函數,逐行生成一個錯誤,這可能是困難的,因爲騎手並不指出哪一行是有問題的。

注意,評估函數有多個選項用於返回一個值:回調函數,承諾和實際值。因此可以立即返回值,不需要承諾,正如文檔中所討論的那樣。