【发布时间】:2014-10-15 11:59:44
【问题描述】:
我使用 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();
});
问题是这段代码没有检索到我想要的源代码。
如果你通过网页浏览器(如 chrome)输入 URL 并阅读页面的源代码(动态源代码,在进行 JavaScript 和 Ajax 调用之后),你会看到网页浏览器源代码和 Phantomjs 源代码完全不同。
但在这种情况下,我需要网络浏览器源代码。
通常这个 Phantomjs 代码会检索我需要的源代码,但在这个 url(任何其他 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")
那么如何使用 Phantomjs 获取该页面的动态源代码(http://www.betexplorer.com/soccer/germany/oberliga-bayern-sud/wolfratshausen-unterhaching-ii/x8rBMAB8/)?
【问题讨论】:
-
好的,我注册了 onConsoleMessage 和 OnError 事件并更新了我的问题。
标签: javascript html ajax web-scraping phantomjs