Phantomjs page.content не извлекает содержимое страницы

Я использую Phantomjs для очистки веб-сайтов, использующих JavaScript и Ajax для загрузки динамического содержимого.
У меня есть следующий код:

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(); }); 

Проблема в том, что этот код не извлекает исходный код, который я хочу.
Если вы вводите URL-адрес через веб-браузер (например, хром) и читаете исходный код (динамический исходный код, после того, как были сделаны вызовы JavaScript и Ajax) на странице, вы увидите, что исходный код веб-браузера и источник Phantomjs код совершенно другой.
Но в этом случае мне нужен исходный код веб-браузеров.
Обычно этот код Phantomjs извлекает исходный код, который мне нужен, но в случае этого URL-адреса (многие другие) Phantomjs не извлекает правильный исходный код.
Я предполагаю, что Phantomjs не знает, как обрабатывать вызовы JavaScript и Ajax, загружающие динамический контент на эту страницу.
Я получаю эти ошибки при запуске кода:

 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") 

Итак, как мне получить динамический исходный код этой страницы ( http://www.betexplorer.com/soccer/germany/oberliga-bayern-sud/wolfratshausen-unterhaching-ii/x8rBMAB8/ ) с помощью Phantomjs?

Поскольку страница динамически генерируется, вам нужно немного подождать, прежде чем вы сможете получить доступ к предполагаемому источнику страницы.

 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 }); 

TypeError: 'undefined' is not a function ссылающейся на bind , потому что PhantomJS 1.x не поддерживает ее. PhantomJS 1.x использует старую вилку QtWebkit, которая сопоставима с Chrome 13 или Safari 5. В новой версии PhantomJS 2 используется более новый движок, поддерживающий bind . Если вы все еще используете версию 1.x, вам нужно добавить прокладку внутри 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; } }); }; 

Взято из моего ответа здесь .