Casos de Uso

Recopilación de datos del sitio minorista con manejo de CAPTCHA

Amazon utiliza CAPTCHA de imágenes para bloquear el acceso automatizado. Cuando alcances su umbral anti-bot, verás una página que te pedirá que escribas caracteres de una imagen distorsionada. La resolución OCR de CaptchaAI los maneja automáticamente.

Cómo funciona el CAPTCHA de Amazon

Amazon activa CAPTCHA basados en:

señal Descripción
Volumen de solicitud Demasiadas solicitudes de una IP en una ventana corta
galletas faltantes Sin cookies de sesión de Amazon
encabezados sospechosos Agente de usuario tipo bot o encabezados faltantes
reputación de propiedad intelectual Rangos de IP de proxy o centro de datos conocidos

Cuando se activa, Amazon redirige a una página con una imagen de texto distorsionada y un campo de entrada. Debes resolver la imagen y enviar el texto para continuar.

Requisitos

Requisito Detalles
Clave API CaptchaAI Decaptchaai.com
Pitón 3.7+ Con peticiones y hermosa sopa4
apoderados residenciales Recomendado para raspado sostenido

Resolviendo el CAPTCHA de imagen de Amazon

Paso 1: detectar la página CAPTCHA

import requests
from bs4 import BeautifulSoup

session = requests.Session()
session.headers.update({
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
    "Accept-Language": "en-US,en;q=0.9",
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
})

def is_captcha_page(html):
    return "Type the characters you see in this image" in html or \
           "captcha" in html.lower()

url = "https://www.amazon.com/dp/B0EXAMPLE"
resp = session.get(url)

if is_captcha_page(resp.text):
    print("CAPTCHA detected!")
else:
    print("Page loaded successfully")

Paso 2: extrae y resuelve la imagen

import base64

API_KEY = "YOUR_API_KEY"

def solve_amazon_captcha(session, captcha_page_html, captcha_page_url):
    soup = BeautifulSoup(captcha_page_html, "html.parser")

    # Find the CAPTCHA image
    img_tag = soup.find("img", src=lambda s: s and "captcha" in s.lower())
    if not img_tag:
        raise Exception("CAPTCHA image not found")

    img_url = img_tag["src"]

    # Download the image
    img_resp = session.get(img_url)
    img_base64 = base64.b64encode(img_resp.content).decode()

    # Submit to CaptchaAI
    submit_resp = requests.get("https://ocr.captchaai.com/in.php", params={
        "key": API_KEY,
        "method": "base64",
        "body": img_base64
    })
    task_id = submit_resp.text.split("|")[1]

    # Poll for result
    import time
    for _ in range(30):
        time.sleep(5)
        result = requests.get("https://ocr.captchaai.com/res.php", params={
            "key": API_KEY, "action": "get", "id": task_id
        })
        if result.text == "CAPCHA_NOT_READY":
            continue
        if result.text.startswith("OK|"):
            return result.text.split("|")[1]
        raise Exception(f"Solve error: {result.text}")

    raise TimeoutError("Solve timed out")

Paso 3: envíe la solución

def submit_captcha_solution(session, captcha_page_html, solution, captcha_page_url):
    soup = BeautifulSoup(captcha_page_html, "html.parser")
    form = soup.find("form")

    # Build form data
    form_data = {}
    for inp in form.find_all("input"):
        name = inp.get("name")
        if name:
            form_data[name] = inp.get("value", "")

    # Set the CAPTCHA answer
    form_data["field-keywords"] = solution

    # Submit
    action = form.get("action", captcha_page_url)
    if action.startswith("/"):
        from urllib.parse import urljoin
        action = urljoin(captcha_page_url, action)

    resp = session.post(action, data=form_data)
    return resp

Ejemplo de trabajo completo

import requests
import base64
import time
from bs4 import BeautifulSoup

API_KEY = "YOUR_API_KEY"

def scrape_amazon_product(url):
    session = requests.Session()
    session.headers.update({
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
        "Accept-Language": "en-US,en;q=0.9"
    })

    resp = session.get(url)

    # Handle CAPTCHA if present
    if "captcha" in resp.text.lower():
        soup = BeautifulSoup(resp.text, "html.parser")
        img = soup.find("img", src=lambda s: s and "captcha" in s.lower())

        if img:
            # Download and solve
            img_data = session.get(img["src"]).content
            img_b64 = base64.b64encode(img_data).decode()

            submit = requests.get("https://ocr.captchaai.com/in.php", params={
                "key": API_KEY, "method": "base64", "body": img_b64
            })
            task_id = submit.text.split("|")[1]

            for _ in range(30):
                time.sleep(5)
                result = requests.get("https://ocr.captchaai.com/res.php", params={
                    "key": API_KEY, "action": "get", "id": task_id
                })
                if result.text == "CAPCHA_NOT_READY":
                    continue
                if result.text.startswith("OK|"):
                    solution = result.text.split("|")[1]
                    break

            # Submit solution
            form = soup.find("form")
            form_data = {inp.get("name"): inp.get("value", "")
                        for inp in form.find_all("input") if inp.get("name")}
            form_data["field-keywords"] = solution

            action = form.get("action", url)
            resp = session.post(action, data=form_data)

    # Parse product data
    soup = BeautifulSoup(resp.text, "html.parser")
    title = soup.find("span", {"id": "productTitle"})
    price = soup.find("span", class_="a-price-whole")

    return {
        "title": title.text.strip() if title else None,
        "price": price.text.strip() if price else None
    }

product = scrape_amazon_product("https://www.amazon.com/dp/B0EXAMPLE")
print(product)

Mejores prácticas para el raspado de Amazon

  1. Utilice proxies residenciales: Amazon bloquea agresivamente las IP de los centros de datos
  2. Rotar agentes de usuario: utilice un conjunto de cadenas de navegador realistas
  3. Mantener sesiones: conservar las cookies en todas las solicitudes
  4. Agregar retrasos: 3 a 10 segundos entre solicitudes
  5. Establecer idioma de aceptación: incluya siempre encabezados locales
  6. No elimine las páginas iniciadas: se puede acceder a las páginas de productos sin iniciar sesión

Solución de problemas

Problema Solución
CAPTCHA en cada solicitud Utilice representantes residenciales; ralentizar la tasa de solicitudes
Solución CAPTCHA rechazada Verifique que la imagen se haya descargado correctamente; reintentar
Bucles de redireccionamiento Verificar el manejo de cookies; utilizar allow_redirects=True
Datos de producto vacíos Amazon puede ofrecer diferentes diseños; seleccionar selectores

Preguntas frecuentes

¿Amazon utiliza reCAPTCHA?

Amazon utiliza principalmente su propio CAPTCHA (texto distorsionado) basado en imágenes. CaptchaAI los resuelve utilizando el punto final method=base64 para la resolución de image/OCR.

¿Cuántas solicitudes antes de que Amazon muestre un CAPTCHA?

Varía. Con buenos servidores proxy y encabezados realistas, puedes eliminar cientos de páginas. Sin servidores proxy, los CAPTCHA pueden aparecer después de 10 a 20 solicitudes.

La extracción de datos de productos disponibles públicamente es generalmente legal, pero consulte los términos de servicio de Amazon y las leyes aplicables en su jurisdicción.

Guías relacionadas

Los comentarios están deshabilitados para este artículo.