2015-10-09 44 views
0

我必須瀏覽網站上的所有頁面,並檢查每個頁面上的元素。這必須以遞歸方式進行,我選擇使用PhantomJS來完成。所以,我基本上有這樣/這樣的代碼在main.js用phantomjs遞歸地瀏覽網頁

var page = require('webpage').create(); 

var allUrls = []; 

var pageCheck = function(url) { 

    page.open(url, function(success) { 

     page.evaluate(function(allUrls, nextPage) { 

      // crawl all links, and if they are from this site .. 
      // add them to the allUrls array .. 

      // then check the page for the element .. 

      // and go to next eventual page .. 
      setTimeout(nextPage, 250); 

     }, allUrls, nextPage); 

    }); 

}; 

var nextPage = function() { 

    var nextUrl = allUrls.unshift(); 
    if(nextUrl) pageCheck(nextUrl); 

}; 

pageCheck('http://example.com/'); 

,我調用此方法phantomjs main.js

但我看到消息「無法找到變量...」。當我清除所有 - 我現在看到Can't find variable: pageCheck

我該怎麼做? ... PhantomJS示波器的所有這些東西是什麼? ...

+0

的[找不到變量:網頁中PhantomJS]可能的複製(http://stackoverflow.com/questions/32954786/cant-find-variable- page-in-phantomjs) –

+0

感謝您的快速回復,但是我在第一次訪問'allUrls'和'nextPage'時無法訪問'page.evaluate'內容。但我通過將它們作爲參數傳遞給'page.evaluate'來解決這些問題。問題是這裏有兩個功能,而且他們似乎沒有看到對方? ......或者至少這就是它對我來說...... –

+0

正如我在回答結束時所說的,你不能將函數傳遞到頁面上下文中。我的答案的第一部分提供了一種適用於您的案例的解決方法。 –

回答

1

我設法弄清楚,這要歸功於@ArtjomB :)

基本上,我的錯誤是,我試圖從page.evaluate調用全球的東西,而我不得不使用它僅page操縱。所以我改變了代碼,這/這樣一個:

var page = require('webpage').create(); 

var allUrls = []; 

var pageCheck = function(url) { 

    page.open(url, function(success) { 

     var evalulation = page.evaluate(function() { 

      // gather urls and check element .. 

      return { 
       urls: ..., 
       checkedElement: ... 
      }; 

     }); 

     // manipulate the results from page.evaluate .. 
     someStuff(evalulation.urls); 
     otherStuff(evalulation.checkedElement); 

     // and THEN ... go to next eventual page .. 
     setTimeout(nextPage, 250); 

    }); 

}; 

var nextPage = function() { 

    var nextUrl = allUrls.unshift(); 
    if(nextUrl) pageCheck(nextUrl); 
    else phantom.exit(); 

}; 

pageCheck('http://example.com/');