抓取无限滚动页面将停止而不滚动
Scraping an infinite scroll page stops without scrolling
我目前正在使用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();
});
我看过这个页面。您的误解可能是您认为加载下一个元素后.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
回调。
相关文章:
- 结合jQuery和jetpack无限滚动
- jquery/ajax无限滚动事件
- 内容结束时停止无限滚动
- 使用滚动溢出-x进行无限循环
- jquery无法使用无限滚动
- 无限滚动交替
- 无限滚动更改ID问题
- 如何在重建URL后从URL中传递过滤值,目的是使用Angular2和Typescript实现无限滚动
- 使用jquery或javascript延迟无限滚动
- Javascript-Nightmare.JS无限滚动操作
- Javascript-无限滚动JSON数组
- 如何正确地以无限滚动浏览网页
- 无限滚动jquery不起作用
- 我如何发送AJAX请求的内容是通过无限滚动加载的
- jQuery逻辑-无限滚动+调用javascript
- jQuery-无限滚动
- 刷新jqGrid;t在启用无限滚动的情况下保存当前页面位置
- 我如何从一个无限滚动的网站抓取图像,其中api是隐藏的,我无法通过使用Inspect Element获得它->网络
- 无限滚动在IE中返回多个结果
- Angular UI Grid重用的网格无法重置滚动+无限滚动无法工作