2016-02-18 56 views
1

我使用phantomjs 2.1.1,有些事情正在困擾着我。 下面是一段代碼,我使用的刮網址和網站的HTML被寫入output.html文件phantomjs - 在頁面加載後執行Javascript函數,然後輸出新的更改

page = require('webpage').create(); 
    page.open(url, function (status) { 
     if (status !== 'success') { 
      console.log('Unable to load the address!'); 
      phantom.exit(); 
     } else { 
      window.setTimeout(function() { 
       var content = page.content; 
       fs.write("output.html", content, 'w'); 
      }, 40000); //40 seconds timeout 
     } 
    }); 

現在,我需要刮其paginations了。下一頁由JavaScript函數頁面(2)加載;或第(3)頁;我試圖把它用

var pageinationOutput = page.evaluate(function (s) { 
    page(2); 
}); 
console.log(pageinationOutput); // I need the output made by the `page(2);` call. 

     page = require('webpage').create(); 
      page.open(url, function (status) { 
       if (status !== 'success') { 
        console.log('Unable to load the address!'); 
        phantom.exit(); 
       } else { 
        window.setTimeout(function() { 
         var content = page.content; 
         fs.write("output.html", content, 'w'); 
        }, 40000); //40 seconds timeout 
       } 
      }); 

做,但我沒有得到這方面的任何輸出。 如何在頁面完成加載後執行JavaScript函數,並獲得發生在javascript執行後的網站內容的新更改,在這種情況下,網站將在頁面(2)後調用下一頁(使用ajax) );方法調用。

在此先感謝!

回答

0

我自己發現瞭解決方案,但我不確定它是否是完美的解決方法。

代碼:

page.open(url, function (status) { 
    if (status !== 'success') { 
     console.log('Unable to load the address!'); 
     phantom.exit(); 
    } else { 
     window.setTimeout(function() { 
      var content = page.content; 
      fs.write("output.html", content, 'w'); 
      page.evaluate(function (cb) { 
       window.page(2); 
      }); 
      var waiter = window.setInterval(function() { 
       var nextPageContent = page.evaluate(function (cb) { 
        return document.documentElement.outerHTML; 
       }); 
       if (nextPageContent !== false) { 
        window.clearInterval(waiter); 
        fs.write("output-2.html", content, 'w'); 
       } 
      }, 40000);//40 seconds timeout 

     }, 40000);//40 seconds timeout 
    } 
}); 
0

我最近出版的一期工程,讓到瀏覽器PHP訪問。在這裏獲取:https://github.com/merlinthemagic/MTS。它也是引擎蓋下的PhantomJS。

如果你提供了URL,我可以做一個工作的例子。我需要知道你如何確定最後一頁。在這個例子中,我簡單地將它設置爲10. 我還需要知道頁面按鈕是否具有id屬性,如果他們沒有問題,我們會找到觸發它們的另一種方法。但對於這個例子,我認爲他們這樣做,並使其簡單標識的page_2,page_3 ....

下載和安裝您只需使用下面的代碼後:

$myUrl   = "http://www.example.com"; 
$windowObj  = \MTS\Factories::getDevices()->getLocalHost()->getBrowser('phantomjs')->getNewWindow($myUrl); 

//now you can either retrieve the DOM for each page: 
$doms = array(); 
//get the initial page DOM 
$doms[] = $windowObj->getDom(); 

$pageID = "page_"; 
$lastPage = 10; 
for ($i = 2; $i <= $lastPage; $i++) { 
    $windowObj->mouseEventOnElement("[id=".$pageID. $i . "]", 'leftclick'); 
    $doms[] = $windowObj->getDom(); 
} 

//$doms now hold all the pages, so you can parse them. 
相關問題