Tácticas Avanzadas de Web Scraping en Python

Comentarios: 0

Recolectar datos de un sitio web es mucho más que recolectar su contenido; hay mucho en juego. Para saltarse los límites, las brechas y otros bloqueos sofisticados, hay que utilizar una multitud de métodos adicionales como el raspado de datos en Python.

En este artículo definiremos qué es el scraping con Python y justificaremos por qué es la herramienta óptima para esta tarea. Y también esbozaremos tácticas que hacen uso de las capacidades de scraping de datos de Python. Todo ello ayudará a recuperar información incluso de los sitios más seguros.

Por qué Python es ideal para el Web Scraping

Esta herramienta está diseñada específicamente para servir como un excelente recurso para la recolección de datos de sitios web. Aparte de su facilidad de uso, las bibliotecas de Python como Scrapy, Selenium y BeautifulSoup son notablemente potentes. Además, existe una nueva comunidad activa que sigue desarrollando scripts y ofrece soporte a los nuevos usuarios. Es por eso que Python se utiliza para el web scraping hoy en día. Por lo tanto, vamos a destacar las principales estrategias disponibles en este momento.

Tácticas de scraping con Python

Este bloque mostrará al usuario cómo scrapear sitios web complejos utilizando técnicas más sofisticadas integradas en Python. El usuario aprenderá cómo:

  • Evite ser bloqueado por la protección contra bots: gestione CAPTCHA, honeypots y TLS fingerprinting.
  • Actúa como un usuario real para evitar que te bloqueen.
  • Controle las cookies y las sesiones para mantenerse autenticado mientras accede a páginas restringidas.
  • Gestione los datos obtenidos de las API y maneje los datos cargados de forma asíncrona.
  • Proteja el script de las modificaciones en la página y perfeccione la lógica para los recursos dinámicos.

Estos enfoques ayudarían a hacer efectivo el scraping de datos Python, minimizando al mismo tiempo las posibilidades de ser bloqueado o denegado el acceso desde el servidor.

Ahora, vamos a proceder a las tácticas sobre cómo hacer scraping en Python de una manera eficaz.

Táctica 1: Manejo de CAPTCHAs y medidas anti-bot

Una plétora de sitios web implementan sistemas de seguridad CAPTCHA como una excelente línea de defensa para salvaguardar su información frente a la sustracción premeditada de datos de Python. Estos sistemas pueden ser vencidos por muchos medios, empleando servicios de reconocimiento automático, como 2Captcha o Anti-Captcha, o utilizando el aprendizaje automático para identificar cognitivamente las imágenes. Otra posibilidad es reducir la cantidad de consultas a un nivel que el tribunal no asocie con una expectativa de recopilación de información.

Táctica 2: Emular el comportamiento humano

Para que las consultas sean menos hostiles, los usuarios deben actuar de un modo más cercano al comportamiento normal. Introducir tiempos aleatorios entre las acciones, cambiar de User-Agent, desplazarse por la página, mover el puntero del ratón, simular la escritura, e incluso más. El uso de Selenium o Playwright como herramientas de scraping de Python proporciona a la automatización características mucho más parecidas a las humanas, por lo que se pueden evitar los bloqueos.

  • Cambio de User-Agent:
    
    import random
    import requests
    
    url = 'https://google.com'
    
    user_agents = [
       'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
       'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
       'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
    ]
    headers = {
       'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
       'accept-language': 'en-IN,en;q=0.9',
       'dnt': '1',
       'sec-ch-ua': '"Not/A)Brand";v="8", "Chromium";v="126", "Google Chrome";v="126"',
       'sec-ch-ua-mobile': '?0',
       'sec-ch-ua-platform': '"Linux"',
       'sec-fetch-dest': 'document',
       'sec-fetch-mode': 'navigate',
       'sec-fetch-site': 'none',
       'sec-fetch-user': '?1',
       'upgrade-insecure-requests': '1',
    }
    
    
    headers['user-agent'] = random.choice(user_agents)
    response = requests.get(url=url, headers=headers)
    
    
    
  • Movimiento del cursor:
    
    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.common.action_chains import ActionChains
    
    options = webdriver.ChromeOptions()
    options.add_argument("--headless")  # Ejecutar el navegador sin interfaz gráfica
    driver = webdriver.Chrome(options=options)
    
    driver.get("https://google.com")
    
    # Buscar un elemento por XPath
    element = driver.find_element(By.XPATH, "//button[text()=Confirm]")
    
    # Utiliza ActionChains para mover el cursor
    actions = ActionChains(driver)
    actions.move_to_element(element).perform()
    
    # Cerrar el navegador
    driver.quit()
    
    
    

Táctica 3: Evitar las trampas Honeypot

Algunos sitios web incorporan elementos adicionales diseñados para usuarios normales que son invisibles, pero que un bot puede activar accidentalmente. Entre estos elementos se encuentran los formularios ocultos, si se hace clic en ellos y se envían, el sitio bloqueará el acceso del bot. Antes de recopilar datos, utilice estilos y atributos CSS como display: none u opacity: 0 y absténgase de activarlos.

Táctica 4: Gestión de cookies y sesiones

Si las peticiones se realizan sin las cookies o la configuración de sesión correctas, algunos sitios bloquearán las peticiones repetidas que se consideren demasiado sencillas. Para solucionar este problema, utilice requests.Session(), utilice cookies guardadas y actúe como un usuario real. También es necesario cambiar los encabezados User-Agent, ya que el bot será reconocido por ellos.

Táctica 5: Implementación del retardo exponencial para el reintento de peticiones en el scraping de datos con Python

En caso de que el servidor no responda o devuelva un error temporalmente, haz una pausa antes de verter nuevos intentos de repetir el comando. Es más preferible el backoff exponencial, que consiste en aumentar el tiempo de espera tras cada intento fallido. Por ejemplo, se puede aumentar 1 segundo, 2 segundos, luego 4 segundos, etc. Esto disminuye la posibilidad de ser bloqueado al tiempo que minimiza las limitaciones del sitio web y disminuye la carga de trabajo de raspado de datos con Python.


import time
import requests


def fetch_with_backoff(url, max_retries=5):
   retries = 0
   wait_time = 1  # Retraso de 1 segundo

   while retries < max_retries:
       try:
           response = requests.get(url)

           # Si la solicitud tiene éxito, devuelve el resultado
           if response.status_code == 200:
               return response.text

           print(f"Error {response.status_code}. Retrying in {wait_time} sec.")

       except requests.exceptions.RequestException as e:
           print(f"Connection error: {e}. Retrying in {wait_time} sec.")

       # Esperar antes de reintentar
       time.sleep(wait_time)

       # Aumentar el retraso
       wait_time *= 2
       retries += 1

   return None


url = "https://google.com"
html = fetch_with_backoff(url)


Táctica 6: Utilizar navegadores sin cabeza para interacciones complejas

Algunos sitios web pueden cargar el contenido por etapas, o pueden funcionar sólo al recibir alguna entrada del usuario. En estos casos, es poco probable que bibliotecas como BeautifulSoup sean de ayuda. En este caso, el web scraping con Selenium, Puppeteer y Playwright será de gran ayuda. Permiten abrir páginas como lo haría un usuario normal, es decir, haciendo clic en botones, escribiendo texto o interactuando con los elementos de la página.

Táctica 7: Python Data Scraping a partir de carga asíncrona

Algunas páginas web no utilizarán JavaScript para mostrar datos hasta que el usuario haya accedido a la página. Con esto, una petición HTTP estándar no obtendrá toda la información necesaria. Selenium se puede utilizar para recopilar dicha información, o las solicitudes de red se pueden escudriñar utilizando DevTools del navegador. Esto ayuda en la detección de puntos finales de API ocultos, que más tarde pueden ser utilizados para la recuperación de información con un mínimo de molestias.

Táctica 8: Detectar y evitar el TLS Fingerprinting

La inmensa mayoría de los sitios web pasan las solicitudes automatizadas al servidor para su posterior procesamiento. Es bien sabido que algunos sitios web verifican las huellas dactilares TLS como medio para distinguir las solicitudes automatizadas. Eso significa que el servidor estudia varios atributos de conexión como la atención TLS/SSL usando tecnología, cifrados y otras conexiones sofisticadas. Lograr eso podría hacerse mezclando atributos de conexión en las peticiones utilizando cabeceras y proxies personalizados.

  • Integración de proxies:
    
    import requests
    
    url = 'username:password@your-proxy'
    
    proxy = 'your-proxy'
    proxies = {
       "http": f"http://{proxy}",
       "https": f"https://{proxy}",
    }
    response = requests.get(url=url, proxies=proxies)
    
    
    

Táctica 9: Aprovechar los puntos finales de la API cuando estén disponibles

Si un sitio web ofrece una API pública, es aconsejable utilizarla en lugar de recurrir al scraping. Este método es más rápido, más fiable y tiene menos probabilidades de ser bloqueado. Un buen punto de partida para encontrar un punto final de API es comprobar las solicitudes que realiza el sitio web, que es visible en DevTools. En ausencia de una API, tendrás que trabajar con el código HTML.

Táctica 10: Supervisar los cambios en la estructura del sitio web

Los sitios web pueden modificar su código, lo que puede retrasar su rastreo. Como contrapartida, considere lo siguiente:

  • Cambiar de usar selectores CSS a XPath;
  • Utilice pruebas automatizadas para supervisar periódicamente la estructura de la página;
  • Cree un código inteligente que pueda gestionar los cambios probables. Una forma es buscar elementos por su contenido en lugar de por rutas predeterminadas.

Táctica 11: Garantizar el cumplimiento de las condiciones de servicio del sitio web

En algunos casos, el web scraping con Python de sitios web puede incumplir sus condiciones de uso o incluso considerarse ilegal en determinadas jurisdicciones. Es imperativo examinar tanto robots.txt como los términos de servicio junto con la política del sitio antes de raspar datos. También es mejor utilizar una API pública si existe. Además, establezca límites en el número de solicitudes para minimizar la carga del servidor.

Raspado de datos en Python: Conclusión

El web scraping avanzado con Python tiene sus propias ventajas, pero hacerlo de la forma correcta también es igual de importante. Hemos discutido aspectos importantes de dicho proceso en relación con eludir CAPTCHA, simular acciones de usuario, gestionar cookies y sesiones, tratar con honeypots y examinar datos en aplicaciones web asíncronas.

Además, ten en cuenta el aspecto moral y el acuerdo pertinente del sitio utilizado. Utiliza los puntos finales de la API cuando estén disponibles y, si el análisis sintáctico de HTML es inevitable, sigue todas las directrices para reducir las posibilidades de ser bloqueado y tener complicaciones legales.

Con el uso de este tutorial de métodos de web scraping con Python, el potencial de riesgo se puede reducir en gran medida, mientras que la eficacia se puede aumentar al máximo.

Comentarios:

0 Comentarios