Raspado web libre de bloqueos

Tutorial sobre cómo hacer scraping de sitios web sin que le bloqueen. Conozca 9 soluciones diferentes para superar los bloqueos del raspado de sitios web.
14 min read
Web scraping without getting blocked

El raspado web a menudo puede parecer una búsqueda del tesoro en la que se explora la web en busca de información oculta que no proporcionan las API. Y como en toda buena búsqueda del tesoro, hay retos que superar.

Un obstáculo notable es encontrarse con bloqueos de acceso impuestos por el sitio web de destino. Estos bloqueos pueden surgir por varias razones, como políticas de raspado estrictas, preocupaciones relacionadas con el abuso de recursos, problemas de reputación de la IP de origen o la detección de agentes de usuario (falsos).

Pero no hay por qué temer, este tutorial le enseñará cómo hacer raspado web sin que le bloquee el sitio web de destino para que pueda encontrar fácilmente su tesoro en Internet.

Estrategias para ayudarle a evitar bloqueos de acceso

 

Dado que el raspado web es una tarea compleja, evitar los bloqueos de acceso a menudo requiere la utilización de múltiples técnicas. A continuación se presentan nueve estrategias que puede emplear para esquivar estos molestos bloqueos.

1. Entender las políticas y condiciones de servicio de su objetivo


 

Cuando empiece a raspar un sitio nuevo, deberá familiarizarse con él más allá de aprender la estructura HTML de la página. La familiarización también debe incluir la comprensión de las políticas y términos de servicio del sitio que pretende raspar. Esto suele implicar cuál es la postura del sitio con respecto al raspado web, si permite el raspado y qué páginas específicas se le permite raspar. El incumplimiento de estas condiciones puede provocar el bloqueo del sitio y exponerle a riesgos legales.

Un documento crucial que hay que tener en cuenta es el archivo robots.txt. Este archivo se encuentra en el directorio raíz del sitio web y proporciona instrucciones a los robots web sobre qué partes del sitio web no se pueden escanear ni procesar.

A continuación se muestra un ejemplo de archivo robots.txt:

User-agent: *
Disallow: /private/
Disallow: /temp/

Aquí, el archivo robots.txt da instrucciones a todos los robots web (indicados por el * después de User-agent) para que eviten raspar los directorios privados y temporales del sitio web.

El raspado web respetuoso implica adherirse a las directrices de su sitio web en particular.

2. Adherirse a las normas éticas de raspado


 

Del mismo modo que debe respetar las políticas de un sitio web, también es mejor que se adhiera a un código de conducta. Las normas éticas de raspado no sólo le ayudarán a evitar que le bloqueen, sino también a respetar los derechos y recursos del sitio web de destino.

es crucial Seguir estas directrices:

  • No bombardee los servidores con peticiones incesantes: Deje un intervalo de tiempo suficiente entre las solicitudes. Algunos sitios web pueden detectar y bloquear a los raspadores web que extraen grandes cantidades de datos rápidamente porque no parece un comportamiento humano. Para parecer más natural y disminuir las posibilidades de ser bloqueado, es aconsejable añadir un intervalo de tiempo a las peticiones. Sin embargo, en lugar de un retardo fijo, es mejor utilizar intervalos irregulares para imitar mejor el comportamiento humano.

     
  • No raspe datos personales sin consentimiento: No se trata sólo de una cuestión ética, sino también legal. Asegúrate siempre de contar con los permisos necesarios antes de raspar datos personales.

     
  • Respeto de los datos que obtenga: Utilice los datos que raspe de forma responsable y legal. Procure que el uso que haga de los datos se ajuste a todas las leyes y normativas aplicables, como las leyes de derechos de autor y el Reglamento General de Protección de Datos (GDPR).

     

A continuación se muestra cómo puede implementar intervalos irregulares entre solicitudes en Python:

import time
import random

urls = ['https://www.targetwebsite.com/page1', 'https://www.targetwebsite.com/page2', 'https://www.targetwebsite.com/page3']

for url in urls:
    response = requests.get(url)
    # Process response
    sleep_time = random.uniform(1, 10)  # Generate a random sleep time between 1 and 10 seconds
    time.sleep(sleep_time)  # Sleep for a random time between requests

Este código recorre una lista de URL en la matriz urls. Para cada URL, hace una petición y luego hace una pausa, utilizando la función time.sleep() antes de proceder con la siguiente peticiones. Estos intervalos aleatorios ayudan a imitar el comportamiento de navegación humano, reduciendo las posibilidades de detección.

3. Utilizar proxies (rotativos)


 

Una herramienta útil en su kit de herramientas de raspado web son los proxies, en particular los proxies rotativos. Un proxy sirve como puerta de enlace entre usted y el sitio web que está raspando. Enmascara su dirección IP, haciendo que sus peticiones parezcan proceder de diferentes lugares.

Los proxies rotatorios van un paso más allá. En lugar de utilizar una única IP proxy, te dan un conjunto de direcciones IP. Sus peticiones rotan a través de estas IPs, cambiando constantemente su apariencia digital. Esto reduce enormemente las posibilidades de que tu raspador sea detectado y bloqueado, ya que es mucho más difícil para un sitio web identificar patrones en las peticiones.

Además, los proxies rotatorios ayudan a distribuir las peticiones entre varias IPs, reduciendo el riesgo de que una única dirección IP sea bloqueada por demasiadas peticiones.

A continuación se muestra un fragmento de código que se puede utilizar para ayudarle a implementar un proxy rotatorio en Python:

import requests
from itertools import cycle

# List of proxies
proxy_list = ['ip1:port1', 'ip2:port2', ...] 
proxy_pool = cycle(proxy_list) # create a cycle of proxies

url = 'https://www.targetwebsite.com'

for i in range(1,3):
    # Get a proxy from the pool
    proxy = next(proxy_pool)
    print(f"Request #{i}:")
    try:
        response = requests.get(url, proxies={"http": proxy, "https": proxy})
        print(response.content)
    except:
        # Most free proxies will often get connection errors, so we catch them here
        print("Connection error with proxy:", proxy)

Este fragmento de código utiliza una lista de proxies (es decir, proxy_list) que se recorre cíclicamente para que cada una de las peticiones realizadas tenga una dirección IP diferente. Esto hace que sea más difícil para los sitios detectar sus operaciones de raspado web.

La rotación de proxies es una herramienta poderosa, pero debe formar parte de una estrategia más amplia. Para navegar por los agitados mares del raspado web sin que te bloqueen, debes combinarlos con las otras técnicas mencionadas en este artículo.

4. Utilice las cabeceras y los agentes de usuario adecuados


 

Los sitios web suelen utilizar cabeceras y agentes de usuario para detectar bots. Un User-Agent es una cabecera que su navegador envía al servidor, proporcionando detalles sobre el software y el sistema que inicia las peticiones. Suele incluir el tipo de aplicación, el sistema operativo, el proveedor y la versión del software. Esta información ayuda al servidor a ofrecer contenidos adecuados para su navegador y sistema específicos.

Cuando se raspa la web, es crucial emplear cadenas de agente de usuario legítimas. Al imitar a un usuario real, es posible eludir eficazmente los mecanismos de detección y reducir la probabilidad de ser bloqueado.

Además del User-Agent, otro encabezado importante a tener en cuenta es el Referer. El encabezado Referer revela la URL de la página web que está vinculada al recurso que se está solicitando. Incluir esto en las peticiones de su raspador hace que parezca más un usuario humano navegando de una página a otra.

Otras cabeceras útiles que puede incluir su raspador son Accept-Language, Accept-Encoding y Connection. Estas cabeceras suelen ser enviadas por los navegadores web y rara vez las incluyen los raspadores. Normalmente, los raspadores omiten estos encabezados porque no tienen un impacto directo en la recuperación del contenido web. Su inclusión, sin embargo, ayuda a que las peticiones del raspador parezcan más auténticas, reduciendo las posibilidades de detección.

A continuación se muestra un fragmento de Python que establece el User-Agent y el Referer en la cabecera de las peticiones para imitar una sesión de navegación genuina:

url = 'https://www.targetwebsite.com'
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36',
    'Referer': 'https://www.google.com/'
}

response = requests.get(url, headers=headers)

5. Manejar trampas y errores de Honeypot


 

Navegar por el terreno de un sitio web puede ser un reto gracias a obstáculos como los honeypots. Los honeypots son enlaces ocultos diseñados intencionadamente para pasar desapercibidos a los usuarios normales, pero que pueden ser detectados por raspadores y bots. Estos enlaces suelen ocultarse mediante elementos HTML configurados como ocultos (hidden)o ninguno (none), o disfrazados de botones con colores que coinciden con el fondo de la página. El objetivo principal de incorporar honeypots es identificar y poner en la lista negra a los bots.

A continuación se muestra un sencillo fragmento de código que puede utilizar para intentar evitar los honeypots en Python:

from bs4 import BeautifulSoup
import requests

url = 'https://www.targetwebsite.com'
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')

for link in soup.select('a'):
    if 'display' in link.get('style', '') and 'none' in link['style']:
        continue  # Skip this link
    # Process link

Este código omite cualquier enlace con display: none en su atributo de estilo, una característica común de los enlaces honeypot.

Al raspar datos, otra cosa importante a tener en cuenta son los errores, ya que no es raro encontrarse con respuestas de error. Estos errores suelen indicarse mediante códigos de estado HTTP del tipo 4xx (errores del cliente) o 5xx (errores del servidor). Manejar estos errores con elegancia es crucial para evitar abrumar al servidor con un exceso de peticiones, lo que potencialmente podría conducir a que le bloqueen.

 

Una estrategia eficaz para gestionar estos errores es aplicar un algoritmo de backoff exponencial. Este enfoque consiste en aumentar progresivamente el intervalo de tiempo entre los siguientes intentos de reintento, lo que permite un manejo más eficiente de los errores.

6. Utilice un servicio de resolución de CAPTCHA


 

La Prueba Pública de Turing Completamente Automatizada para Distinguir a los Ordenadores de los Humanos (CAPTCHA) es una medida de seguridad implementada por muchos sitios web para prevenir actividades automatizadas de bots, incluyendo el raspado web. Están diseñados para que sean fáciles de resolver para los humanos, pero un reto para las máquinas, de ahí su nombre.

Si se encuentra con CAPTCHAs, debería considerar el uso de Web Unlocker de Bright Data. Este servicio emplea varios métodos, incluidos algoritmos de aprendizaje automático e incluso solucionadores humanos, para descifrar los retos CAPTCHA en su nombre. Su función es automatizar el proceso de resolución de CAPTCHA, permitiendo a su raspador continuar con el proceso de extracción de datos sin impedimentos.

 

7. Supervise los límites de velocidad y las denegaciones de acceso


 

La mayoría de los sitios web aplican límites de velocidad y denegaciones de acceso para proteger sus recursos de ser explotados por bots automatizados. Dado que cada petición que se envía a un servidor consume recursos, miles de bots enviando peticiones cada segundo podrían fácilmente hacer caer un servidor o degradar el rendimiento de un sitio web. Para evitarlo, los sitios web imponen límites de velocidad, y algunos incluso proporcionan una cabecera X-RateLimit-Limit en sus respuestas, detallando sus límites de velocidad. Debes respetar estos límites para evitar que te bloqueen.

El servidor suele comunicar estas restricciones mediante códigos de estado HTTP. Un código de estado 200 significa que todo ha ido bien, pero un código 429 significa que has enviado demasiadas peticiones en un tiempo determinado. Del mismo modo, 403 significa que el acceso está prohibido, mientras que 503 indica que el servidor no está disponible, posiblemente debido a una sobrecarga. Conocer estos códigos es vital para navegar por la extracción de datos.

A continuación se muestra un fragmento de Python que utiliza la biblioteca de peticiones para respetar los límites de velocidad:

import time
import requests

def respectful_requester(url, delay_interval=1):
    response = requests.get(url)
    # If the status code indicates rate limiting, sleep then retry
    if response.status_code == 429:
        print('Rate limit reached. Sleeping...')
        time.sleep(delay_interval)
        return respectful_requester(url, delay_interval)
    elif response.status_code != 200:
        print(f'Error: {response.status_code}. Try a different proxy or user-agent')
    
    return response

Esta función envía una peticiones GET a una URL y comprueba la respuesta. Si encuentra un código de estado 429, hace una pausa durante un intervalo de tiempo especificado y vuelve a intentar las peticiones. También podría añadir un manejo más sofisticado para otros códigos de estado según sea necesario.

8. Raspado desde la caché de Google


 

En el caso de sitios web difíciles de raspar o de datos no sensibles al tiempo, un método alternativo consiste en raspar datos de la copia en caché de Google del sitio web en lugar del propio sitio web. Esta técnica puede resultar especialmente útil cuando se trata de sitios web extremadamente difíciles que bloquean activamente los raspadores web. Estas páginas almacenadas en caché se pueden raspar en lugar de las páginas web originales para evitar que se activen los mecanismos antiraspado. Tenga en cuenta que este método puede no ser infalible, ya que algunos sitios web dan instrucciones a Google para que no almacene su contenido en caché. Además, es posible que los datos de la caché de Google no estén actualizados.

Para raspar un sitio web de la caché de Google, basta con añadir la URL del sitio al final de http://webcache.googleusercontent.com/search?q=cache:. Por ejemplo, si se desea raspar el sitio web de Bright Data, se puede utilizar la siguiente URL: http://webcache.googleusercontent.com/search?q=cache:https://https://brightdata.com/.

Aunque el raspado desde la caché de Google puede ser más fiable que el raspado de un sitio que bloquea activamente sus peticiones, recuerde tener en cuenta las limitaciones y verificar la relevancia de los datos almacenados en caché.

9. Utilizar proxies y servicios de raspado de terceros


 

A medida que se intensifica el juego del gato y el ratón entre los raspadores web y los administradores de sitios web, aumenta la complejidad de mantener una configuración de raspado web eficaz y sigilosa. Los sitios web siempre están ideando nuevas formas de detectar, ralentizar o bloquear los raspadores web, lo que requiere un enfoque dinámico para superar estas defensas.

A veces, lo mejor es dejar que los expertos se encarguen de las partes difíciles. Aquí es donde sobresalen los proxies de terceros y los servicios de raspado como Bright Data. Bright Data está constantemente a la vanguardia de las tecnologías anti-scraping, adaptando rápidamente sus estrategias para superar los nuevos obstáculos.

 

Bright Data ofrece soluciones que le ayudan a imitar de forma convincente el comportamiento humano, como proxies residenciales rotativos y resolución automática de CAPTCHA, lo que permite que sus esfuerzos de raspado pasen desapercibidos. Sus servicios también están diseñados para escalar, ayudándole a adaptarse sin esfuerzo a las crecientes necesidades de sus proyectos de raspado web.

 

Utilizar estas soluciones le ayuda a ahorrar tiempo y recursos, liberándole para centrarse en otras partes de su proyecto, como el análisis de los datos obtenidos y la obtención de información a partir de ellos.

Conclusión

Llegados a este punto, ya ha superado los traicioneros obstáculos del raspado web. Al comprender las políticas de su objetivo, utilizar normas éticas de raspado, emplear tácticas como la rotación de proxies, encabezados apropiados y agentes de usuario, y manejar las trampas y errores de los honeypots, ahora tiene todas las herramientas para configurar sus proyectos de raspado web sin que le bloqueen.

Sin embargo, recuerde que incluso los exploradores más expertos necesitan un conjunto de herramientas fiable. Ahí es donde entra Bright Data. Sus soluciones integrales ofrecen una amplia gama de servicios adaptados para agilizar su viaje de raspado web. Utilice su Web Unlocker para acceder a datos ocultos tras CAPTCHAs. O seleccione entre diversos servicios proxy, incluidos servidores proxy robustos, proxies de centros de datos y proxies residenciales, para mantener el anonimato.

 

¡Feliz raspado!