Phantomjs page.content non sta recuperando il contenuto della pagina

Uso Phantomjs per analizzare i siti Web che utilizzano JavaScript e Ajax per caricare contenuti dinamici.
Ho il codice seguente:

var page = require('webpage').create(); page.onError = function(msg, trace) { var msgStack = ['ERROR: ' + msg]; if (trace && trace.length) { msgStack.push('TRACE:'); trace.forEach(function(t) { msgStack.push(' -> ' + t.file + ': ' + t.line + (t.function ? ' (in function "' + t.function +'")' : '')); }); } console.error(msgStack.join('\n')); }; page.onConsoleMessage = function(msg, lineNum, sourceId) { console.log('CONSOLE: ' + msg + ' (from line #' + lineNum + ' in "' + sourceId + '")'); }; page.open('http://www.betexplorer.com/soccer/germany/oberliga-bayern-sud/wolfratshausen-unterhaching-ii/x8rBMAB8/', function () { console.log(page.content); phantom.exit(); }); 

Il problema è che questo codice non recupera il codice sorgente che voglio.
Se inserisci l’URL tramite un browser web (come chrome) e leggi il codice sorgente (il codice sorgente dinamico, dopo aver effettuato le chiamate JavaScript e Ajax) della pagina, vedrai che il codice sorgente del browser Web e l’origine Phantomjs il codice è completamente diverso.
Ma in questo caso ho bisogno del codice sorgente del browser web.
Di solito questo codice Phantomjs recupera il codice sorgente di cui ho bisogno, ma nel caso di questo url (molti altri) Phantomjs non recupera il codice sorgente corretto.
Presumo che Phantomjs non sappia come gestire le chiamate JavaScript e Ajax che caricano il contenuto dinamico in questa pagina.
Ottengo questi errori quando eseguo il codice:

 ERROR: TypeError: 'undefined' is not a function (evaluating 'function(e){ this.pointer.x = e.pageX; this.pointer.y = e.pageY; }.bind(this)') TRACE: -> http://www.betexplorer.com/gres/tooltip.js?serial=1410131213: 207 -> http://www.betexplorer.com/gres/tooltip.js?serial=1410131213: 157 -> http://www.betexplorer.com/gres/tooltip.js?serial=1410131213: 310 (in function "tooltip") -> http://www.betexplorer.com/soccer/germany/oberliga-bayern-sud/wolfratshausen-unterhaching-ii/x8rBMAB8/: 291 -> http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js: 2 -> http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js: 2 -> http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js: 2 -> http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js: 2 CONSOLE: Invalid App Id: Must be a number or numeric string representing the application id. (from line #undefined in "undefined") CONSOLE: FB.getLoginStatus() called before calling FB.init(). (from line #undefined in "undefined") 

Quindi, come posso ottenere il codice sorgente dinamico di questa pagina ( http://www.betexplorer.com/soccer/germany/oberliga-bayern-sud/wolfratshausen-unterhaching-ii/x8rBMAB8/ ) usando Phantomjs?

Poiché la pagina viene generata dynamicmente, è necessario attendere un po ‘prima di poter accedere all’origine della pagina desiderata.

 page.open('http://www.betexplorer.com/soccer/germany/oberliga-bayern-sud/wolfratshausen-unterhaching-ii/x8rBMAB8/', function () { setTimeout(function(){ console.log(page.content); phantom.exit(); }, 5000); // 5 sec should be enough }); 

L’errore TypeE TypeError: 'undefined' is not a function riferisce al bind , perché PhantomJS 1.x non lo supporta. PhantomJS 1.x utilizza un vecchio fork di QtWebkit che è paragonabile a Chrome 13 o Safari 5. Il nuovo PhantomJS 2 utilizza un motore più recente che supporta bind . Se si utilizza ancora la versione 1.x, è necessario aggiungere uno shim all’interno della page.onInitialized Gestore eventi page.onInitialized :

 page.onInitialized = function(){ page.evaluate(function(){ var isFunction = function(o) { return typeof o == 'function'; }; var bind, slice = [].slice, proto = Function.prototype, featureMap; featureMap = { 'function-bind': 'bind' }; function has(feature) { var prop = featureMap[feature]; return isFunction(proto[prop]); } // check for missing features if (!has('function-bind')) { // adapted from Mozilla Developer Network example at // https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/bind bind = function bind(obj) { var args = slice.call(arguments, 1), self = this, nop = function() { }, bound = function() { return self.apply(this instanceof nop ? this : (obj || {}), args.concat(slice.call(arguments))); }; nop.prototype = this.prototype || {}; // Firefox cries sometimes if prototype is undefined bound.prototype = new nop(); return bound; }; proto.bind = bind; } }); }; 

Tratto dalla mia risposta qui .