我在尝试取消此网页的价格时遇到了麻烦:http://www.voyages-bateau.com
它看起来很简单,但我尝试的任何抓取服务/工具似乎都适用于此页面。其内容通过 ajax 加载,价格稍后以动画显示。我尝试wait()
和waitFor()
没有运气的帮助者...
这是我用来获取这个坏男孩的代码:
var casper = require('casper').create({
verbose: true,
logLevel: "debug"
});
casper.start('http://voyages-bateau.com', function() {
console.log(this.getHTML()); // no content loaded yet
});
casper.waitForSelector('//*[@id="WRchTxt0-3cb"]/h2[3]/span', function() {
var res = this.getHTML();
this.echo(res);
});
casper.run();
我收到的只是错误:“等待 5000 毫秒超时,正在退出。”。有什么想法吗?
最佳答案
主要问题是 PhantomJS 1.x 不支持 Function.prototype.bind
。解决方法可以在这里找到:CasperJS bind issue 。因此,JavaScript 不会运行,因为存在页面错误,并且您什么也看不到,因为它是 JS 驱动的页面。
您可以通过注册 page.error
事件来验证这一点:
casper.on("page.error", function(pageErr){
this.echo("page.err: " + JSON.stringify(pageErr));
});
这会产生这个
page.err: "TypeError: 'undefined' is not a function (evaluating 'b.bind(a)')"
page.err: "TypeError: 'undefined' is not a function (evaluating 'c.bind(null,\"margin\")')"
page.err: "TypeError: 'undefined' is not a function (evaluating 'RegExp.prototype.test.bind(/^(data|aria)-[a-z_][a-z\\d_.\\-]*$/)')"
否则不会弹出调试输出或启用详细信息。
另一个问题是您忘记使用 XPath 的 XPath 实用程序:
var x = require('casper').selectXPath;
顶部及之后的某个位置:
casper.waitForSelector(x('//*[@id="WRchTxt0-3cb"]/h2[3]/span'), function() {
var res = this.getHTML();
this.echo(res);
});
如果没有 XPath 实用程序,它会尝试将其解释为 CSS 选择器。既然你有verbose: true
,你必须已经看到
[error] [remote] findAll(): invalid selector provided "//*[@id="WRchTxt0-3cb"]/h2[3]/span":Error: SYNTAX_ERR: DOM Exception 12
关于javascript - 抓取 ajax 加载内容中的值会导致白页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27466716/