Guia Python · 2 min de leitura

Web scraping com Python requests e proxies

Um fluxo de trabalho prático de scraping construído em requests e BeautifulSoup, roteado através de um proxy autenticado para que seu IP de origem permaneça oculto e seu crawler sobreviva a limites de taxa. Código executável completo incluído.

Um scraper é uma sessão, não um loop de requisições.

A diferença entre um scraper que funciona por dez minutos e um que roda por horas quase nunca é a análise — é como você faz as requisições. Um for url in urls: requests.get(url) abre uma nova conexão TCP toda vez, não envia cabeçalhos realistas, não mantém cookies e ataca o alvo de um IP até receber um 429 ou um bloqueio.

A solução é uma requests.Session mais um proxy. Uma sessão agrupa conexões e persiste cookies, então um fluxo de páginas é mais rápido e parece um único cliente coerente. Um proxy autenticado substitui seu endereço real por uma saída de datacenter, então o site nunca vê seu IP de origem e um único endereço bloqueado não encerra todo o trabalho. Proxies s4m falam SOCKS5 na porta 1080 e HTTP na porta 3128, ambos autenticados com USER:PASS — use socks5h:// para que o DNS seja resolvido remotamente e os nomes de host nunca vazem. Para experimentos descartáveis, a lista de proxies públicos gratuitos é um pool separado, use por sua conta e risco.

Um scraper de solicitações resiliente

Sessão, cabeçalhos realistas, tentativas com retrocesso, rotação de proxy e análise com BeautifulSoup em um arquivo. Substitua USER:PASS por suas credenciais.

python
import random
import time
import requests
from bs4 import BeautifulSoup
from requests.exceptions import RequestException

USER, PASS, HOST = "USER", "PASS", "proxy.s4m.online"
POOL = [
    f"socks5h://{USER}:{PASS}@{HOST}:1080",  # needs requests[socks]
    f"http://{USER}:{PASS}@{HOST}:3128",
]

HEADERS = {
    "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36",
    "Accept-Language": "en-US,en;q=0.9",
}

def make_session(proxy):
    s = requests.Session()
    s.headers.update(HEADERS)
    s.proxies = {"http": proxy, "https": proxy}
    return s

def fetch(url, retries=4):
    for attempt in range(1, retries + 1):
        proxy = random.choice(POOL)
        try:
            s = make_session(proxy)
            r = s.get(url, timeout=(5, 20))
            if r.status_code == 429:
                raise RequestException("rate limited")
            r.raise_for_status()
            return r
        except RequestException as e:
            wait = 2 ** attempt + random.random()  # exponential backoff
            print(f"[{attempt}/{retries}] {proxy} -> {e}; sleeping {wait:.1f}s")
            time.sleep(wait)
    raise SystemExit(f"giving up on {url}")

html = fetch("https://quotes.toscrape.com/").text
soup = BeautifulSoup(html, "html.parser")
for q in soup.select(".quote"):
    text = q.select_one(".text").get_text(strip=True)
    who = q.select_one(".author").get_text(strip=True)
    print(f"{who}: {text}")

O que mantém um crawler vivo

Quatro hábitos que importam mais do que o parser que você escolhe.

Envie um User-Agent real

O UA padrão do python-requests é uma bandeira instantânea. Defina um User-Agent de navegador normal e um cabeçalho Accept-Language para que as solicitações se misturem ao tráfego comum.

Afaste-se, não tente novamente cegamente

Em um 429 ou um timeout, durma com backoff exponencial e jitter antes de tentar novamente. Laços de tentativa apertados apenas aprofundam o bloqueio e queimam o tráfego do proxy.

Gire a saída, não apenas a nova tentativa

Escolha um proxy novo de um pool a cada tentativa para que um IP sinalizado não pare o trabalho. Proxies de datacenter medidos tornam isso barato para escalar.

Respeite o alvo

Leia robots.txt, limite a concorrência e colete apenas o que você tem permissão. Um crawler educado também é mais difícil de bloquear.

De um script para um pipeline real

Uma vez que o loop de busca esteja sólido, o resto é orquestração. Mantenha um pequeno conjunto de URLs proxy e rotacione por solicitação; quando um alvo se torna agressivo, aumente o conjunto em vez da contagem de tentativas. Persista os resultados à medida que avança para que uma falha no meio da execução nunca custe todo o rastreamento, e adicione um atraso educado entre as páginas para que você permaneça abaixo do limite de taxa em vez de lutar contra ele.

Quando você ultrapassa scripts ad-hoc, o mesmo endpoint proxy se encaixa diretamente no Scrapy ou em um cliente assíncrono — veja proxies rotativos em Python para um pool aiohttp. Tudo é construído com os mesmos blocos de construção s4m: proxies SOCKS5 e HTTP autenticados de datacenter, pagamento conforme o uso, com a API e ferramentas para verificar IPs de saída e portas. Se você só precisa verificar rapidamente um país ou protocolo, comece pela lista gratuita.

FAQ

Perguntas, respondidas

Preciso do PySocks para os exemplos de SOCKS5?

Sim. O suporte a SOCKS em requests vem do PySocks — instale-o com pip install "requests[socks]". O endpoint HTTP na porta 3128 funciona com uma instalação padrão de requests e sem dependências extras.

Como evito ser bloqueado enquanto faço scraping?

Envie um User-Agent realista, limite sua taxa de solicitações, recue em respostas 429 e gire IPs de saída através de um pool de proxies. Bloqueios geralmente estão relacionados ao comportamento e à reputação do IP, não ao parser que você usa.

Os proxies s4m são residenciais?

Não. s4m vende proxies SOCKS5 e HTTP autenticados de datacenter, pagos conforme o uso. A lista de proxies públicos gratuitos é de terceiros e use por sua conta e risco, útil apenas para testes rápidos.

Por que usar socks5h em vez de socks5?

socks5h pede ao proxy para resolver DNS, então os nomes de host que você coleta nunca vazam do seu computador. O socks5 simples resolve localmente primeiro, o que pode revelar seus alvos.

Proxies construídos para scraping

Direcione solicitações para proxy.s4m.online, rotacione através de saídas SOCKS5 e HTTP autenticadas do datacenter, e pague apenas pelo tráfego que você usa. Adicione um IP dedicado sempre que um alvo esperar um.

As pessoas encontraram esta página pesquisando por

Frases de busca reais que esta página responde — os links abrem a página que as cobre em profundidade.