Como Raspagem de Resultados de Busca no eBay: Guia de Preparação de Sessão e Anti-Detecção
Advanced Data Extraction Specialist
Principais Conclusões:
- Um pedido frio ao endpoint de busca do eBay é bloqueado. Uma navegação automatizada direta para
https://www.ebay.com/sch/i.html?_nkw=laptopresulta em uma página de erro do eBay, mesmo a partir de uma sessão nova de navegador na nuvem residencial dos EUA — o eBay controla o caminho de busca de forma mais rígida do que suas páginas de item e navegação. - Aquecer a sessão é a solução. Abra uma sessão persistente de navegador na nuvem, acesse a página inicial do eBay primeiro para que os cookies e o estado de navegação sejam definidos, e depois navegue para a URL de busca na mesma sessão. A página de busca então carrega com a grade completa de resultados renderizada.
- Extração de âncoras na
.su-card-container. O eBay rotacionou sua marcação de cartão de resultados; o antigo seletorli.s-itemagora não corresponde a nada. Os atuais cartões de resultados orgânicos carregam a classe.su-card-container— selecione isso e leia os campos filhos de cada cartão. - A integração é um único endpoint CDP. Crie uma URL de WebSocket do Scrapeless Scraping Browser com sua chave de API, e o
connect_over_cdpdo Playwright a controla exatamente como faria com um navegador local — assim, a renderização, a saída residencial e a impressão digital acontecem na nuvem. - A saída residencial realiza o trabalho. O Scrapeless Scraping Browser roteia através de proxies residenciais em mais de 195 países e aleatoriza a impressão digital do navegador por sessão, de modo que o navegador na nuvem renderiza páginas do eBay que um navegador automatizado local seria filtrado.
- Gratuito para começar. Novas contas Scrapeless incluem tempo de execução gratuito do Scraping Browser — inscreva-se em app.scrapeless.com.
Introdução: Por que a página de busca do eBay bloqueia a abordagem óbvia
O eBay é um dos maiores mercados públicos da web, e seus resultados de busca são uma fonte densa de dados sobre preços, listagens e concorrência. As equipes de precificação rastreiam o que itens comparáveis estão vendendo, as equipes de proteção de marca observam listagens não autorizadas, e agentes de IA extraem o contexto das listagens para responder perguntas sobre produtos. Tudo isso está por trás do endpoint de busca em /sch/i.html.
A abordagem óbvia — apontar um cliente HTTP ou um navegador headless local para essa URL — falha rapidamente. Um pedido automatizado frio para https://www.ebay.com/sch/i.html?_nkw=laptop resulta em uma página de erro do eBay em vez de resultados. Isso acontece mesmo a partir de um IP residencial dos EUA limpo: o eBay avalia a reputação do IP, impressão digital do dispositivo, taxa de pedidos e sinais comportamentais, e controla o caminho de busca de forma mais agressiva do que suas páginas de item e navegação. A página é renderizada para um humano e é bloqueada para um script.
Este tutorial constrói um pipeline em Python em cima do Scrapeless Scraping Browser que supera esse obstáculo da maneira que um visitante real o faz — ao acessar a página inicial primeiro, permitindo que a sessão aqueça, e depois navegando para a busca dentro da mesma sessão. Você se conecta ao navegador na nuvem através do CDP com Playwright, o cliente oficialmente suportado, então a renderização, a saída residencial e a impressão digital anti-deteção acontecem do lado da nuvem. Para uma construção diferente em um grande mercado usando o mesmo princípio, veja o melhor resumo de raspadores do Amazon; para uma comparação de preços localizados entre ferramentas, veja Melhores Raspadores do Zillow em 2026.
O Que Você Pode Fazer Com Isso
O padrão de sessão aquecida — página inicial primeiro, depois páginas de busca e detalhe em uma sessão de navegador na nuvem mantida — cobre a maioria das tarefas que um pipeline de dados do eBay precisa:
- Rastrear preços de concorrentes. Extraia o preço e o título da listagem de cada cartão de resultado em uma consulta de busca, e compare com seu próprio catálogo em uma programação.
- Monitorar uma categoria de produto. Navegue por uma categoria ou consulta de palavras-chave em várias páginas e colete listagens em registros tipados para análise de tendências.
- Acompanhar listagens não autorizadas. Busque sua marca ou SKU e sinalize vendedores que não deveriam estar listando.
- Capturar resultados geo-específicos. Fixe a saída residencial dos EUA para ver as listagens, moeda e disponibilidade que um comprador dos EUA veria, em vez de qualquer coisa que um IP de escritório resolve.
- Fornecer contexto de listagens a um agente de IA. Renderize páginas de busca e itens para campos estruturados limpos para que uma camada de recuperação ou agente possa responder a perguntas sobre produtos com dados atuais.
- Construir um conjunto de dados de histórico de preços. Faça instantâneas das mesmas consultas ao longo do tempo e armazene os resultados renderizados para estudar como os preços se movimentam.
Por que o Scrapeless Scraping Browser
O Scrapeless Scraping Browser é um navegador na nuvem personalizável, anti-deteção, projetado para robôs de web e agentes de IA. Para o eBay especificamente, ele oferece:
- Navegador na nuvem anti-deteção. Ele executa um Chromium desenvolvido internamente com renderização completa de JavaScript do lado da nuvem, de modo que a grade de busca, imagens carregadas sob demanda e detalhes dos itens sejam processados antes que o parser os leia.
- Proxies residenciais em mais de 195 países. Defina
proxyCountryna URL de conexão e o navegador em nuvem se conecta a IPs residenciais reais na região que você direciona, para que o eBay retorne o que um comprador local vê. - Randomização de fingerprint por sessão. Cada sessão recebe uma fingerprint aleatória — agente do usuário, fuso horário, WebGL e canvas — para que o navegador automatizado não colapse em uma única identidade detectável.
- Persistência de sessão via
sessionTTL. Mantenha uma sessão aberta durante o aquecimento da página inicial e a navegação de busca definindosessionTTLna URL de conexão, para que cookies e estado de navegação sejam mantidos entre as requisições em uma única execução. - Um único endpoint CDP. Crie uma URL WebSocket com sua chave de API;
connect_over_cdpdo Playwright a manipula como se fosse um navegador local, então seu código de parsing não muda.
O tempo de execução é gratuito para começar e escala com o uso — veja Preços do Scrapeless para os níveis, e obtenha sua chave de API no plano gratuito em app.scrapeless.com.
Pré-requisitos
Antes de começar, certifique-se de que você possui:
- Python 3.10+ — necessário pela biblioteca fetcher abaixo.
- pip — para instalar os pacotes.
- Uma conta Scrapeless e chave de API — inscreva-se para o plano gratuito em app.scrapeless.com, e então pegue sua chave em Configurações → Gerenciamento de Chave de API.
- Familiaridade básica com seletores CSS e o terminal — você usará ambos para buscar páginas e extrair valores delas.
Instalar
Você precisa de um pacote: Playwright para Python, o cliente oficialmente suportado para o Scrapeless Scraping Browser.
1. Instale o Playwright
bash
pip install playwright
connect_over_cdp do Playwright se conecta ao navegador em nuvem remoto Scrapeless, então você não precisa rodar playwright install ou baixar qualquer binário de navegador local — a renderização acontece na nuvem. O Playwright mantém uma conexão aberta através de múltiplas cargas de página, o que permite que o aquecimento da página inicial e a busca compartilhem uma única identidade de sessão.
2. Defina sua chave de API do Scrapeless
Exporte sua chave para que ela possa ser utilizada na URL de conexão:
bash
export SCRAPELESS_API_KEY=your_api_token_here
No Windows, use setx SCRAPELESS_API_KEY "your_api_token_here" (persistente, novo shell) ou $env:SCRAPELESS_API_KEY="your_api_token_here" (sessão atual do PowerShell). O helper de conexão abaixo lê essa variável e a incorpora na URL como token.
Passo 1 — Construa a conexão e confirme que a requisição fria está bloqueada
Comece reproduzindo o bloqueio, para que o restante do pipeline tenha uma linha de base clara. Construa a URL do Scrapeless Scraping Browser, conecte-se com o Playwright e navegue diretamente até o endpoint de busca sem visitar a página inicial primeiro.
python
import os
from urllib.parse import urlencode
from playwright.sync_api import sync_playwright
def scraping_browser_url(proxy_country="US", session_ttl=240):
# A chave da API é incorporada na URL como `token`; egress e duração são parâmetros de consulta.
params = urlencode({
"token": os.environ["SCRAPELESS_API_KEY"],
"sessionTTL": session_ttl,
"proxyCountry": proxy_country,
})
return f"wss://browser.scrapeless.com/api/v2/browser?{params}"
with sync_playwright() as p:
browser = p.chromium.connect_over_cdp(scraping_browser_url("US"))
page = browser.new_page()
# Navegação fria diretamente para o endpoint de busca, sem aquecimento da página inicial.
page.goto("https://www.ebay.com/sch/i.html?_nkw=laptop",
wait_until="domcontentloaded")
print(page.title()) # -> "Página de Erro | eBay" / "Acesso Negado"
browser.close()
Uma navegação automatizada fria para /sch/i.html leva a uma página de erro do eBay, mesmo que a sessão saia de um IP residencial limpo dos EUA. O eBay trata o endpoint de busca como um caminho sensível e desafia requisições que chegam sem um contexto de navegação estabelecido. A solução não é um cabeçalho diferente ou um IP diferente — é chegar da mesma forma que uma pessoa, o que é o próximo passo.
Passo 2 — Aqueça a sessão na página inicial, e depois busque
A solução é uma sessão mantida. Abra uma conexão de navegador em nuvem, carregue a página inicial do eBay primeiro para que cookies e estado de navegação se estabeleçam, então navegue para a URL de busca dentro dessa mesma sessão. O Playwright mantém a única conexão CDP com o navegador em nuvem Scrapeless aberta e direciona cada página por meio dela, para que o aquecimento e a busca compartilhem uma identidade única.
python
with sync_playwright() as p:
browser = p.chromium.connect_over_cdp(scraping_browser_url("US"))
page = browser.new_page()
# 1. Aqueça a sessão: chegue à página inicial para que cookies/estado de navegação se estabeleçam.
page.goto("https://www.ebay.com/", wait_until="domcontentloaded")
page.wait_for_timeout(2500)
# 2. Agora navegue para a busca na MESMA sessão.
page.goto("https://www.ebay.com/sch/i.html?_nkw=laptop",
esperar_ate="domcontentloaded")
pagina.espera_por_timeout(3000) # deixe a grade se hidratar
print(pagina.titulo()) # -> "Laptop à venda | eBay"
cartoes = pagina.query_selector_todos(".su-card-container") # os cartões de resultado renderizados
print(len(cartoes), "cartões") # a grade agora está populada
Com a página inicial visitada primeiro, a mesma URL de pesquisa que foi bloqueada na Etapa 1 agora retorna o título Laptop à venda | eBay e uma grade de resultados populada. A curta espera_por_timeout após a navegação permite que os cartões se hidrate antes da extração. A única diferença é a ordem de chegada dentro de uma sessão mantida — a página inicial estabelece o contexto de navegação, e a solicitação de pesquisa o herda.
Etapa 3 — Extrair os cartões de resultado
O eBay rotacionou sua marcação de cartão de resultado, então ancore na classe atual. Os cartões de resultado orgânicos carregam .su-card-container; o seletor mais antigo li.s-item agora não corresponde a nada. Selecione os cartões e, em seguida, leia os campos filhos de cada um.
python
def texto_de(el, seletor):
nodo = el.query_selector(seletor)
return nodo.texto_interno().strip() se nodo else None
registros = []
for cartao in pagina.query_selector_todos(".su-card-container"):
# Os seletores filhos são ilustrativos — confirme os nós de título/preço/link
# contra o DOM atual do eBay, uma vez que a marcação rotaciona.
titulo = texto_de(cartao, ".su-styled-text") # título do anúncio (caminho ilustrativo)
preco = texto_de(cartao, ".su-styled-text.s-price") # texto do preço (caminho ilustrativo)
link_el = cartao.query_selector("a") # URL do anúncio
link = link_el.obter_atributo("href") se link_el else None
registros.append({
"titulo": titulo,
"preco": preco,
"link": link,
})
print(len(registros), "anúncios")
Ancore cada extração em .su-card-container; trate os seletores filhos (titulo, preco, link) como pontos de partida para confirmar contra o DOM ao vivo, porque o eBay reorganiza a marcação interna de forma independente do invólucro do cartão. Defina cada campo ausente como None para que um cartão esparso não quebre a execução — o eBay omite um preço em alguns formatos de anúncio (leilões em andamento, colocações de "veja os detalhes"), e alguns cartões são slots patrocinados com uma forma diferente.
Obtenha sua chave API no plano gratuito: app.scrapeless.com
Etapa 4 — Navegar pelos resultados e seguir anúncios até páginas de detalhes
A maioria dos trabalhos reais abrange mais de uma URL. Como a sessão já está quente e mantida aberta, passar pelos resultados e seguir anúncios individuais até suas páginas de itens não custa nada a mais — os mesmos cookies, identidade residencial e impressão digital se mantêm durante toda a navegação. O eBay paginates o endpoint de pesquisa com o parâmetro de consulta _pgn.
python
linhas = []
com sync_playwright() como p:
navegador = p.chromium.connect_over_cdp(url_do_browser_de_scraping("US", session_ttl=300))
pagina = navegador.nova_pagina()
pagina.vai_para("https://www.ebay.com/", esperar_ate="domcontentloaded") # esquente uma vez
pagina.espera_por_timeout(2500)
para n em range(1, 4): # páginas 1..3
url = f"https://www.ebay.com/sch/i.html?_nkw=laptop&_pgn={n}"
pagina.vai_para(url, esperar_ate="domcontentloaded")
pagina.espera_por_timeout(3000)
para cartao em pagina.query_selector_todos(".su-card-container"):
link_el = cartao.query_selector("a")
se link_el e link_el.obter_atributo("href"):
linhas.append({"link": link_el.obter_atributo("href")})
# Siga um anúncio até sua página de item na mesma sessão quente.
se linhas:
pagina.vai_para(linhas[0]["link"], esperar_ate="domcontentloaded")
h1 = pagina.query_selector("h1") # título da página do item (confirme contra o DOM)
titulo_item = h1.texto_interno() se h1 else None
navegador.fecha()
print(len(linhas), "anúncios coletados")
O aquecimento da página inicial acontece uma vez, no topo da sessão; cada página de pesquisa e página de item depois disso reutiliza o contexto estabelecido. Páginas de itens e páginas de navegação ou ofertas renderizam diretamente uma vez que a sessão está quente — a série mais pesada de restrições está especificamente no endpoint de pesquisa. Para uma coleta de lista a detalhe, colete as URLs dos anúncios da grade de pesquisa primeiro, depois busque cada uma através do mesmo navegador para que a sessão residencial e a impressão digital permaneçam constantes por toda a navegação.
Etapa 5 — Fortalecimento da produção
Mover de um script funcional para um trabalho confiável é principalmente sobre se manter dentro das tolerâncias da plataforma. Algumas regras têm a maior parte do peso:
- Limite a concorrência. Mantenha em ≤3 sessões de navegador em nuvem por host. Exceder isso convida limites de taxa e reinicializações de conexão, e o aumento marginal de capacidade raramente justifica a fricção extra.
- Aqueça uma vez e reutilize a sessão. Defina
sessionTTL(por exemplo, 240 segundos) na URL de conexão, visite a página inicial uma vez no início da sessão e, em seguida, execute todas as pesquisas e navegações de item através da mesma conexão Playwright. Reaquecer por página desperdiça o contexto mantido e o handshake de conexão. - Fixe
proxyCountry=US. As listagens, moedas e disponibilidade do eBay variam por região; fixar a saída residencial dos EUA mantém os resultados consistentes com o local que você direciona. - Trate campos ausentes como anuláveis. Cartões reais omitem preços, classificações ou linhas de envio em alguns formatos de listagem. Defina seletores ausentes como
Noneem vez de afirmar que existem, para que um registro esparso não quebre o lote.
O Que Você Recebe de Volta
json
[
{
"title": "Dell Latitude 7420 14\" Laptop i7 16GB 512GB SSD Windows 11 Pro",
"price": "$329.99",
"link": "https://www.ebay.com/itm/1234567890"
},
{
"title": "Apple MacBook Air 13.3\" M1 8GB 256GB - Space Gray",
"price": "$489.00",
"link": "https://www.ebay.com/itm/9876543210"
},
{
"title": "Lenovo ThinkPad X1 Carbon Gen 9 i5 16GB 256GB",
"price": "$415.50",
"link": "https://www.ebay.com/itm/5556667778"
}
]
// A forma reflete a extração da Etapa 3; os valores dos campos são exemplos ilustrativos.
Algumas observações honestas ao executar este pipeline:
- A busca fria é negada; a quente não. Uma navegação direta para
/sch/i.htmlleva a uma página de erro do eBay; visitar a página inicial primeiro dentro da mesma sessão mantida limpa e a pesquisa retorna o títuloLaptop for sale | eBaycom uma grade populada. - Uma breve espera pós-navegação cobre a hidratação. Os cartões de resultado carregam após a primeira pintura, portanto, um breve
wait_for_timeoutapósgotoé o que os torna disponíveis para o seletor. .su-card-containeré o âncora estável. O eBay rotacionou sua marcação de cartões — o antigoli.s-itemnão retorna nada. Âncora em.su-card-containere reconfirme os seletores de campo filho após qualquer redesign.- Fixe
proxyCountrypara resultados consistentes. Listagens, moeda e disponibilidade variam por região; fixar a saída residencial dos EUA mantém a saída consistente com o local que você direciona. - Páginas de itens e navegação renderizam diretamente. O maior bloqueio está no ponto de acesso de pesquisa; uma vez que a sessão esteja quente, páginas de itens, navegação e ofertas carregam sem o desvio da página inicial.
Conclusão: Escale seu pipeline de listagens do eBay
O pipeline se reduz a quatro movimentos. Conecte-se a uma sessão de Navegação Scrapeless e aqueça-a na página inicial. Navegue até o endpoint de pesquisa dentro dessa mesma sessão mantida para que a solicitação herde um contexto de navegação estabelecido. Extraia a grade de resultados ancorando-se em .su-card-container. Em seguida, passe pelos resultados e siga as listagens para páginas de detalhes durante a uma única sessão aquecida. Você só paga pelo navegador em nuvem quando realmente precisa — veja preços Scrapeless para o que o tier gratuito cobre — e o restante permanece em Python simples.
A partir daqui, o mesmo padrão de sessão aquecida se encaixa em construções de marketplaces maiores. Veja a coletânea dos melhores scrapers do Amazon para uma comparação de grandes marketplaces, e Os melhores Scrapers do Zillow em 2026 para uma comparação de ferramentas de preços localizados. Antes de enviar: exporte SCRAPELESS_API_KEY, fixe proxyCountry=US, aqueça a sessão na página inicial antes de tocar em /sch/, mantenha a concorrência em ≤3 sessões por host, âncora em .su-card-container e trate campos ausentes como anuláveis. Guias de conexão e biblioteca em docs.scrapeless.com.
Pronto para Construir Seu Pipeline de Dados com IA?
Junte-se à nossa comunidade para reivindicar um plano gratuito e se conectar com desenvolvedores que constroem pipelines de dados do eBay e de marketplaces: Discord · Telegram.
Inscreva-se em app.scrapeless.com para um runtime gratuito do Navegador de Scraping e adapte os padrões acima às consultas e regiões do eBay que o pipeline precisa.
FAQ
Você precisa de um proxy?
Sim — a saída residencial gera uma execução no eBay. Fixe proxies residenciais
Uma navegação automatizada fria para https://www.ebay.com/sch/i.html aterrissa em uma página de erro do eBay porque a solicitação chega sem um contexto de navegação estabelecido — o eBay controla o caminho de busca de forma mais rigorosa do que suas páginas de itens e navegação. A solução é aquecer a sessão primeiro: abra uma sessão de navegador em nuvem mantida, carregue a página inicial do eBay para que cookies e estado de navegação se estabilizem, e depois navegue para a URL de busca nessa mesma sessão. A busca então carrega com o título Laptop for sale | eBay e uma grade preenchida.
Meus seletores pararam de funcionar após um redesign do eBay. Como você corrige isso?
O eBay rota seu DOM. Baseie sua extração no wrapper do cartão de resultado .su-card-container em vez de em um caminho de filho profundo e re-confirme os seletores de título, preço e link em relação à marcação atual após um redesign. O seletor mais antigo li.s-item não corresponde a nada na disposição atual, que é a razão pela qual o wrapper do cartão é o ponto de ancoragem estável.
Existem limites de concorrência que você deve respeitar?
Mantenha em ≤3 sessões de navegador em nuvem por host. Além disso, você troca um pouco de vazão por muito limite de taxa e redefinições de conexão. Utilize concorrência limitada e uma fila em vez de disparar todos os pedidos de uma vez.
Isso pode rodar sem um agente de IA?
Sim. O padrão Python acima é independente — o Playwright conecta-se ao Scrapeless Scraping Browser via CDP, e seu código aquece a sessão, navega e extrai. Um agente de IA é uma camada opcional, não uma exigência.
Na Scorretless, acessamos apenas dados disponíveis ao público, enquanto cumprem estritamente as leis, regulamentos e políticas de privacidade do site aplicáveis. O conteúdo deste blog é apenas para fins de demonstração e não envolve atividades ilegais ou infratoras. Não temos garantias e negamos toda a responsabilidade pelo uso de informações deste blog ou links de terceiros. Antes de se envolver em qualquer atividade de raspagem, consulte seu consultor jurídico e revise os termos de serviço do site de destino ou obtenha as permissões necessárias.



