BeautifulSoup e requests através de proxies móveis: guia passo a passo para iniciantes
Conteúdo: Introdução · Preparação · Conceitos básicos · Passo 1: Instalação do Python e bibliotecas · Passo 2: Teste rápido sem proxy · Passo 3: Solicitação através de um proxy móvel · Passo 4: Rotação de IP · Passo 5: Erros, timeouts e repetições · Passo 6: Tratamento de captcha · Verificação do resultado · Erros comuns · Funcionalidades adicionais · FAQ · Conclusão
Introdução
Neste guia passo a passo, você irá configurar um ambiente de trabalho em Python, fazer solicitações a páginas da web através de proxies móveis, extrair os dados necessários usando o BeautifulSoup e aprender a trabalhar de forma segura e estável com a rotação de IP. Usaremos a biblioteca requests para solicitações de rede e o BeautifulSoup para análise de HTML. O resultado será um parser minimamente viável que: envia solicitações HTTP através de um proxy móvel, substitui corretamente os cabeçalhos para dispositivos móveis, repete solicitações com backoff inteligente em caso de erros, alterna IP do lado do provedor de proxies móveis, trata bem uma captcha caso apareça e salva os dados em um formato conveniente.
Para quem é este guia: para iniciantes que estão começando a conhecer o web scraping; para profissionais de áreas correlatas (marketing, pesquisa, OSINT), que precisam de uma ferramenta simples e confiável; para desenvolvedores que precisam rapidamente construir um protótipo funcional e desenvolvê-lo posteriormente.
O que você precisa saber previamente: habilidades básicas em uso de computadores; entendimento do que é um arquivo, uma pasta e como iniciar um terminal; um mínimo de familiaridade com Python é um plus, mas não é essencial, pois seguimos passo a passo. Importante: você deve ter bases legais para processar páginas-alvo e obedecer às regras dos sites, incluindo robots.txt e termos de uso.
Quanto tempo é necessário: 2 a 4 horas, se você seguir tudo sequencialmente. A instalação do ambiente e o teste rápido levarão até 30 minutos. A conexão com o proxy móvel e a configuração da rotação demoram entre 40 minutos e 1,5 horas. A adição do tratamento de erros e captcha levará entre 30 e 60 minutos.
Dica: Salve o link para as seções Passo 4: Rotação de IP e Passo 5: Erros, timeouts e repetições. Esses blocos são frequentemente necessários para depuração e aumentar a estabilidade.
⚠️ Atenção: Todo o material é fornecido para aprendizado e prática de scraping legal. Não utilize técnicas para burlar restrições de acesso, não viole legislações e condições de uso de sites. Não discutimos VPNs e outras maneiras de contornar bloqueios.
Preparação
Ferramentas e acessos necessários: um computador com Windows, macOS ou Linux; acesso à internet; Python 3.11–3.13 instalado (recomenda-se a versão mais atual); instalador de pacotes pip; editor de texto (Visual Studio Code, PyCharm Community ou qualquer outro). Você também precisará de uma conta com um provedor de proxies móveis. Como exemplo, pode-se orientar pelas funcionalidades oferecidas por serviços como mobileproxy.space: um endpoint de proxy separado, autenticação por login e senha ou por IP, rotação configurável (por tempo ou via API), e estatísticas de requisições.
Requisitos do sistema: no mínimo 4 GB de RAM; 1-2 GB livres no disco para Python e bibliotecas; conexão de internet estável a partir de 10 Mbps; capacidade de instalação de programas. O nível de direitos de administrador é necessário apenas para a instalação do Python (no Windows).
O que baixar e instalar: o instalador do Python; um editor de código (por exemplo, VS Code); as bibliotecas requests, beautifulsoup4, lxml (para aumentar a velocidade de parsing de HTML).
Criação de backups (se aplicável): antes de modificar projetos existentes, crie uma cópia da pasta com o código. Se você está criando um projeto pela primeira vez, crie uma pasta de trabalho separada. Guarde o arquivo com os dados de acesso ao proxy fora do repositório e, se possível, use um arquivo .env e um gerenciador de segredos.
Dica: Crie uma pasta do projeto sem espaços e sem caracteres cirílicos no nome, como parser_mobile_proxy. Isso facilitará a execução dos scripts e evitará erros de caminhos.
Conceitos básicos
Termos-chave em linguagem simples: parsing ou web scraping é a coleta automática de dados publicamente disponíveis das páginas de um site. requests é uma biblioteca do Python para realizar solicitações HTTP. BeautifulSoup é uma biblioteca do Python para analisar HTML e extrair fragmentos de conteúdo por tags, classes e atributos. Proxy é um servidor intermediário que envia solicitações ao site em seu nome. Proxy móvel é um proxy que utiliza endereços IP de operadoras móveis. Rotação de IP é a mudança do IP de saída com certa periodicidade ou sob demanda.
Princípios básicos de funcionamento: você forma uma solicitação HTTP para o site; sua solicitação passa por um proxy móvel; o site vê o endereço do proxy, e não o seu. Você recebe a página HTML e a analisa usando o BeautifulSoup.
O que é importante entender antes de começar: respeite o robots.txt e as condições do site; não sobrecarregue o servidor com solicitações frequentes; use timeouts; envie um número razoável de solicitações paralelas; trate códigos de resposta 4xx e 5xx. O proxy móvel ajuda a reduzir a probabilidade de triggers de fraude e restrições, pois as faixas de endereços móveis são frequentemente utilizadas por usuários reais. A estabilidade depende da qualidade do provedor, da carga e da correção do seu código.
⚠️ Atenção: Não use scraping para burlar autenticações ou acessar áreas restritas sem autorização. Não tente interferir no funcionamento do site. Trabalhe apenas com dados abertos, para os quais você tem o direito de processá-los.
Passo 1: Instalação do Python e bibliotecas
Objetivo da etapa
Instalar o Python e as bibliotecas necessárias, criar o projeto e arquivos básicos. Após esta etapa, você será capaz de executar scripts e realizar solicitações HTTP.
Instruções passo a passo
- Baixe e instale o Python do site oficial. Ao instalar no Windows, marque a opção Add Python to PATH. No macOS, você pode usar o gerenciador de pacotes brew ou o instalador oficial. No Linux, use os repositórios de sua distribuição.
- Verifique a instalação. Abra um terminal e execute o comando: python --version ou python3 --version. Verifique se a versão é de 3.11 a 3.13.
- Crie uma pasta para o projeto, por exemplo C:\Users\seu_usuario\parser_mobile_proxy ou /Users/seu_usuario/parser_mobile_proxy.
- Abra a pasta do projeto no editor de código. Crie o arquivo main.py e o arquivo requirements.txt.
- Adicione ao requirements.txt: requests==2.32.3; beautifulsoup4==4.12.3; lxml==5.2.2.
- Instale as dependências com o comando pip install -r requirements.txt ou pip3 install -r requirements.txt.
- Verifique se as bibliotecas estão instaladas. No terminal, execute python -c "import requests, bs4, lxml; print('ok')". Deve retornar ok.
Pontos importantes
Importante: Instale bibliotecas em um ambiente virtual para evitar conflitos de versão. Você pode criar um ambiente com o comando python -m venv .venv e ativá-lo com source .venv/bin/activate (macOS, Linux) ou .venv\Scripts\activate (Windows), após o que, execute pip install -r requirements.txt.
Dica: Se você não tem direitos de administrador, utilize a instalação de usuário pip install --user -r requirements.txt ou trabalhe em um ambiente virtual.
Resultado esperado
Você poderá executar um script simples e importar os módulos necessários sem erros.
Possíveis problemas e soluções
- O comando python não é encontrado. Solução: use python3 ou verifique se o PATH está configurado corretamente. Instale novamente o Python incluindo a opção Add to PATH.
- Conflito de versões lxml. Solução: atualize o pip (python -m pip install --upgrade pip), e depois instale lxml novamente.
- Falta de permissões ao instalar. Solução: ative o ambiente virtual ou use a flag --user.
✅ Verificação: O comando python -c "import requests, bs4; print('ready')" imprime ready, e o arquivo main.py existe na pasta do projeto.
Passo 2: Teste rápido de scraping sem proxy
Objetivo da etapa
Entender que a combinação básica requests + BeautifulSoup está funcionando, antes de conectar o proxy. Faremos uma solicitação simples a uma página de teste e extrairemos o título.
Instruções passo a passo
- Abra o arquivo main.py no editor.
- Insira o código básico para a solicitação e parsing.
- Execute o script e verifique a saída.
Código de exemplo
import requests; from bs4 import BeautifulSoup; session = requests.Session(); session.headers.update({"User-Agent": "Mozilla/5.0 (Linux; Android 13; Pixel 7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0 Mobile Safari/537.36"}); url = "https://example.com"; resp = session.get(url, timeout=30); html = resp.text; soup = BeautifulSoup(html, "lxml"); title = soup.title.text.strip() if soup.title else "(sem tag title)"; print("Status:", resp.status_code, "Título:", title)Pontos importantes
Importante: Estamos usando um User-Agent móvel para simular um navegador móvel. Isso ajudará a alinhar o comportamento com o proxy móvel na próxima etapa.
Dica: Se a página-alvo pode entregar versões diferentes para desktop e dispositivos móveis, salve o HTML em um arquivo para depuração: open("page.html", "w", encoding="utf-8").write(html). Assim você poderá estudar a estrutura das tags.
Resultado esperado
O script imprime o código de resposta e o título da página. Esta é uma verificação básica de que o parser vê o HTML e pode analisá-lo.
Possíveis problemas e soluções
- Código 403 ou 404. Solução: verifique a URL; tente mudar o User-Agent; confirme que o site está acessível.
- Timeout. Solução: aumente o timeout para 60, verifique a conexão com a internet.
- Codificação incorreta. Solução: use resp.encoding = resp.apparent_encoding antes do parsing.
✅ Verificação: Você vê o status 200 e a linha Título: (nome da página). O arquivo page.html pode aparecer na pasta, se você salvou o HTML.
Passo 3: Solicitação através de um proxy móvel
Objetivo da etapa
Conectar um proxy móvel ao requests, enviar a solicitação e garantir que o tráfego realmente passe pelo proxy e não diretamente. Também adicionaremos a autenticação e verificaremos os cabeçalhos.
O que preparar
Os dados do seu proxy móvel: host (por exemplo, proxy.provider.local ou endereço IP), porta (por exemplo, 12345), login e senha para autenticação, ou lista de IPs aprovados, se o provedor autenticar por endereço IP. A maioria dos provedores móveis, incluindo soluções do tipo mobileproxy.space, fornece essas informações no painel do cliente.
Instruções passo a passo
- Abra o arquivo main.py.
- Adicione um dicionário proxies com os dados do seu proxy.
- Envie a solicitação através de session.get com o parâmetro proxies.
- Verifique se a resposta chegou e faça o parsing da página.
Código de exemplo
import requests; from bs4 import BeautifulSoup; PROXY_HOST = "PROXY_HOST"; PROXY_PORT = 12345; PROXY_USER = "USER"; PROXY_PASS = "PASS"; proxy_auth = f"http://{PROXY_USER}:{PROXY_PASS}@{PROXY_HOST}:{PROXY_PORT}"; proxies = {"http": proxy_auth, "https": proxy_auth}; session = requests.Session(); session.headers.update({"User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 16_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.2 Mobile/15E148 Safari/604.1", "Accept-Language": "pt-BR,pt;q=0.9,en-US;q=0.8,en;q=0.7"}); url = "https://example.com"; resp = session.get(url, proxies=proxies, timeout=45); print("HTTP:", resp.status_code); soup = BeautifulSoup(resp.text, "lxml"); print("TÍTULO:", soup.title.text.strip() if soup.title else "(não disponível)")Pontos importantes
Importante: Se o seu provedor autentica por IP, use o formato proxies sem login e senha: "http": f"http://{PROXY_HOST}:{PROXY_PORT}". Certifique-se de que seu IP atual esteja na lista de permitidos no painel do provedor.
Dica: Na primeira execução, adicione o parâmetro verify=False apenas para diagnosticar erros de TLS. Não mantenha isso em produção. É melhor instalar os certificados raiz, se o provedor exigir.
Dica: Salve as configurações do proxy em um arquivo .env: PROXY_HOST, PROXY_PORT, PROXY_USER, PROXY_PASS. Carregue-os através de os.getenv ou da biblioteca python-dotenv para não armazenar segredos no código.
Resultado esperado
Você obtém o código 200 e um TÍTULO correto. Se a página alvo mostrar o IP, ele será diferente do seu, pois a solicitação pasa através do proxy móvel.
Possíveis problemas e soluções
- 407 Proxy Authentication Required. Solução: verifique o login e a senha; assegure-se de que está usando o formato de URL correto com autenticação.
- 403 Forbidden. Solução: altere o User-Agent para um móvel; verifique os cabeçalhos Accept-Language; reduza a frequência das solicitações.
- ConnectionError ou ReadTimeout. Solução: aumente o timeout, verifique a estabilidade do proxy com o provedor, repita a solicitação com backoff.
✅ Verificação: A resposta chega com status 200. O TÍTULO está correto. Se você estiver testando em uma página que mostra seu IP, ele corresponderá ao IP do proxy móvel (veja no painel do provedor).
Passo 4: Rotação de IPs de forma segura e previsível
Objetivo da etapa
Configurar a mudança de IP do proxy móvel por timer ou por comando de API. Isso aumenta a resistência do scraping e reduz as chances de ser restrito. Implementaremos duas maneiras: lista cíclica de endpoints de proxy e rotação dentro de um único endpoint via API ou timer do provedor.
Instruções passo a passo
- Defina a estratégia de rotação: por tempo (por exemplo, a cada 5-10 minutos), por número de requisições (por exemplo, a cada 10-20 requisições) ou híbrido.
- Se você tiver vários endpoints de proxy, prepare uma lista e implemente uma troca round-robin.
- Se o provedor tiver uma API para troca de IP para um único endpoint, adicione a chamada no código e aguarde a confirmação da janela de troca (geralmente 10-60 segundos).
- Considere as limitações do provedor: intervalo mínimo de rotação e limite de chamadas de API por dia.
- Inclua pausas e verificação de IP após a rotação para garantir que o novo IP está ativo.
Exemplo de round-robin em vários endpoints
import itertools, requests; from bs4 import BeautifulSoup; proxies_list = [ {"http": "http://user1:pass1@host1:10001", "https": "http://user1:pass1@host1:10001"}, {"http": "http://user2:pass2@host2:10002", "https": "http://user2:pass2@host2:10002"} ]; cycle = itertools.cycle(proxies_list); def fetch(url): s = requests.Session(); s.headers.update({"User-Agent": "Mozilla/5.0 (Linux; Android 14) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0 Mobile Safari/537.36"}); proxies = next(cycle); r = s.get(url, proxies=proxies, timeout=45); return r; r = fetch("https://example.com/catalog"); print(r.status_code)Exemplo de rotação dentro de um endpoint por API
muitos provedores de proxies móveis, incluindo ofertas da classe mobileproxy.space, permitem mudar o IP dentro do mesmo endpoint por um timer (por exemplo, a cada N minutos) ou a pedido na API. No código, isso aparece como uma solicitação adicional para um URL serviço do provedor. Abaixo, um modelo geral. Substitua a URL e o token pelas suas da conta do provedor. Considere os limites e janelas de rotação.
import time, requests; def rotate_ip(api_rotate_url, timeout=30): try: r = requests.get(api_rotate_url, timeout=timeout); return r.status_code, r.text; except Exception as e: return None, str(e); api_url = "http://PROXY_HOST:PORT/changeip?token=YOUR_TOKEN"; status, body = rotate_ip(api_url); print("ROTATE:", status, body); time.sleep(20); # aguarde a janela de rotação; s = requests.Session(); proxies = {"http": "http://USER:PASS@PROXY_HOST:PORT", "https": "http://USER:PASS@PROXY_HOST:PORT"}; resp = s.get("https://example.com", proxies=proxies, timeout=45); print(resp.status_code)Pontos importantes
Importante: A rotação não é uma solução mágica. Se você fizer muitas solicitações em um curto espaço de tempo, os gatilhos de proteção podem ser acionados mesmo ao mudar de IP. Mantenha uma frequência moderada, use atrasos aleatórios e repetições com backoff.
Dica: Planeje a rotação por hora e carga. Por exemplo, uma rotação a cada 10-20 minutos mais troca após 15-25 solicitações por domínio. Isso suaviza o comportamento e parece natural.
Dica: Salve os metadados da solicitação: qual proxy foi utilizado, qual IP foi usado, qual status o servidor retornou. Isso acelerará a depuração.
Resultado esperado
Seu código alterna proxy endpoints de forma estável ou inicia a troca de IP em um único endpoint e aguarda a janela de troca. Após a troca, as solicitações continuam a ser feitas com status 200.
Possíveis problemas e soluções
- O IP não muda após a chamada da API. Solução: aguarde mais, verifique os limites; assegure-se de que você está chamando a URL certa e que o token está ativo; confira as estatísticas no painel do provedor.
- O acesso cai no momento da rotação. Solução: enquanto a rotação está em andamento, troque para outro endpoint, use uma canal reserva no round-robin.
- Frequentes 429 Too Many Requests. Solução: aumente o intervalo entre solicitações, reduza o número total de threads simultâneas.
✅ Verificação: Ao imprimir regularmente o IP atual nos logs, observe que o endereço muda de acordo com a estratégia de rotação e o status das solicitações permanece entre 200 e 299.
Passo 5: Tratamento de erros, timeouts e repetições
Objetivo da etapa
Fazer seu parser resistente a falhas de rede e erros temporários do servidor. Vamos adicionar timeouts, repetições com backoff exponencial, atraso aleatório e logging.
Instruções passo a passo
- Defina o número máximo de repetições (por exemplo, 3-5) e um atraso base (por exemplo, 1-2 segundos).
- Implemente o backoff: a cada falha, aumente a espera em 2 vezes, mais um pouco de ruído aleatório.
- Capture códigos 5xx e 429 como temporários; considere 4xx com cautela (403 muitas vezes é um bloqueio permanente).
- Adicione logs claros para entender o que está acontecendo em cada etapa.
- Encapsule a chamada de rede na função fetch_safely, que é facilmente reutilizável.
Código de exemplo
import time, random, requests; from bs4 import BeautifulSoup; def fetch_safely(url, session, proxies=None, max_retries=4, base_delay=1.5, timeout=45): attempt = 0; while attempt <= max_retries: try: r = session.get(url, proxies=proxies, timeout=timeout); if r.status_code in (200, 201): return r; elif r.status_code in (429, 500, 502, 503, 504): delay = base_delay * (2 ** attempt) + random.uniform(0.0, 0.7); time.sleep(delay); attempt += 1; continue; elif r.status_code == 403: return r; else: return r; except (requests.exceptions.ConnectTimeout, requests.exceptions.ReadTimeout, requests.exceptions.ConnectionError) as e: delay = base_delay * (2 ** attempt) + random.uniform(0.1, 0.9); time.sleep(delay); attempt += 1; continue; return NonePontos importantes
Importante: Estabeleça timeouts razoáveis: 30-60 segundos para canais instáveis, 10-20 segundos para redes rápidas. Não desative a verificação de SSL, a menos que seja absolutamente necessário.
Dica: Para logs, use o módulo logging. No início, adicione uma configuração mínima: logging.basicConfig(level=logging.INFO, format="%(asctime)s [%(levelname)s] %(message)s"). Isso é útil para diagnóstico.
Dica: Separe “falhas temporárias” e “falhas permanentes”. Para temporárias, tente novamente; para permanentes, registre e prossiga, para não entrar em loop.
Resultado esperado
O script continua rodando em caso de falhas temporárias e retorna uma resposta, ou vai para a próxima tarefa sem falhar.
Possíveis problemas e soluções
- As repetições não ajudam, sempre 429. Solução: reduza a frequência das solicitações, aumente os atrasos, amplie a janela entre rotações de IP.
- 403 constantes. Solução: verifique a política do site, revise os cabeçalhos, diminua a frequência e utilize APIs oficiais se necessário.
- ConexãoError frequentes. Solução: verifique seu provedor de proxies móveis; pode ser necessário um outro região ou outra porta.
✅ Verificação: Ao simular falhas, você vê nos logs repetições com atrasos crescentes. Após 1-2 tentativas, muitas solicitações são concluídas com sucesso.
Passo 6: Detecção e tratamento de captcha de forma legal
Objetivo da etapa
Aprender a reconhecer quando a página retornou uma captcha e reagir adequadamente: reduzir a carga, pausar temporariamente as solicitações, usar a rotação de IP corretamente. Não burlamos a proteção, mas agimos dentro dos limites do scraping ético.
Instruções passo a passo
- Definir sinais de captcha nos sites-alvo: presença de palavras-chave no HTML (captcha, g-recaptcha), formulários com campos incomuns, páginas de banimento.
- Adicione ao código uma verificação do conteúdo HTML antes de fazer o parsing da lógica principal.
- Se a captcha acionou, execute ações suaves: aumente a pausa; diminua a frequência no domínio; inicie a rotação de IP; tente repetir a solicitação.
- Se a captcha persistir, interrompa as tentativas automáticas e analise os termos de uso do site. Pode ser que os dados estejam acessíveis através de uma API oficial.
Código de exemplo
from bs4 import BeautifulSoup; import time, requests; def is_captcha(html): text = html.lower(); hints = ["captcha", "g-recaptcha", "hcaptcha", "distil", "cloudflare", "please verify", "are you a human"]; return any(h in text for h in hints); def get_with_captcha_handling(url, session, proxies, rotate_func=None): r = session.get(url, proxies=proxies, timeout=45); if r.status_code == 200 and not is_captcha(r.text): return r; time.sleep(10); if rotate_func: try: rotate_func(); time.sleep(20); except Exception: pass; r2 = session.get(url, proxies=proxies, timeout=60); return r2Pontos importantes
Importante: Se a captcha continuar aparecendo, diminua a intensidade do scraping, aguarde o próximo intervalo de rotação ou altere para outro endpoint. Respeite a ética e as regras do site.
Dica: Às vezes a captcha aparece apenas para algumas rotas. Diminua a frequência apenas para essas rotas, e não para todo o domínio. Isso mantém a velocidade geral.
⚠️ Atenção: Não discutimos métodos de contorno de captcha utilizando serviços de terceiros, scripts de bypass, emulação de navegador ou técnicas semelhantes. Trabalhe somente dentro dos limites permitidos, utilizando APIs oficiais quando disponíveis.
Resultado esperado
O script pode reagir suavemente à ocorrência de captcha: faz uma pausa, inicia a troca de IP (se disponível) e repete a solicitação. Isso diminui o número de recusas falsas e ajuda a manter a estabilidade.
Possíveis problemas e soluções
- Captcha em todas as solicitações. Solução: reduza drasticamente a frequência, use intervalos variados entre solicitações, mude o fuso horário ou a região do proxy com o provedor (se disponível), verifique o robots.txt.
- Captcha desaparece, mas os dados continuam instáveis. Solução: aumente o timeout, salve e analise o HTML, compare versões das páginas para diferentes IPs.
✅ Verificação: Ao acionar artificialmente (por exemplo, com solicitações frequentes em um curto período), os logs mostram pausas e rotação, e após isso – respostas exitosas sem captcha.
Verificação do resultado
Checklist
- Python instalado, dependências configuradas.
- Script sem proxy obtém HTML e analisa o título.
- Script com proxy móvel retorna status 200.
- Rotação de IP habilitada e testada.
- Repetições em caso de erro funcionam, timeouts estão configurados.
- Existem verificações para sinais de captcha.
- Dados são salvos em arquivo ou impressos no console conforme esperado.
Como testar
- Execute uma solicitação básica sem proxy e confirme que o parsing do título funciona.
- Ative o proxy e repita a solicitação, compare os resultados.
- Solicite a troca de IP ao provedor (se disponível) e repita a solicitação após 20-60 segundos.
- Artificialmente reduza o timeout para 1-2 segundos e verifique se as repetições com backoff são ativadas, retornando depois aos níveis normais.
- Carregue o site com várias solicitações consecutivas e confirme que, ao sinalizar a captcha, aplicam-se pausas e, se necessário, a rotação é acionada.
Indicadores de sucesso
- A proporção de solicitações bem-sucedidas é superior a 90% em sites "calmos".
- Códigos 429 e 5xx ocorrem raramente e são gerenciados por repetições.
- A rotação de IP acontece conforme planejado, sem longos períodos de inatividade.
Dica: Introduza métricas de "tempo de resposta" e "número de repetições" e registre-as. Isso vai ajudar a entender quando mudar a estratégia de rotação ou a frequência de solicitações.
Erros comuns e soluções
- Problema: 407 Proxy Authentication Required. Causa: login ou senha incorretos, URL do proxy mal formatado. Solução: verifique o formato http://USER:PASS@HOST:PORT, assegure-se de que não há caracteres ou espaços desnecessários; se a autenticação é por IP – remova login e senha.
- Problema: 403 Forbidden. Causa: a proteção do site foi acionada, User-Agent inadequado ou solicitações muito frequentes. Solução: utilize um User-Agent móvel, reduza a frequência, ative a rotação de IP, verifique Accept, Accept-Language e Referer.
- Problema: 429 Too Many Requests. Causa: limite de frequência excedido. Solução: adicione backoff exponencial, aumente pausas, reduza a frequência da rotação, distribua as solicitações ao longo do dia.
- Problema: ConnectionError ou ReadTimeout. Causa: canal de proxy instável ou rede sobrecarregada. Solução: aumente o timeout, repita com backoff, utilize um endpoint de reserva.
- Problema: parsing incorreto, dados vazios. Causa: a estrutura do HTML mudou ou o conteúdo está sendo carregado via JavaScript. Solução: atualize os seletores do BeautifulSoup; se os dados são gerados dinamicamente, estude as solicitações de rede da página e utilize seus endpoints JSON oficiais quando disponíveis e se permitido.
- Problema: captcha em todas as páginas. Causa: carga agressiva ou atividade suspeita. Solução: reduza a frequência, aumente as pausas, use rotação, verifique a conformidade com os cabeçalhos e com o robots.txt.
- Problema: bloqueio após várias solicitações bem-sucedidas. Causa: comportamento previsível do script. Solução: adicione delays aleatórios, varie a ordem das solicitações, alterne proxies, atualize cabeçalhos.
Dica: Salve exemplos de HTML antes e depois de um incidente. Isso ajudará a distinguir rapidamente entre uma mudança de layout e sinais de proteção anti-bot.
Funcionalidades adicionais
Configurações avançadas
- Sessões e cookies: use requests.Session para armazenamento automático de cookies, isso aproxima o comportamento ao de um navegador real.
- Cabeçalhos: adicione Accept, Accept-Language, Referer e DNT conforme necessário. Troque User-Agent de um pool de agentes móveis.
- Proxies SOCKS: se necessário, conecte requests[socks]. No entanto, proxies móveis são mais frequentemente fornecidos como HTTP(S).
- Salvar em CSV ou JSON: após o parsing, salve os dados em arquivos. Isso é conveniente para integrações.
Exemplo de mini-pipeline de scraping
import csv, requests, time; from bs4 import BeautifulSoup; MOBILE_UA = "Mozilla/5.0 (Linux; Android 14) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0 Mobile Safari/537.36"; session = requests.Session(); session.headers.update({"User-Agent": MOBILE_UA}); proxies = {"http": "http://USER:PASS@HOST:PORT", "https": "http://USER:PASS@HOST:PORT"}; urls = ["https://example.com/page1", "https://example.com/page2"]; rows = []; for u in urls: r = session.get(u, proxies=proxies, timeout=45); if r.status_code == 200: s = BeautifulSoup(r.text, "lxml"); title = s.title.text.strip() if s.title else ""; rows.append({"url": u, "title": title}); time.sleep(2); open("data.csv", "w", newline="", encoding="utf-8"); with open("data.csv", "w", newline="", encoding="utf-8") as f: w = csv.DictWriter(f, fieldnames=["url","title"]); w.writeheader(); w.writerows(rows); print("salvo:", len(rows))Otimização
- Processamento em lote: agrupando solicitações por domínio, considerando tempos de espera e rotação.
- Cache: salve as páginas que já foram obtidas localmente, para que não sejam solicitadas novamente sem necessidade.
- Estratégia de paciência: planeje os tempos das solicitações em horários de "menor movimento", quando o site está menos carregado.
Dica: Se você tiver muitas tarefas, divida-as em pequenos lotes e execute uma por vez. Isso melhora a estabilidade e diminui a chance de captcha.
Dica: Muitos provedores de proxies móveis (incluindo soluções da classe mobileproxy.space) possuem um painel de controle com estatísticas visuais. Verifique os tempos, frequências e códigos de resposta — isso fornece uma compreensão de quando é mais apropriado rotacionar.
FAQ
Pergunta: Como saber se a solicitação está realmente passando pelo proxy móvel? Resposta: Verifique no painel do provedor as conexões ativas e o IP externo atual, compare com o que você vê nas respostas da página. O provedor também geralmente mostra estatísticas de chamadas para o endpoint.
Pergunta: Como escolher um User-Agent: Android ou iOS? Resposta: Escolha a plataforma para a qual seu conteúdo está otimizado (versão móvel do site). Muitas vezes, o agente Android produz resultados mais previsíveis. Teste ambos e registre onde há menos falhas.
Pergunta: Com que frequência mudar de IP ao fazer scraping? Resposta: A recomendação básica é: não mais do que a cada 10-20 minutos, ou após 15-25 solicitações no domínio. Ajuste conforme a carga, sem exagerar na rotação frequente.
Pergunta: O que fazer se o site entrega conteúdo via JavaScript? Resposta: Estude as solicitações de rede da página (nas ferramentas de desenvolvedor do navegador). Frequentemente, os dados são obtidos através de endpoints JSON. Se o acesso for legal e não violar as condições, utilize esses endpoints. Caso contrário, verifique as regras do site.
Pergunta: É possível usar vários provedores móveis simultaneamente? Resposta: Sim, se necessário para distribuir a carga. Configure round-robin e monitore os limites de cada provedor.
Pergunta: Como armazenar credenciais de forma segura? Resposta: Use variáveis de ambiente e um arquivo .env, não comite segredos no repositório. Em produção, armazene segredos em gerenciadores de segredos.
Pergunta: Como parar o script em caso de erros em massa? Resposta: Introduza um contador de tentativas malsucedidas e um limite superior. Se N solicitações dentro do domínio falharem de seguida, faça uma pausa prolongada, registre o incidente e finalize o processo.
Pergunta: Preciso do lxml, se já há um parser html.parser integrado? Resposta: O parser integrado serve para casos simples. O lxml é mais rápido e tolerante a HTML parcialmente incorreto. Para scraping regular, recomenda-se o lxml.
Pergunta: O que fazer se o site mudar a estrutura? Resposta: Armazene páginas de teste, adicione verificações de regressão para seletores. Quando houver mudanças, atualize a lógica do BeautifulSoup e escreva funções adaptadoras para a nova estrutura.
Pergunta: Por que preciso de um proxy móvel se o comum também funciona? Resposta: Endereços móveis muitas vezes transmitem menos suspeitas devido à natureza das redes móveis e à distribuição do tráfego. Isso aumenta a chance de respostas estáveis sob carga razoável.
Conclusão
Resumo das ações realizadas: você instalou o Python e as bibliotecas requests e BeautifulSoup, verificou o parsing básico sem proxy, adicionou um proxy móvel e confirmou que as solicitações estão passando por ele, configurou a rotação de IP de várias maneiras, implementou tratamento de erros e uma resposta suave à captcha. Agora você tem um projeto de referência para um scraping público e ético de dados.
O que fazer a seguir: evolua o parser para seus objetivos — adicione novos seletores, salve dados em um banco, configure um agendamento para execuções. Ative alertas quando a proporção de solicitações bem-sucedidas cair ou quando houver aumento nos status 429 e 403. Adicione um arquivo de configuração para parâmetros de controle (frequência, rotação, timeouts).
Para onde evoluir: estude solicitações assíncronas em Python (aiohttp), filas de tarefas (Celery, RQ), armazenamento e análise de dados (SQLite, PostgreSQL, Pandas). Veja separadamente os aspectos legais do processamento de dados e a interação com sites, além do acesso oficial a dados através de APIs legais. Para proxies móveis, use funções semelhantes às que os modernos serviços da classe mobileproxy.space oferecem: rotação flexível, estatísticas, diferentes regiões e suporte estável.
Dica: Salve este guia e volte frequentemente às seções Passo 4: Rotação de IP e Passo 5: Erros, timeouts e repetições. Elas trazem o principal ganho de estabilidade e ajudam a evitar inatividade.
⚠️ Atenção: Sempre verifique o robots.txt e os termos de uso dos sites-alvo. Se as regras proíbem a coleta automatizada de dados, respeite os impedimentos e busque alternativas legais, como APIs abertas ou pagas.