Cómo scrapear páginas de scroll infinito con Python

Cómo hacerlo, Python, Scraping, Nov-02-20225 minutos de lectura

En el mundo actual, todo el mundo hace uso de las nuevas tecnologías. Puede acceder a los datos estructurados de forma automatizada con la ayuda del web scraping. Por ejemplo, puede utilizar el web scraping para: El scrolling infinito, también conocido como desplazamiento sin fin, es una técnica de diseño web que los sitios web utilizan a menudo con AJAX o Javascript.

Índice

En el mundo actual, todo el mundo hace uso de las nuevas tecnologías. Puede acceder a los datos estructurados de forma automatizada con la ayuda del web scraping. Por ejemplo, puede utilizar el web scraping para:

  • Control de precios
  • Generación de clientes potenciales
  • Seguimiento de las noticias
  • Estudios de mercado
  • Inteligencia de precios

El desplazamiento infinito, también conocido como scroll sin fin, es una técnica de diseño web que los sitios web suelen utilizar con AJAX o Javascript para cargar contenido adicional de forma dinámica cuando el usuario se desplaza hasta la parte inferior de la página web. Esta técnica ha ganado popularidad gracias a su éxito en las redes sociales. Por ejemplo, el desplazamiento infinito en Twitter se produce mediante carga asíncrona. Twitter realiza llamadas AJAX después de cargar la página para añadir continuamente nuevos contenidos a medida que se desplaza. Aunque el desplazamiento infinito tiene muchas ventajas, no es recomendable para tareas de búsqueda orientadas a objetivos que requieren que la gente localice un contenido concreto.

Entendamos primero las ventajas de scrapear páginas de scroll infinito.

¿Por qué es necesario scrapear páginas de scroll infinito?

Estas son algunas de las razones para scrapear páginas de scroll infinito.

  • Participación del usuario: el desplazamiento infinito mantiene a los usuarios interesados en una página. En redes sociales como Twitter y Facebook hay toneladas de contenido generado por los usuarios para desplazarse, de modo que el usuario está constantemente enganchado. 
  • Menos clics - Desplazarse requiere menos acción y es más fácil para los usuarios que hacer clic.
  • Ideal para móviles: el desplazamiento infinito es ideal para dispositivos móviles y pantallas táctiles. Los usuarios pueden deslizar hacia abajo para generar nuevos contenidos en lugar de cambiar a nuevas pestañas. 

Aparte de los beneficios anteriores de scraping infinito páginas de desplazamiento, hay algunos contras, así como:

  • No es bueno para la optimización de motores de búsqueda (SEO).
  • No es fácil para los usuarios con discapacidades físicas navegar por las páginas que tienen un scroll infinito.
  • Los sitios web de desplazamiento infinito pueden tener un tiempo de carga largo que puede provenir del lado del usuario o del lado del desarrollo.

Cómo scrapear páginas de scroll infinito con Python

Veamos cómo scrapear páginas de scroll infinito usando Python con la ayuda de los pasos que se mencionan a continuación.

Bibliotecas de importación

Necesita importar la librería Selenium.

from selenium import webdriver
from selenium.webdriver.common.keys import Claves      
import tiempo

Configuración de Selenium

Aquí tienes que elegir el navegador que deseas utilizar. Vamos a ir con Chrome, ya que ofrece más opciones que Firefox. 

def obtener_selenio():                          
  options = webdriver.ChromeOptions()
  options.add_argument('--ignore-certificate-errors')
  options.add_argument('--incognito')
  options.add_argument('headless')                       
   driver = webdriver.Chrome(chrome_options=opciones)
  return (controlador)

El argumento headless mencionado anteriormente es bastante importante. Selenium no abrirá Chrome en una nueva ventana cuando se ejecuta headless en Python. Sin embargo, si te encuentras con un problema durante el scraping, puedes comentar la opción headless y ver lo que está pasando en Chrome y lo que se carga en la página.

Podemos omitir las dos banderas, es decir, ignorar-certificar-errores e incógnito.

Si te encuentras con un captcha o un banner de cookies que impide que tu página se cargue, puedes hacer clic en OK y continuar con la página normalmente. Sin embargo, si el navegador se cierra inesperadamente, puedes utilizar time.sleep() para pausar el código y tomarte el tiempo suficiente para depurar.

Corrección del desplazamiento infinito

Debe examinar la estructura HTML de su página para corregir el desplazamiento infinito y seguir los pasos que se indican a continuación.

  • Tienes que encontrar el último elemento cargado en la página.
  • Tienes que usar Selenium para desplazarte hasta ese elemento.
  • Para esperar a que la página cargue más contenido, utilice time.sleep().
  • Desplácese de nuevo hasta el último elemento que se cargó en la página.
  • Debe repetir el mismo proceso hasta llegar al final de la página.

Puede considerar el siguiente ejemplo para una mejor comprensión.

selenium = get_selenium()              
selenium.get("tu/url")   
último_elemento = '';
while True:
   current_last_elem = "#my-div > ul > li:last-child"
   scroll = "document.querySelector(\'" + current_last_elem + "\').scrollIntoView();"
   selenium.execute_script(scroll)
   time.sleep(3)
  if (último_elemento == actual_elemento)
     break
  else
      último_elemento = actual_elemento

En el código anterior, hemos utilizado jQuery y Javascript dentro de Python. 

Toma,

  • Hemos utilizado la función selenium.get() que abrirá nuestra página URL. Sin embargo, si desea agregar una palabra clave a su búsqueda de URL, puede utilizar la siguiente línea de código.
selenium.get("tu/url.com/{0}".format(keyword))
  • Inicializamos el last_time a 0 almacenando en él una cadena vacía.
  • Usamos un bucle while en el que usamos CSS_selector o Xpath para obtener el current_last_elem. Para obtener la ruta, siga los siguientes pasos. Para seleccionar un elemento del que necesitas la ruta, tienes que utilizar las herramientas de desarrollo web. Puedes seguir este tutorial para seleccionar el elemento en la estructura HTML de la página y obtener el Xpath en Chrome.
  • Abre tu página.
  • Para seleccionar un elemento del que necesitas la ruta, tienes que usar las herramientas de webdev. Puedes seguir este tutorial para seleccionar el elemento en la estructura HTML de la página y obtener el Xpath en Chrome.
  • Para desplazar la página hacia abajo hasta el elemento seleccionado, utilizamos jQuery y scrollIntoView(). 
"document.querySelector(\'" + .. + "\').scrollIntoView();"

Aquí, su formato debe ser correcto, por lo que debe prestar atención a las comillas simples y dobles y a los caracteres de escape.

  • Ejecutamos el script js utilizando selenium.execute_script().
  • Es necesario dar a la página el tiempo suficiente para cargar para que pueda encontrar el último elemento. Por lo tanto, la función time.sleep() es importante ya que suspende la ejecución durante algunos segundos. Si no le das a la página el tiempo suficiente para cargar, dejará de desplazarse y obtendrás un resultado indefinido.
  • Comprobamos si se encuentra un nuevo último elemento cada vez que nos desplazamos hasta el final de la página. Si se encuentra, significa que aún no hemos llegado al final de la página y debemos seguir desplazándonos. Si no se encuentra, significa que la página ha terminado de desplazarse hacia abajo, y podemos salir del bucle.

Solucionar problemas frecuentes

Algunos de los problemas que ocurren con frecuencia al hacer scroll infinito son los siguientes:

  • Lleva algún tiempo encontrar el Xpath correcto al último elemento. Es necesario comprobar las comillas simples y dobles en el script js.
  • Si obtiene undefined o el mismo último elemento cada vez, necesita aumentar la duración del tiempo, es decir, aumentar time.sleep() ya que la página podría no tener suficiente tiempo para cargarse completamente. 
  • Puedes comentar la opción headless en get_selenium() si todo está correcto, pero sigue sin funcionar.

Activación de js en Python

Es posible lanzar un script js desde dentro de Python y obtener una lista como resultado. 

Por ejemplo, podemos utilizar el siguiente código para obtener las fuentes de todas las imágenes de la página.

js_script = '''\    
var jslist = []  
document.querySelectorAll('img').forEach(i => jslist.push(i.src));
return jslist; 
 ' ''   
python_list = selenium.execute_script(js_script)

En el código anterior,

  • Creamos un array vacío llamado jslist.
  • Seleccionamos todas las etiquetas img de la página.
  • Usamos forEach para empujar cada img.src en nuestro array.
  • Devolvimos el jslist.

Podemos utilizar el mismo enfoque para los enlaces href por:

  • Seleccionar todas las etiquetas "a".
  • Empujando cada a.href a nuestro array.

Después, podemos ejecutar el script con selenium.execute_script().A continuación, podemos almacenar el valor devuelto por js en una variable python, es decir, python_list. 

Así es como podemos scrapear páginas de scroll infinito usando Python.

Utilizar un proxy

Ya sabes que un proxy es un servidor de terceros que actúa como intermediario entre un cliente que solicita un recurso y un servidor que lo proporciona. Si quieres usar proxies con Selenium y Python, puedes usar las siguientes líneas de código.

chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--proxy-server=%s'% hostname +": "+port)
driver = webdriver.Chrome(chrome_options=chrome_options)

Para manejar el desplazamiento infinito, puedes usar scroll-proxy que soporta el desplazamiento programático de las vistas desplazables dentro de una jerarquía de vistas. Si usas npm, puedes instalar scroll-proxy usando el siguiente comando. Usaremos js para demostrar el uso de scroll-proxy.

npm install scroll-proxy--save

Después de instalar scroll-proxy, puede instanciar un objeto ScrollProxy usando el siguiente código.

var myScroll = nuevo ScrollProxy();

Puedes ver que no pasamos ningún argumento al constructor ScrollProxy porque por defecto reportará acciones cuando el usuario haga scroll en la página.

Sin embargo, si quieres obtener actualizaciones cuando el usuario se desplaza dentro de algún elemento HTML específico, tienes que pasarlo al constructor.

var myDiv = document.querySelector('.scrollable');
var myDivScroll = new ScrollProxy(myDiv);

¿Por qué utilizar proxies para el scraping de desplazamiento infinito?

A continuación se indican algunas razones para utilizar proxies durante el scraping de desplazamiento infinito.

  • Un captcha puede hacer que tu página agote el tiempo de espera y bloquear tu scraper. Puedes comprobar manualmente la página en busca de un captcha si recibes frecuentes errores de tiempo de espera. La mayoría de los captchas se activan por medidas de seguridad, y puedes evitarlos utilizando proxies residenciales rotativos junto con tu scraper.
  • Algunos sitios prefieren filtrar las solicitudes de encabezados sospechosos basándose en la suposición o probabilidad de que el agente de usuario pueda ser un bot. Para evitar la señalización de que eres un bot, puedes utilizar proxies que pueden cambiar tu dirección IP y evitar las banderas rojas para ti (user-agent). 

Conclusión

Ya hemos comentado que el desplazamiento infinito es preferible cuando el usuario no busca información específica. Los sitios web de noticias y las redes sociales que generan constantemente nuevos contenidos pueden beneficiarse del desplazamiento infinito. Por otro lado, las páginas de empresas y los sitios de comercio electrónico no son buenos candidatos para el desplazamiento infinito, ya que los usuarios buscan información específica. Además, discutimos los pasos involucrados en el scraping de páginas de scroll infinito usando Selenium. También podemos utilizar proxies residenciales rotativos para manejar el scrolling infinito, ya que ayudan a evitar captchas y filtran nuestras peticiones de cabecera sospechosas.

Espero que hayas entendido cómo scrapear páginas de scroll infinito usando Python.