CodeGym /Curso de Java /Python SELF ES /Evitando la protección contra bots: métodos para evitar a...

Evitando la protección contra bots: métodos para evitar antibots y CAPTCHA

Python SELF ES
Nivel 33 , Lección 2
Disponible

1. Tecnologías antibot: ¿quién juega al gato y al ratón con nosotros?

Hoy nos sumergiremos en uno de los temas más fascinantes y, podría decirse, controvertidos del web scraping: evitar la protección contra bots y luchar contra la CAPTCHA. Como suele ocurrir en la vida de un programador, por cada tornillo astuto hay una tuerca que encaja, así que vamos a ver cómo podemos enfrentarnos a estos obstáculos.

Antes de empezar a buscar escapatorias, entendamos con qué estamos tratando. Las tecnologías antibot no son otra cosa que sistemas que protegen los sitios contra atención excesiva y, a menudo, no deseada de programas automatizados. Aquí están algunos de los métodos comunes:

  • CAPTCHA: CAPTCHA es como el arma nuclear en el mundo de los antibots. El objetivo es filtrar solicitudes de bots presentando al usuario tareas que requieren intervención humana: por ejemplo, seleccionar todas las imágenes con taxis o ingresar una combinación distorsionada de letras.
  • Análisis de comportamiento: Algunos sitios evalúan cuán rápidamente completas formularios o interactúas con los elementos de la página. ¿Demasiado rápido? Y voilà, estás bloqueado.
  • Retrasos y límites en solicitudes: Si un sitio empieza a sospechar que no eres humano, puede aumentar los retrasos entre solicitudes o directamente bloquearte.

2. Métodos para evitar antibots

Ahora que conocemos al enemigo, veamos algunos métodos para enfrentarlo.

Resolver CAPTCHA

El método más obvio y a la vez complicado es automatizar la resolución de CAPTCHA. Sí, es posible, pero requiere ciertas herramientas y servicios de terceros. CAPTCHA tiene varios tipos, incluyendo texto, gráficos e incluso audio CAPTCHA.

Para automatizar la resolución de CAPTCHA, puedes usar APIs de servicios como 2Captcha o Anti-Captcha, que ofrecen soluciones CAPTCHA por una pequeña tarifa. Veamos cómo podría implementarse en la práctica:


import requests

def solve_captcha(api_key, site_url, captcha_image_url):
    # Cargamos la imagen del CAPTCHA
    captcha_image = requests.get(captcha_image_url).content
    
    # Enviamos la imagen al servicio y obtenemos el ID de la tarea
    response = requests.post("http://2captcha.com/in.php", files={'file': captcha_image}, data={'key': api_key, 'method': 'post'})
    captcha_id = response.text.split('|')[1]
    
    # Obtenemos la solución del CAPTCHA
    solution_url = f"http://2captcha.com/res.php?key={api_key}&action=get&id={captcha_id}"
    solution_response = requests.get(solution_url)
    
    while 'CAPCHA_NOT_READY' in solution_response.text:
        solution_response = requests.get(solution_url)
    
    return solution_response.text.split('|')[1]

# Ejemplo de uso de la función
api_key = 'TU_CLAVE_2CAPTCHA'
site_url = 'https://example.com'
captcha_image_url = 'https://example.com/captcha_image'

captcha_solution = solve_captcha(api_key, site_url, captcha_image_url)
print("Solución del CAPTCHA:", captcha_solution)
    

Este código ilustra cómo realizar una solicitud para resolver un CAPTCHA. Sin embargo, estos métodos pueden no ser efectivos para tareas gráficas complejas o si el sitio cambia activamente sus algoritmos.

Imitación del comportamiento humano

Otra forma de engañar es imitar el comportamiento humano. Puedes introducir retrasos en lugares aleatorios de tus scripts, cambiar el user-agent, emular interacciones bidireccionales e incluso usar métodos de movimiento del mouse con Selenium:


from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
import time

driver = webdriver.Chrome()
driver.get('https://example.com')

# Emulamos el movimiento del mouse
actions = ActionChains(driver)
element = driver.find_element_by_id('button')
actions.move_to_element(element)
actions.perform()

# Retraso para crear una interacción natural
time.sleep(2)

# Realizamos la acción
element.click()
    

Hablaremos más sobre Selenium en las próximas clases.

Uso de IP dinámicas y proxies

También puedes usar servidores proxy para cambiar la dirección IP desde donde se envían las solicitudes. Esto puede ayudar a evitar los límites de solicitudes desde una sola IP. Para ello, existen servicios como Bright Data y Smartproxy.


import requests

proxy = {
  "http": "http://123.456.789.012:8080",
  "https": "http://123.456.789.012:8080",
}

response = requests.get('https://example.com', proxies=proxy)
print(response.content)
    

3. Observaciones importantes

Implementar eludir antibots requiere conocimiento y experimentación. Es importante recordar que no todos los métodos son legales o bienvenidos por el sitio. Siempre revisa lo que está permitido en "robots.txt", y sigue las Reglas del Buen Comportamiento en el web scraping, evitando sobrecargar servidores. Esto no solo evitará problemas legales, sino que también mostrará respeto por el trabajo de otros.

Nunca ejecutes un parser serio desde tu IP doméstica. Por un scraping educativo no te pasará nada, pero si tu script tumba el servidor de alguien al enviar accidentalmente varios miles de solicitudes a la vez, podrías tener problemas. Y tras esos problemas, podrían llegar personas que quieran hacértelo saber.

Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION