Como rotacionar proxies em Python: guia com código

Publicado:

3 min de leitura

Acar Diveroli
Autor: Acar Diveroli
Rotacionar proxies em Python

Quem dispara muitas requisições a partir do Python não vai longe com um único endereço. Este artigo mostra como alternar uma lista de proxies dentro do código.

Um proxy esconde o seu endereço, mas se ele manda todas as requisições seguidas pelo mesmo IP, o limite de requisições do site de destino entra em ação. Esse é o problema de fundo: não é o endereço que é detectado, é o padrão. Se você não usa um Proxies rotativos e sim a sua própria lista de endereços fixos, quem faz a troca é o seu código.

O que é rotação de IP

Rotacionar o IP significa mudar continuamente o endereço das requisições de saída: depois de cada requisição, em intervalos fixos ou quando você decidir. Em vez de mandar tudo pelo mesmo IP, você distribui entre vários.

Com os Proxies residenciais isso já acontece dentro do próprio serviço. Quem tem a sua lista e não quer pagar por volume monta a rotação por conta própria: é disso que trata este artigo.

Passo 1: requisitos

  • Python 3
  • o ambiente de desenvolvimento que você preferir
  • a biblioteca Requests como cliente HTTP:
bash
pip3 install requests

Passo 2: obtenha os proxies

Você precisa de uma lista de endereços. No painel da Proxynet, escolha a localização adequada ao site de destino e decida entre Proxies IPv4 e Proxies IPv6.

Passo 3: uma requisição sem proxy

Como referência, primeiro uma requisição pela sua própria conexão:

python
# pip3 install requests
import requests

# send a request to the test endpoint
response = requests.get("https://httpbin.io/ip")

if response.status_code != 200:
    print(f"The request failed with {response.status_code}")
else:
    print(response.text)

A saída mostra o seu próprio endereço. Anote-o: é a referência para o passo seguinte.

Passo 4: a mesma requisição por um proxy

O Requests recebe os proxies como um dicionário, com uma entrada para HTTP e outra para HTTPS:

python
# pip3 install requests
import requests

# specify the proxy server address
proxies = {
    "http": "http://proxy.proxynet.io:60001",
    "https": "http://proxy.proxynet.io:60001",
}

response = requests.get(
    "https://httpbin.io/ip",
    proxies=proxies,
)

if response.status_code != 200:
    print(f"The request failed with {response.status_code}")
else:
    print(response.text)

Se agora a saída mostrar um endereço diferente do anterior, a requisição está saindo pelo proxy.

Passo 5: rotacionar a lista

Guarde seus proxies, um por linha, em um arquivo como proxies_list.txt:

proxy.proxynet.io:60001
proxy.proxynet.io:60002

Para alternar há dois caminhos.

Em ordem

Ir em ordem distribui a carga por igual, o que ajuda com uma lista pequena para que nenhum endereço carregue todo o trabalho. O porém: a sequência é regular, e um servidor atento reconhece justamente aí um padrão.

python
# pip3 install requests
import requests
from itertools import cycle

# read the proxies from the proxy list file
proxies_list = open("proxies_list.txt", "r").read().strip().split("\n")

# create a proxy generator
proxy_pool = cycle(proxies_list)

for _ in range(4):
    proxy = next(proxy_pool)

    proxies = {
        "http": f"http://{proxy}",
        "https": f"http://{proxy}",
    }

    response = requests.get(
        "https://httpbin.io/ip",
        proxies=proxies,
    )

    if response.status_code != 200:
        print(f"The request failed with {response.status_code}")
    else:
        print(response.text)

Aleatoriamente

O acaso quebra o padrão. Em troca, um endereço pode ser sorteado mais vezes que os outros:

python
# pip3 install requests
import requests
import random

# read the proxies from the proxy list file
proxies_list = open("proxies_list.txt", "r").read().strip().split("\n")

for _ in range(4):
    random_proxy = random.choice(proxies_list)

    proxies = {
        "http": f"http://{random_proxy}",
        "https": f"http://{random_proxy}",
    }

    response = requests.get(
        "https://httpbin.io/ip",
        proxies=proxies,
    )

    if response.status_code != 200:
        print(f"The request failed with {response.status_code}")
    else:
        print(response.text)

Não mude só o IP

O endereço é apenas uma característica entre várias. Se o User-Agent for o mesmo em todas as requisições, a combinação entrega o bot mesmo com o IP mudando. Troque-o também a cada requisição — na mão ou com uma biblioteca como fake-useragent — e deixe entre as requisições uma pausa curta e irregular.

Conclusão

O Python se presta bem ao scraping, e a rotação sobre uma lista própria se monta com o Requests em poucas linhas. Se a lista ficar curta ou administrá-la virar um peso, um Proxies rotativos faz o mesmo trabalho do lado do serviço.