O parser funcionou por seis meses, e hoje a base recebeu linhas vazias. A primeira ideia é que foi bloqueado, é preciso trocar o proxy. Você troca o pool, melhora a qualidade dos IPs, paga por residenciais em vez de datacenter — mas os campos continuam vazios. Porque a razão não era o bloqueio: o site mudou para um novo layout, e seu seletor CSS não está mais vinculado a nada.
Esse é o tipo de falha mais caro, porque ele fica em silêncio. O bloqueio é visível imediatamente: 403, captcha, redirecionamento. O drift do layout não derruba nada — HTTP 200, página recebida, tráfego pago, e no final None. Vamos analisar como, em cinco minutos, diferenciar uma coisa da outra e como parar de reescrever seletores manualmente após cada redesign.
Para quem isso é necessário
Um guia para aqueles que mantêm o parser em produção por mais de um sprint: monitoramento de preços de concorrentes, coleta de avaliações, agregação de vagas, exportações diárias para análise. Se você executa o script uma vez e descarta — o drift do layout não te afeta. Se o script roda por cron durante meses, esse é seu principal custo de suporte.
A escala do problema não é fictícia. Segundo analistas da GroupBWT, mudanças estruturais não gerenciadas em sites geram cerca de 40–60% de custos recorrentes de suporte para scrapers em grandes projetos. Em setores específicos, 10–15% dos crawlers precisam de reparo semanalmente — devido a deslocamentos do DOM, fingerprinting e throttling de endpoints. Ou seja, consertar seletores compete em custo com contornar anti-bots, mas recebe muito menos atenção.
O cenário é preocupante: no relatório da Apify “State of Web Scraping 2026”, 65,8% dos entrevistados aumentaram o uso de proxies, 58,3% notaram um aumento nos custos com proxies ano a ano, e mais de 62% relataram um aumento geral nos custos de infraestrutura, principalmente devido ao fortalecimento da proteção contra bots. Nesse contexto, queimar tráfego pago em páginas das quais você não extrai nada é ainda mais frustrante.
Passo 1. Distinguir bloqueio de drift de layout
A diagnose leva alguns minutos e deve ser feita rigorosamente em ordem — caso contrário, é fácil “consertar” a falha errada.
- Observe o código de resposta e o tamanho do corpo. 403, 429, 503, redirecionamento para a página de verificação ou corpo de 2–5 KB — isso é anti-bot. HTTP 200 e uma página robusta de 200–800 KB — o site te deixou entrar, não é problema de proxy.
- Salve o HTML bruto no disco e abra com os olhos. Não no depurador, mas no navegador. Se o produto/avaliação/preço está no lugar, mas o parser não os vê — isso é drift de layout.
- Encontre o texto necessário buscando no arquivo. Está no HTML, mas não está acessível pelo seu seletor — a marcação mudou. Não está de jeito nenhum — o conteúdo é carregado por script, precisa de um motor de navegador, não de uma requisição HTTP.
- Compare com a exportação anterior bem-sucedida. Faça um diff entre o HTML antigo e o novo do mesmo URL: geralmente é fácil ver uma nova classe wrapper, um bloco deslocado ou a substituição de
idpordata-*. - Verifique se o site não entregou uma versão diferente da página. Sobre isso — falaremos separadamente abaixo, porque aqui o proxy realmente tem a ver.
Se após o terceiro ponto o diagnóstico for “a marcação mudou”, trocar o proxy é inútil. É necessário um parser que consiga encontrar o elemento, mesmo quando o seletor está obsoleto.
Passo 2. O que são seletores adaptativos
A ideia é simples: em vez de se prender rigidamente à linha .product-card > h3.title, a biblioteca memoriza uma vez o “retrato” do elemento necessário, e na próxima execução busca o elemento mais parecido com esse retrato na página.
Isso é implementado de forma mais prática no Scrapling — um framework Python aberto de Karim Shoair. O projeto foi lançado em outubro de 2024 e, até setembro de 2026, acumulou mais de 78.000 estrelas no GitHub; a última versão no momento da escrita é v0.4.15 de 23 de agosto de 2026, com commits diários. É necessário Python 3.10+.
A mecânica da busca adaptativa funciona assim. Quando você chama o seletor com auto_save=True, o Scrapling salva a impressão do elemento:
- nome da tag, texto e todos os atributos com seus valores;
- nomes das tags vizinhas;
- caminho até o elemento — apenas pelos nomes das tags;
- tag, atributos e texto do pai.
A impressão é armazenada em um banco de dados local SQLite e indexada pela dupla “domínio + identificador”. O domínio é extraído da URL da página (ou definido pelo parâmetro adaptive_domain), e o identificador padrão é a própria string do seletor — ou seu próprio, se você passar identifier=.
Quando o layout muda e o seletor comum retorna vazio, a chamada com adaptive=True levanta a impressão salva e a percorre por todos os elementos da página, calculando uma avaliação difusa de similaridade — até mesmo a ordem dos atributos. O elemento com a maior correspondência é retornado.
Isso custa barato. Segundo os benchmarks oficiais do projeto, o parsing leva 1,99 ms contra 2,01 ms do Parsel/Scrapy, 22,93 ms do PyQuery, 80,57 ms do Selectolax e 1541 ms do BeautifulSoup com lxml. A própria busca adaptativa por um elemento semelhante leva 2,46 ms contra 13,3 ms do AutoScraper. Ou seja, a proteção contra redesign adiciona cerca de duas milissegundos à requisição em meio a latências de rede de centenas de milissegundos.
Passo 3. Instalando e ativando
A instalação depende de você precisar de um navegador:
pip install scrapling— apenas o parser, sem a parte de rede. É suficiente se você obtiver o HTML com seu próprio código.pip install "scrapling[fetchers]", depoisscrapling install— adiciona fetchers e baixa navegadores com dependências.- Adicionalmente:
[ai]— servidor MCP,[rag]— wrapper para RAG,[shell]— console interativa,[all]— tudo de uma vez. Há uma imagem prontapyd4vinci/scrapling.
Em seguida — dois execuções. A primeira em um layout de trabalho ao vivo salva a impressão, a segunda já consegue sobreviver ao redesign:
- Execução de referência. Crie um objeto
Selectorcomadaptive=Truee certifique-se de passarurl— caso contrário, o domínio irá para a chave"default", e as impressões de diferentes sites se misturarão. Chame o seletor necessário comauto_save=True. - Execução de produção. O mesmo seletor, mas com
adaptive=True. Enquanto a marcação estiver intacta, o caminho comum funcionará. Quando quebrar — a busca por similaridade será ativada. - Registre as discrepâncias. O momento em que o seletor comum retorna vazio, enquanto o adaptativo encontra algo, é um sinal de “o site mudou”, e isso deve ser visível no monitoramento, não ignorado em silêncio.
Um detalhe importante sobre a reescrita: a salvaguarda não se acumula. Um novo auto_save para a mesma dupla “domínio + identificador” sobrescreve a impressão anterior. Portanto, a referência deve ser feita em uma página comprovadamente correta, e não em um ciclo por todo o pool de URLs.
Passo 4. Proxies: onde eles realmente se encaixam
Começamos dizendo que o drift do layout não é sobre proxies. Isso é verdade exatamente pela metade, e a outra metade custa dinheiro.
O site pode te entregar uma marcação diferente devido à saída do proxy. Localidade, idioma e país mudam o template da página: outra ordem de blocos, outras classes, outros formatos de preços e datas. Isso não é uma hipótese — no próprio Scrapling há uma correção exemplar: na versão 0.4.12, o StealthyFetcher removeu a localidade forçada en-US, porque a localidade imposta não correspondia ao geo real e quebrava o comportamento. Daí a regra prática: capture a impressão de referência do mesmo geo de onde você depois coleta os dados. A impressão capturada através de um IP alemão terá uma correspondência pior com a página recebida através de um IP brasileiro — e você receberá um falso alarme de “o site mudou o layout”.
Consequências práticas:
- Se o pool é multilateral — separa as impressões através de
adaptive_domain, definindo uma chave do tipo “domínio + país”. Caso contrário, uma entrada no SQLite será constantemente sobrescrita por versões de diferentes geos. - Para cenários longos, mantenha um país e uma sessão para toda a tarefa. Como fazer isso é detalhadamente discutido no material sobre sessões sticky e quando usá-las.
- Testes A/B e lançamentos graduais oferecem simultaneamente dois layouts ativos em um mesmo domínio. Aqui, a busca adaptativa é especialmente útil: ela extrai o elemento de ambos os ramos, enquanto um seletor rígido retornará aleatoriamente vazio em metade das requisições.
Definir proxies no Scrapling pode ser feito em todos os níveis. Para requisições HTTP rápidas, Fetcher e AsyncFetcher têm o parâmetro proxies. Para sessões, existe o ProxyRotator, que recebe uma lista de endereços — ele é inserido no FetcherSession. As sessões de navegador DynamicSession e StealthySession aceitam proxies no nível da sessão, para que o IP não mude no meio do script.
Outra coisa que economiza tanto o pool quanto os nervos, que apareceu na versão 0.4.12 — AutoThrottle: a biblioteca ajusta automaticamente as pausas entre requisições de acordo com as respostas do servidor, dobra a latência em caso de bloqueio e respeita o cabeçalho Retry-After. Esse é exatamente o comportamento que distingue uma coleta cuidadosa de uma corrida para bloqueios com retries ingênuos.
Armadilhas
- Não comite o SQLite com impressões no git. A documentação alerta sobre isso. Além disso, não use
auto_saveem páginas com dados pessoais — a impressão captura texto e atributos do elemento. - A busca adaptativa não substitui o monitoramento. Ela retornará o “elemento mais parecido”, mas o mais parecido nem sempre é o correto. Se o site trocou o preço com desconto pelo preço sem desconto, a similaridade é alta, mas os dados estão incorretos. Mantenha verificações sobre o intervalo de valores e a proporção de campos vazios na exportação.
- Uma falha silenciosa é mais cara que uma barulhenta. Enquanto o seletor silenciosamente retorna None, o pipeline continua a percorrer páginas e queimar tráfego pago. Sobre o que realmente custa um gigabyte do qual não extraímos dados, há uma análise separada — por que o preço do proxy por GB é enganoso.
- A impressão envelhece. Após um redesign confirmado, capture a referência novamente, caso contrário, a próxima alteração no site será considerada a partir do retrato desatualizado, e a precisão cairá.
- Se não há conteúdo no HTML — a adaptabilidade não ajudará, é necessário um fetcher de navegador. Na versão 0.4.15, as abas do navegador começaram a ser reutilizadas entre requisições, e o método
close_pages()as fecha forçadamente; também foram corrigidos os travamentos no modo headless e a solução Turnstile deixou de depender da localidade do navegador.
Qual tipo de proxy escolher para essa tarefa
A escolha é ditada não pelo parser, mas pelo site-alvo:
- Proxies de datacenter — para sites sem um anti-bot sério: documentação, registros públicos, catálogos abertos, feeds RSS e CSV (para os últimos, na versão 0.4.13 foram adicionados
XMLFeedSpidereCSVFeedSpidercom descompactação automática gzip). Barato e rápido, e a estabilidade da marcação aqui geralmente é maior. - Proxies residenciais — para marketplaces, agregadores e tudo que personaliza a entrega por geo. É aqui que é crítico capturar a impressão de referência e coletar dados de um único país, caso contrário, você estará consertando não uma falha, mas sua própria geografia.
- Proxies móveis — quando o site entrega um template móvel e precisa ser parseado como está, ou quando a confiança no IP é mais importante que o preço por gigabyte.
Resumindo
Campos vazios na exportação são dois diagnósticos diferentes com tratamentos diferentes. Primeiro, verifique o código de resposta e o HTML bruto: se a página chegou inteira, não é necessário trocar o proxy, o layout mudou. Seletores adaptativos do Scrapling resolvem essa classe de falhas em poucos milissegundos por requisição — capture a impressão em um layout de trabalho, ative adaptive=True em produção e registre os momentos de ativação como um sinal de redesign. E mantenha o geo estável: metade dos “redesigns repentinos” na prática acaba sendo outra versão linguística da página, que chegou devido à mudança do país de saída.
Se um geo estável e uma sessão previsível são exatamente o que seu parser precisa, veja proxies residenciais da ProxyCove: escolha de país, sessões sticky e pagamento pelo tráfego realmente utilizado.
