Socks5Proxy

Configuração de proxy no Python requests: conexão SOCKS5 e HTTP

Este guia passo a passo ensina a conectar proxies HTTP e SOCKS5 da Socks5Proxy na biblioteca Python requests, com autenticação, rotação de lista e código de retentativas.

O que preciso preparar?

Requer Python 3.8+ e a biblioteca requests. Para SOCKS5, instale requests[socks] para incluir PySocks e suportar socks5/socks5h.

As informações do proxy estão disponíveis na tela Meus Proxies no dashboard. Neste exemplo, usamos IP 198.51.100.23, porta HTTP 8000, porta SOCKS5 1080, usuário spx_user e senha spx_pass. Substitua pelos seus valores reais.

pip install "requests[socks]"

Como conectar a um proxy HTTP?

requests envia requisições pelo proxy definido no dicionário proxies. É crucial incluir o mesmo endereço de proxy HTTP nas chaves http e https. Sem a chave https, requisições HTTPS ignoram o proxy.

Solicitações para sites HTTPS passam pelo proxy usando o método CONNECT, mantendo o conteúdo criptografado durante todo o trajeto. O código abaixo faz uma solicitação para um endereço de verificação de IP e confirma se o IP do proxy aparece na resposta.

import requests

proxy = "http://spx_user:spx_pass@198.51.100.23:8000"
proxies = {"http": proxy, "https": proxy}

r = requests.get("https://api.ipify.org?format=json", proxies=proxies, timeout=20)
print(r.status_code, r.json())  # the "ip" field should show the proxy IP

Como conectar um proxy SOCKS5?

Recomendamos usar socks5h no início do endereço. O socks5h faz a resolução de nomes no proxy, evitando que suas consultas DNS sejam expostas e garantindo que os nomes sejam resolvidos com base no país do proxy. Se usar apenas socks5, a resolução será feita no seu servidor antes de enviar o IP para o proxy.

Você deve usar a porta SOCKS5. Se colocar um endereço SOCKS5 na porta HTTP, a conexão não será estabelecida, então distinga as duas portas em cada linha.

import requests

proxy = "socks5h://spx_user:spx_pass@198.51.100.23:1080"
proxies = {"http": proxy, "https": proxy}

r = requests.get("https://api.ipify.org?format=json", proxies=proxies, timeout=20)
print(r.json())

Como rotacionar entre vários proxies?

Para coletar muitas páginas, o padrão é baixar uma lista de proxies e rotacioná-los a cada requisição. O código abaixo obtém uma lista SOCKS5 via API, usa os proxies em sequência e tenta novamente até 3 vezes com outro proxy em caso de falha. Também inclui pausas breves para evitar solicitações muito rápidas ao mesmo domínio.

Em vez de descartar proxies com falha, pause-os temporariamente. Muitos erros são causados por instabilidades no site alvo.

import itertools
import time
import requests

API = "https://socks5proxy.io/api/v1"
KEY = "YOUR_API_KEY"

lines = requests.get(
    API + "/proxies/download",
    params={"format": "user:pass@ip:port", "protocol": "socks5"},
    headers={"Authorization": "Bearer " + KEY},
    timeout=30,
).text.split()
pool = itertools.cycle(lines)

def fetch(url, tries=3):
    for _ in range(tries):
        p = "socks5h://" + next(pool)
        try:
            r = requests.get(url, proxies={"http": p, "https": p}, timeout=20)
            if r.status_code == 200:
                return r.text
        except requests.RequestException:
            pass
        time.sleep(1)
    return None

for page in range(1, 6):
    html = fetch("https://example.com/list?page=" + str(page))
    print(page, "ok" if html else "failed")
    time.sleep(0.5)

Como manter sessões e cookies?

Para fluxos que exigem continuidade de cookies, como login ou navegação entre páginas, use uma única instância de requests.Session com um proxy fixo. Definir o endereço na propriedade proxies do objeto de sessão garante que todas as solicitações dessa sessão saiam pelo mesmo IP. Quando o fluxo terminar, feche a sessão e crie uma nova com o próximo proxy.

Definir User-Agent e Accept-Language consistentes por sessão garante visualização uniforme nos sites alvo.

import requests

s = requests.Session()
s.proxies = {
    "http": "http://spx_user:spx_pass@198.51.100.23:8000",
    "https": "http://spx_user:spx_pass@198.51.100.23:8000",
}
s.headers.update({"User-Agent": "Mozilla/5.0", "Accept-Language": "en-US,en;q=0.9"})

s.get("https://example.com/", timeout=20)          # cookies are stored in the session
r = s.get("https://example.com/account", timeout=20)  # same IP, same cookies
print(r.status_code)
s.close()

Como usar autorização por IP?

Registre o IPv4 do servidor no dashboard para usar endereços sem credenciais. Isso facilita a implantação do mesmo código em vários servidores sem armazenar senhas. Baixe listas no formato ip:port.

import requests

proxy = "http://198.51.100.23:8000"  # no user or password, server IP is authorized in the dashboard
r = requests.get("https://api.ipify.org", proxies={"http": proxy, "https": proxy}, timeout=20)
print(r.text)

Como enviar múltiplas requisições simultaneamente?

requests é síncrono - para coletar muitas páginas rapidamente, execute tarefas concorrentemente com ThreadPoolExecutor do concurrent.futures. Mantenha o número de tarefas abaixo do número de proxies para evitar sobrecarga.

O código abaixo divide a lista de endereços em 20 workers e, para cada tarefa, seleciona o próximo proxy da lista para usar. itertools.cycle pode ser usado por várias threads sem problemas para obter o próximo valor, mas se precisar de ordem exata, use um bloqueio.

import itertools
from concurrent.futures import ThreadPoolExecutor
import requests

lines = open("proxies.txt").read().split()  # user:pass@ip:port per line
pool = itertools.cycle(lines)

def get(url):
    p = "http://" + next(pool)
    try:
        return url, requests.get(url, proxies={"http": p, "https": p}, timeout=20).status_code
    except requests.RequestException as e:
        return url, type(e).__name__

urls = ["https://example.com/item/" + str(i) for i in range(200)]
with ThreadPoolExecutor(max_workers=20) as ex:
    for url, result in ex.map(get, urls):
        print(url, result)

Posso usar bibliotecas assíncronas como httpx ou aiohttp?

Sim. httpx aceita endereços de proxy no parâmetro proxy ao criar o cliente. Para SOCKS5, instale httpx[socks] para usar endereços socks5. O cliente assíncrono AsyncClient aceita os mesmos parâmetros.

No aiohttp, passe o endereço HTTP no parâmetro proxy e credenciais via aiohttp.BasicAuth(proxy_auth). Para SOCKS5, use o conector do pacote aiohttp-socks (não suportado nativamente).

Métodos assíncronos podem processar milhares de requisições com poucos recursos, mas sem limitar requisições simultâneas, você pode sobrecarregar o site alvo e os proxies. Use asyncio.Semaphore para definir um limite de requisições concorrentes.

import httpx

with httpx.Client(proxy="http://spx_user:spx_pass@198.51.100.23:8000", timeout=20) as client:
    print(client.get("https://api.ipify.org").text)

Como resolver erros frequentes?

O erro 'Missing dependencies for SOCKS support' significa que requests[socks] não está instalado. Por favor, reinstale no mesmo ambiente virtual.

407 Proxy Authentication Required ocorre quando o nome de usuário ou senha está incorreto, ou quando a autorização por IP está ativada mas o IP do servidor não está registrado. Se a senha contém caracteres especiais, use urllib.parse.quote para codificá-la.

Timeouts geralmente indicam porta incorreta - use porta HTTP para endereços HTTP e porta SOCKS5 para socks5h. Definir um timeout evita que requisições travem todo o processo.

  • Erro SOCKS: pip install "requests[socks]"
  • 407: Verifique nome de usuário/senha ou IPs registrados
  • Tempo limite: distinção entre portas HTTP e SOCKS5
  • Adicionar timeout a todas as solicitações
Configuração de proxy no Python requests: conexão SOCKS5/HTTP | Socks5Proxy