Como Extrair Dados de Produtos da Amazon em Escala com Python

O tutorial de três linhas do BeautifulSoup funciona uma vez, depois a Amazon te apresenta um CAPTCHA. Aqui está o que realmente quebra em escala — seletores de preço que mudam, precificação geográfica, bloqueios de IP — e o pipeline que sobrevive a isso.

Extrair dados de produtos da Amazon parece trivial em todo tutorial para iniciantes: requests, BeautifulSoup, pega o título e o preço, pronto. Isso funciona exatamente até você rodar algumas centenas de vezes, momento em que a Amazon te apresenta uma página de verificação de robô e seu seletor de preço retorna None. Este guia é sobre a versão que sobrevive ao contato com o site real — um pipeline que começa com ASIN, os seletores que realmente quebram, por que o mesmo produto mostra um preço diferente para diferentes IPs, e a configuração de proxy que te mantém longe do muro do CAPTCHA. É sobre dados públicos de produtos (títulos, preços, avaliações, disponibilidade), não sobre nada atrás de um login.

A estrutura da URL: ASINs são a chave

Todo produto da Amazon tem um ASIN — um identificador de 10 caracteres como B08N5WRWNW — e todo o catálogo depende dele. Uma página de produto é apenas https://www.amazon.com/dp/<ASIN>, e o mesmo ASIN mapeia entre marketplaces (amazon.co.uk/dp/<ASIN>, amazon.de/dp/<ASIN>). Páginas de busca e categoria vivem sob /s? com parâmetros de consulta e de nó de navegação. Assim, um pipeline escalável tem duas etapas: descobrir ASINs a partir de páginas de busca ou mais vendidos, depois hidratar cada um de sua página /dp/. Um aviso — um ASIN "pai" (um produto com variantes de tamanho ou cor) resolve para uma variação filha auto-selecionada, então capture o ASIN da variante em que você realmente pousou.

import requests
from bs4 import BeautifulSoup

PROXY = "http://USER:PASS@gate.quantumproxies.io:8000"
HEADERS = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
           "AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36",
           "Accept-Language": "en-US,en;q=0.9"}

def product(asin, domain="com"):
    url = f"https://www.amazon.{domain}/dp/{asin}"
    r = requests.get(url, headers=HEADERS,
                     proxies={"http": PROXY, "https": PROXY}, timeout=20)
    soup = BeautifulSoup(r.text, "html.parser")
    return parse(soup, asin)

O seletor que todo mundo copia e a Amazon aposentou

Quase todo tutorial antigo lê o preço de span#priceblock_ourprice. A Amazon serve múltiplos layouts de bloco de preço e os testa em A/B, então esse único ID está vazio na maioria das páginas hoje. A abordagem durável é tentar vários contêineres de preço conhecidos em ordem e pegar o primeiro que corresponder — e tratar um preço ausente como um estado real (geralmente fora de estoque), não como um erro.

def parse(soup, asin):
    title = soup.select_one("#productTitle")
    price = None
    for sel in ["span.a-price span.a-offscreen",   # current layout
                "#priceblock_ourprice",             # legacy
                "#priceblock_dealprice",            # deal layout
                "#corePrice_feature_div .a-offscreen"]:
        el = soup.select_one(sel)
        if el and el.get_text(strip=True):
            price = el.get_text(strip=True)
            break
    rating = soup.select_one("span.a-icon-alt")
    return {
        "asin": asin,
        "title": title.get_text(strip=True) if title else None,
        "price": price,                 # None -> likely out of stock
        "rating": rating.get_text(strip=True) if rating else None,
    }
Diagrama de um pipeline de extração da Amazon começando com ASIN: páginas de busca descobrem ASINs, proxy residencial define a geolocalização de entrega, páginas de produto fornecem detalhes, saída para CSV
Descubra ASINs a partir da busca, hidrate cada um de sua página /dp/, e fixe o IP de saída para o mercado cujo preço você deseja.

Por que o mesmo produto mostra dois preços

Este é o fato que silenciosamente arruína conjuntos de dados de preços. A Amazon localiza preço e disponibilidade para o local de entrega do comprador — a configuração "Entregar para" — que ela infere principalmente do seu IP. Extraia amazon.com de um IP de datacenter alemão e você pode obter preços em euros, ofertas diferentes, ou um vencedor diferente da Buy Box do que um comprador dos EUA vê. Se você está coletando dados de preços competitivos, a geografia do IP de saída é o experimento: para capturar o preço que um comprador dos EUA vê, você roteia através de um proxy residencial dos EUA; para o mercado do Reino Unido, uma saída do Reino Unido. Um produto, muitos preços, um por mercado que você amostra.

Obtenha proxies residenciais direcionados por geolocalização

Por que raspadores ingênuos são bloqueados

A Amazon opera sistemas automatizados de gerenciamento de solicitações: estoure muito rápido de um IP e você recebe um CAPTCHA, um banimento de IP, ou uma página simplificada. Três coisas mantêm um raspador vivo em volume. Primeiro, rotacione IPs para que nenhum endereço único carregue toda a carga — um pool residencial rotativo distribui solicitações por muitos IPs reais de consumidores. Segundo, vá com calma: atrasos aleatórios e um limite de concorrência, não um loop a toda velocidade. Terceiro, envie cabeçalhos coerentes — um User-Agent de navegador real e Accept-Language, não a string padrão do Python. Quando uma página volta suspeitosamente curta ou contém um marcador de verificação de robô, descarte-a e tente novamente em um IP novo em vez de analisar lixo.

import time, random

def fetch_many(asins, domain="com"):
    rows = []
    for asin in asins:
        for attempt in range(3):
            data = product(asin, domain)
            if data["title"]:            # got a real page
                rows.append(data)
                break
            time.sleep(1.5 + random.random())  # back off, rotate, retry
        time.sleep(random.uniform(1, 3))         # pace between products
    return rows

Busca, mais vendidos e paginação

Páginas de produtos são o detalhe; páginas de busca e mais vendidos são como você descobre o que buscar. Uma busca por palavra-chave é /s?k=<query>&page=<n>; mais vendidos dependem de nós de navegação de categoria. Percorra as páginas, extraia os ASINs de cada cartão de resultado, depois alimente-os na etapa de produto acima. Mantenha as duas etapas separadas — isso permite que você dedupe ASINs, retome uma extração, e reprecifique uma lista de ASINs conhecida em uma programação sem redescobri-la a cada execução. Para uma construção mais ampla, nosso guia sobre os melhores proxies para web scraping cobre o lado do pool disso.

Para a própria saída, mantenha o esquema de linha plano e estável: um asin, a url de origem, title, price, rating, contagem de avaliações, uma image_url e o domain do marketplace de onde você buscou. Escreva o domínio em cada linha para que um conjunto de dados de mercado misto nunca confunda um preço dos EUA com um do Reino Unido. Capture o ASIN mesmo quando o preço estiver vazio — uma leitura fora de estoque é um ponto de dados, não uma lacuna, e rastrear quando um produto entra e sai de estoque é muitas vezes tão valioso quanto o preço. Um CSV ou tabela de banco de dados com essas colunas se alimenta diretamente em rastreamento de preços, alertas de disponibilidade ou um estudo de Buy Box sem necessidade de reformulação adicional.

Lista de verificação mapeando o que quebra um raspador ingênuo da Amazon (ID de preço ausente, CAPTCHA, banimento de IP, moeda errada) para a correção de cada um
Quase toda falha de extração da Amazon é uma destas cinco — e cada uma tem uma correção concreta.

Proxies vs uma API de extração: quando mudar

requests feito à mão mais um bom pool residencial é a escolha certa enquanto você controla o volume e o alvo permanece cooperativo. Uma vez que você está mantendo seletores rotativos, tratamento de CAPTCHA, fixação geográfica e lógica de repetição em milhares de ASINs por dia, essa manutenção se torna o trabalho. Uma Scraper API simplifica isso: envie uma URL da Amazon, receba de volta dados estruturados de produtos com rotação, renderização e geolocalização tratados para você. A regra honesta — faça você mesmo enquanto o atrito é baixo, mude quando a manutenção anti-bot custar mais tempo de engenharia do que os dados valem. Nossa análise de construir vs comprar coloca números nessa linha.

Perguntas frequentes

Como faço para extrair dados de produtos da Amazon com Python?

Busque a página do produto em /dp/<ASIN> com requests e um User-Agent de navegador real, depois analise título, preço, avaliação e disponibilidade com BeautifulSoup. Tente vários seletores de preço, não apenas o aposentado priceblock_ourprice. Roteie através de um proxy residencial rotativo para que explosões não acionem um bloqueio, e fixe a geolocalização de saída para o mercado cujo preço você deseja.

É legal extrair dados de produtos da Amazon?

Coletar dados de produtos visíveis publicamente — títulos, preços, avaliações — geralmente é tratado de forma diferente de burlar logins ou copiar conteúdo protegido, mas os termos da Amazon restringem o acesso automatizado e o cenário legal varia por jurisdição e uso. Esta é uma informação geral, não um conselho legal: extraia apenas dados públicos, respeite os limites de taxa, e obtenha aconselhamento para qualquer coisa comercial ou limítrofe.

Por que meu raspador da Amazon obtém um preço diferente do site?

A Amazon localiza preços e disponibilidade para o local de entrega que ela infere do seu IP. Se seu proxy sai em um país diferente do mercado que você está estudando, você verá a moeda e ofertas erradas. Fixe o IP de saída para o mercado-alvo — um IP residencial dos EUA para preços dos EUA, um IP do Reino Unido para preços do Reino Unido — para que os dados correspondam ao que um comprador real lá vê.

Como evito ser bloqueado ao extrair dados da Amazon?

Rotacione através de muitos IPs residenciais para que nenhum endereço único carregue a carga, limite com atrasos aleatórios e um limite de concorrência, e envie cabeçalhos de navegador coerentes. Valide cada resposta — um 200 ainda pode ser uma página de verificação de robô — e tente novamente em um IP novo em vez de analisar um bloqueado. Em alto volume, uma Scraper API cuida de tudo isso para você.

A Amazon em escala não é difícil porque a análise é difícil — é difícil porque o site reage e o preço depende de onde você está. Construa começando com ASIN, combine vários contêineres de preço, fixe sua geolocalização, rotacione seus IPs, e trate uma resposta curta como um bloqueio, não como dados. Acerte isso e o tutorial para iniciantes finalmente escala.

Extraia dados da Amazon com a Scraper API da QuantumProxies