Usar um IP de proxy no Python Requests
Defina rotas de proxy explícitas por requisição no Requests, escolha o esquema correto do endpoint e trate timeouts e falhas de túnel HTTPS.
Com Requests disponível no projeto, passe um mapeamento de proxies para a chamada:
import requests
proxies = {
"http": "http://127.0.0.1:8080",
"https": "http://127.0.0.1:8080",
}
response = requests.get(
"https://example.com/",
proxies=proxies,
timeout=(5, 15),
)
response.raise_for_status()
print(response.status_code)
Troque o endpoint de loopback pelo seu proxy em execução ou por um candidato da lista de proxies HTTP que será testado com esta requisição. As chaves descrevem os esquemas de destino: http para URLs HTTP e https para URLs HTTPS. Os valores descrevem o listener do proxy. Eles podem ser endpoints diferentes se sua rede exigir rotas separadas.
Um valor de proxy com http:// sob a chave https é intencional. Requests pede um túnel CONNECT ao listener HTTP e depois estabelece TLS com o destino por ele, sujeito à política de destinos e portas do proxy. Mudar o valor para https:// solicita TLS com o próprio proxy; isso pode falhar se o listener esperar HTTP sem criptografia.
O que significam os dois números de timeout
timeout=(5, 15) define timeouts de conexão e leitura. Não impõe um prazo total de quinze segundos. Dados recebidos periodicamente, vários endereços e tentativas de conexão podem prolongar o tempo decorrido. Requests não fornece um timeout geral quando você omite essa configuração; escolha limites adequados à resposta e acrescente um prazo na aplicação se o trabalho exigir um orçamento total rígido.
Trate a falha na etapa em que ela ocorre
try:
response = requests.get(
"https://example.com/",
proxies=proxies,
timeout=(5, 15),
)
response.raise_for_status()
except requests.exceptions.ProxyError as error:
print("Proxy setup failed:", type(error).__name__)
except requests.exceptions.Timeout:
print("A configured timeout expired")
except requests.exceptions.HTTPError as error:
print("HTTP status:", error.response.status_code)
Um CONNECT rejeitado pode gerar ProxyError antes de existir uma resposta do destino. O ramo HTTPError vem após uma resposta recebida com status de erro; Timeout significa que um limite configurado expirou. Examine localmente as cadeias de exceções da conexão e remova endpoints com credenciais e URLs privadas antes de compartilhá-las.
Mantenha a verificação de certificados ativada. Se a rede autorizada usar uma CA privada ou interceptação gerenciada, forneça o material de confiança esperado em vez de desativar a verificação.
As entradas explícitas por requisição controlam as rotas fornecidas aqui, mas esquemas omitidos ainda podem sofrer influência da descoberta de proxies no ambiente. Ao mover a chamada para uma Session reutilizável, decida como variáveis de ambiente, padrões da Session e sobrescritas por requisição devem interagir; reutilização de conexão e política de roteamento são escolhas separadas.