2015-10-09 36 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/');