Javascript 在不滚动的情况下,刮取无限滚动页面会停止
我目前正在与PhantomJS和CasperJS合作,在网站中搜寻链接。该网站使用javascript动态加载结果。然而,下面的代码片段并没有让我获得页面包含的所有结果。我需要的是向下滚动到页面底部,查看是否显示微调器(意味着还有更多的内容),等待新内容加载完毕,然后继续滚动,直到不再显示新内容。然后将类名为Javascript 在不滚动的情况下,刮取无限滚动页面会停止,javascript,phantomjs,casperjs,Javascript,Phantomjs,Casperjs,我目前正在与PhantomJS和CasperJS合作,在网站中搜寻链接。该网站使用javascript动态加载结果。然而,下面的代码片段并没有让我获得页面包含的所有结果。我需要的是向下滚动到页面底部,查看是否显示微调器(意味着还有更多的内容),等待新内容加载完毕,然后继续滚动,直到不再显示新内容。然后将类名为.title的链接存储在一个数组中。链接到用于刮削的 var casper = require('casper').create(); var urls = []; function try
.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();
});
我已经看过这一页了。您的误解可能是您认为
.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");
}
}
我还简化了一点
tryAndScroll
。有完全不必要的函数:第一个casper.waitFor
根本没有等待,因此onTimeout
回调永远无法调用。+1太好了,你对我的误解是对的。现在,当我运行时出现错误:等待10000毫秒超时已过期,正在退出。
。你能把整个代码块都贴出来吗?我一定是把它放错了是的,问题是没有传递onTimeout回调,超时错误就会被抛出,脚本会过早停止。我添加了回调并增加了超时时间。请记住,现在页面上有600个链接,还有一个新创建的链接可以打开第二个页面,可以滚动加载更多的项目。完美!我现在理解了onTimeout Callback的问题您是对的,它会刮取所有600个结果,是否可能只刮取最多100个结果?当然,curItems
变量就在那里。您可以使用另一个if块来检查它是否大于100,并且只有当它小于100时才执行casper.waitFor
。