我已经在某些网站上尝试过此代码,但是在其他网站上看起来PhantomJS和casperJS无法成功等待动态加载的内容。即使在等待几分钟后,JavaScript加载的内容也不会被casperJS看到。
var casper = require('casper').create({
pageSettings: {
loadImages: false
}
});
casper.start('https://betyetu.co.ke/sportsbook/SOCCER/');
casper.waitFor(function check() {
return this.evaluate(function () {
return document.querySelectorAll('div.events-app__group').length > 1;
});
}, function then() {
this.echo('Found elements');
}, function timeout() {
this.echo('Still timing out before returning element count');
}, 60000);
casper.run();
当我仅查询没有该类的div时,它返回已找到匹配元素的消息。这是来自外部脚手架,不需要JS来加载。具有我感兴趣的数据的所有内部元素都不会被加载/不能用于casperJS。为什么会这样?
答案 0 :(得分:1)
CasperJS是一个用于运行PhantomJS脚本的帮助程序库。 PhantomJS已经过时了不支持现代JavaScript的网络引擎,因此网站将在PhantomJS中越来越频繁地破解。目标站点是在PhantomJS甚至Internet Explorer 11中完全无法工作的站点之一。
但是使用 polyfills ,模拟旧浏览器的新js功能的库,我们可以使用CasperJS更长一点。在PhantomJS中创建页面后,我在注入优秀的core.js库,但在访问该站点之前。这样,我们的旧浏览器将拥有一组新的JavaScript功能。
var casper = require('casper').create({
// it's better to blend with the crowd
pageSettings: {
userAgent: "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36",
loadImages: false
},
viewportSize : { width: 1280, height: 720 },
verbose: true,
});
// Apply the bandaid in the form of core.js polyfill
casper.on('page.initialized', function() {
casper.page.injectJs('./core.js');
});
casper.start('https://betyetu.co.ke/sportsbook/SOCCER/');
casper.waitFor(function check() {
return this.evaluate(function () {
return document.querySelectorAll('div.events-app__group').length > 1;
});
}, function then() {
var count = this.evaluate(function () {
return document.querySelectorAll('div.events-app__group').length;
});
this.echo('Found elements: ' + count);
casper.capture('screen.jpg');
}, function timeout() {
this.echo('Still timing out before returning element count');
}, 5000);
casper.run();
找到的元素:28