Cas d'Usage

Collecte de données sur les sites de vente au détail avec gestion CAPTCHA

Amazon utilise des CAPTCHA d'image pour bloquer l'accès automatisé. Lorsque vous atteignez leur seuil anti-bot, vous verrez une page vous demandant de saisir des caractères à partir d'une image déformée. La résolution OCR de CaptchaAI les gère automatiquement.

Comment fonctionne le CAPTCHA d'Amazon

Amazon déclenche des CAPTCHA en fonction de :

Signal Descriptif
Volume de demande Trop de requêtes provenant d'une seule adresse IP dans une courte fenêtre
Cookies manquants Pas de cookies de session Amazon
En-têtes suspects Agent utilisateur de type robot ou en-têtes manquants
Réputation IP Plages IP connues du centre de données ou du proxy

Lorsqu'il est déclenché, Amazon redirige vers une page avec une image de texte déformée et un champ de saisie. Vous devez résoudre l'image et soumettre le texte pour continuer.

Exigences

Exigence Détails
Clé API CaptchaAI Depuiscaptchaai.com
Python3.7+ Avec des demandes et une belle soupe4
Procurations résidentielles Recommandé pour un grattage soutenu

Résoudre le CAPTCHA d'image d'Amazon

Étape 1 : Détecter la page 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")

Étape 2 : extraire et résoudre l'image

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")

Étape 3 : soumettre la solution

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

Exemple de travail complet

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)

Meilleures pratiques pour le scraping d'Amazon

  1. Utilisez des proxys résidentiels – Amazon bloque de manière agressive les adresses IP des centres de données
  2. Rotation des agents utilisateurs – Utilisez un pool de chaînes de navigateur réalistes
  3. Maintenir les sessions – Conserver les cookies lors des requêtes
  4. Ajouter des délais – 3 à 10 secondes entre les requêtes
  5. Définir Accept-Language – Toujours inclure les en-têtes de paramètres régionaux
  6. Ne supprimez pas les pages connectées – Les pages produits sont accessibles sans connexion

Dépannage

Problème Corriger
CAPTCHA à chaque demande Utiliser des proxys résidentiels ; ralentir le taux de demandes
Solution CAPTCHA rejetée Vérifiez que l'image a été téléchargée correctement ; réessayer
Redirection des boucles Vérifiez la gestion des cookies ; utiliser allow_redirects=True
Données produit vides Amazon peut proposer différentes mises en page ; vérifier les sélecteurs

FAQ

Amazon utilise-t-il reCAPTCHA ?

Amazon utilise principalement son propre CAPTCHA (texte déformé) basé sur des images. CaptchaAI les résout à l'aide du point de terminaison method=base64 pour la résolution d'image/OCR.

Combien de requêtes avant qu'Amazon affiche un CAPTCHA ?

Cela varie. Avec de bons proxys et des en-têtes réalistes, vous pouvez parcourir des centaines de pages. Sans proxy, les CAPTCHA peuvent apparaître après 10 à 20 requêtes.

Le scraping d'Amazon est-il légal ?

La suppression des données produit accessibles au public est généralement légale, mais vérifiez les conditions de service d'Amazon et les lois applicables dans votre juridiction.

Guides connexes

Les commentaires sont désactivés pour cet article.