Estoy tratando de automatizar el raspado de un sitio con "desplazamiento infinito" con Python y Playwright.
El problema es que Playwright no incluye, hasta el momento, una función de desplazamiento y mucho menos una función de desplazamiento automático infinito.
Por lo que encontré en la red y mis pruebas personales, puedo automatizar un desplazamiento infinito o finito usando la función page.evaluate() y algo de código Javascript.
Por ejemplo, esto funciona:
for i in range(20): page.evaluate('var div = document.getElementsByClassName("comment-container")[0];div.scrollTop = div.scrollHeight') page.wait_for_timeout(500) El problema con este enfoque es que funcionará especificando una cantidad de pergaminos o diciéndole que continúe para siempre con un ciclo while True .
Necesito encontrar una manera de decirle que siga desplazándose hasta que se cargue el contenido final.
Este es el Javascript que estoy probando actualmente en page.evaluate() :
var intervalID = setInterval(function() { var scrollingElement = (document.scrollingElement || document.body); scrollingElement.scrollTop = scrollingElement.scrollHeight; console.log('fail') }, 1000); var anotherID = setInterval(function() { if ((window.innerHeight + window.scrollY) >= document.body.offsetHeight) { clearInterval(intervalID); }}, 1000)Esto no funciona ni en mi navegador firefox ni en el navegador firefox de Playwright. Regresa inmediatamente y no ejecuta el código en intervalos.
Estaría agradecido si alguien pudiera decirme cómo puedo, usando Playwright, crear una función de desplazamiento automático que detectará y se detendrá cuando llegue al final de una página web que se carga dinámicamente.
Así que encontré una solución de trabajo.
Lo que hice fue combinar Javascript con código python Playwright.
Comienzo setInterval con un temporizador de 200 ms para desplazarme hacia abajo en la página con page.evaluate() y luego lo sigo con un bucle de python que verifica cada segundo si la altura total de la página (desplazamiento incluido) ha cambiado. Si cambia, continúa desplazándose y si no ha cambiado, el desplazamiento ha terminado.
Esto es lo que parece:
page.evaluate( """ var intervalID = setInterval(function () { var scrollingElement = (document.scrollingElement || document.body); scrollingElement.scrollTop = scrollingElement.scrollHeight; }, 200); """ ) prev_height = None while True: curr_height = page.evaluate('(window.innerHeight + window.scrollY)') if not prev_height: prev_height = curr_height time.sleep(1) elif prev_height == curr_height: page.evaluate('clearInterval(intervalID)') break else: prev_height = curr_height time.sleep(1)