Casperjs grattant le contenu dynamique

J'essaie de gratter cette page en utilisant Casperjs. La fonction principale de mon code fonctionne très bien, mais le contenu est chargé dynamiquement et je ne peux pas comprendre comment le déclencher.

C'est ce que je fais en ce moment:

casper.waitFor(function() { this.scrollToBottom(); var count = this.evaluate(function() { var match = document.querySelectorAll('.loading-msg'); return match.length; }); if (count <= 1) { return true; } else { return false }; }, function() { // do stuff }); 

Le délai d'attente vient d'expirer, même si je l'ai augmenté à 20s et le nouveau contenu n'est jamais chargé. J'ai essayé d'adapter cette fonction à mon cas:

 function tryAndScroll(casper) { casper.waitFor(function() { this.page.scrollPosition = { top: this.page.scrollPosition["top"] + 4000, left: 0 }; return true; }, function() { var info = this.getElementInfo('p[loading-spinner="!loading"]'); if (info["visible"] == true) { this.waitWhileVisible('p[loading-spinner="!loading"]', function () { this.emit('results.loaded'); }, function () { this.echo('next results not loaded'); }, 5000); } }, function() { this.echo("Scrolling failed. Sorry.").exit(); }, 500); } 

Mais je ne pouvais pas comprendre et je ne suis même pas sûr que cela soit pertinent ici. Des idées?

J'ai regardé la page. Il est tellement certain qu'il ne charge pas les images du milieu lorsque vous passez à la fin.

Lorsque la page est chargée, les premières lignes sont complètement chargées et d'autres ne sont pas complètement chargées (image manquante indiquée par '.loading-msg' ). Lorsque vous sautez à la fin avec this.scrollToBottom(); Il n'y a pas de défilement continu. Il saute jusqu'à la fin et la page JavaScript ne détecte pas que les images du milieu se trouvaient dans la fenêtre, mais brièvement. La page continue à charger les lignes suivantes, mais pas les images manquantes des rangées surpassées.

Vous devez réduire la distance du saut dans vos deux extraits.

Le premier peut être changé comme ceci:

 var pos = 0, height = casper.page.viewportSize.height; casper.waitFor(function() { this.scrollTo(0, pos * height); return !this.exists('.loading-msg'); }, function() { // do stuff }, 20000); 

Le second pourrait fonctionner en changeant

 this.page.scrollPosition = { top: this.page.scrollPosition["top"] + 4000, left: 0 }; 

à

 var height = casper.page.viewportSize.height; this.page.scrollPosition = { top: this.page.scrollPosition.top + height, left: 0 };