Mar*_*ing 4 javascript phantomjs casperjs
我目前正在与PhantomJS和CasperJS合作,以搜索网站中的链接.该网站使用javascript动态加载结果.但是下面的代码片段并没有让我获得该页面包含的所有结果.我需要的是向下滚动到页面底部,查看微调器是否显示(意味着还有更多内容),等待新内容加载后再继续滚动直到不再显示新内容.然后将带有类名的链接存储.title在一个数组中.链接到网页进行抓取.
var casper = require('casper').create();
var urls = [];
function tryAndScroll(casper) {
casper.waitFor(function() {
this.page.scrollPosition = { top: this.page.scrollPosition["top"] + 4000, left: 0 };
return true;
}, function() {
var info = this.getElementInfo('.badge-post-grid-load-more');
if (info["visible"] == true) {
this.waitWhileVisible('.badge-post-grid-load-more', function () {
this.emit('results.loaded');
}, function () {
this.echo('next results not loaded');
}, 5000);
}
}, function() {
this.echo("Scrolling failed. Sorry.").exit();
}, 500);
}
casper.on('results.loaded', function () {
tryAndScroll(this);
});
casper.start('http://example.com/', function() {
this.waitUntilVisible('.title', function() {
tryAndScroll(this);
});
});
casper.then(function() {
casper.each(this.getElementsInfo('.title'), function(casper, element, j) {
var url = element["attributes"]["href"];
urls.push(url);
});
});
casper.run(function() {
this.echo(urls.length + ' links found:');
this.echo(urls.join('\n')).exit();
});
Run Code Online (Sandbox Code Playgroud)
我看过这个页面.您的误解可能是您认为.badge-post-grid-load-more元素在加载下一个元素后就会消失.不是这种情况.它根本没有变化.您必须找到另一种方法来测试是否将新元素放入DOM中.
例如,您可以检索当前数量的元素,并用于waitFor检测数字何时更改.
function getNumberOfItems(casper) {
return casper.getElementsInfo(".listview .badge-grid-item").length;
}
function tryAndScroll(casper) {
casper.page.scrollPosition = { top: casper.page.scrollPosition["top"] + 4000, left: 0 };
var info = casper.getElementInfo('.badge-post-grid-load-more');
if (info.visible) {
var curItems = getNumberOfItems(casper);
casper.waitFor(function check(){
return curItems != getNumberOfItems(casper);
}, function then(){
tryAndScroll(this);
}, function onTimeout(){
this.echo("Timout reached");
}, 20000);
} else {
casper.echo("no more items");
}
}
Run Code Online (Sandbox Code Playgroud)
我也精简tryAndScroll了一点.有完全不必要的函数:第一个casper.waitFor没有等待,onTimeout因此永远不会调用回调.
| 归档时间: |
|
| 查看次数: |
1129 次 |
| 最近记录: |