Hoje, vamos aprender como usar proxies com HTTPX. Um proxy fica entre seu scraper e o site que você está tentando raspar. Seu scraper faz uma solicitação ao servidor proxy para o site de destino. O proxy então busca o site de destino e o retorna ao seu scraper.
Como Usar Proxies Não Autenticados
Em resumo, todas as nossas solicitações vão para um proxy_url. Abaixo está um exemplo usando um proxy não autenticado. Isso significa que não estamos usando um nome de usuário ou senha. Este exemplo foi inspirado pela documentação deles.
import httpx
proxy_url = "http://localhost:8030"
with httpx.Client(proxy=proxy_url) as client:
ip_info = client.get("https://geo.brdtest.com/mygeo.json")
print(ip_info.text)
Como Usar Proxies Autenticados
Quando um proxy requer um nome de usuário e senha, ele é chamado de proxy “autenticado”. Essas credenciais são usadas para autenticar sua conta e fornecer uma conexão com o proxy.
Com autenticação, nosso proxy_url fica assim: http://<username>:<password>@<proxy_url>:<port_number>. No exemplo abaixo, usamos tanto nossa zone quanto nosso username para criar a parte do usuário da string de autenticação.
Estamos usando proxies de datacenter para nossa conexão base.
import httpx
username = "your-username"
zone = "your-zone-name"
password = "your-password"
proxy_url = f"http://brd-customer-{username}-zone-{zone}:{password}@brd.superproxy.io:33335"
ip_info = httpx.get("https://geo.brdtest.com/mygeo.json", proxy=proxy_url)
print(ip_info.text)
O código acima é bem simples. Esta é a base para qualquer tipo de proxy que você queira configurar.
- Primeiro, criamos nossas variáveis de configuração:
username,zoneepassword. - Usamos essas variáveis para criar nossa
proxy_url:f"http://brd-customer-{username}-zone-{zone}:{password}@brd.superproxy.io:33335". - Fazemos uma solicitação à API para obter informações gerais sobre nossa conexão de proxy.
Sua resposta deve se parecer com isto.
{"country":"US","asn":{"asnum":20473,"org_name":"AS-VULTR"},"geo":{"city":"","region":"","region_name":"","postal_code":"","latitude":37.751,"longitude":-97.822,"tz":"America/Chicago"}}
Como Usar Proxies Rotativos
Quando usamos proxies rotativos, criamos uma lista de proxies e escolhemos entre eles aleatoriamente. No código abaixo, criamos uma lista de countries. Quando fazemos uma solicitação, usamos random.choice() para usar um país aleatório da lista. Nossa proxy_url é formatada para se adequar ao país.
O exemplo abaixo cria uma pequena lista de proxies rotativos.
import httpx
import asyncio
import random
countries = ["us", "gb", "au", "ca"]
username = "your-username"
proxy_url = "brd.superproxy.io:33335"
datacenter_zone = "your-zone"
datacenter_pass = "your-password"
for random_proxy in countries:
print("----------connection info-------------")
datacenter_proxy = f"http://brd-customer-{username}-zone-{datacenter_zone}-country-{random.choice(countries)}:{datacenter_pass}@{proxy_url}"
ip_info = httpx.get("https://geo.brdtest.com/mygeo.json", proxy=datacenter_proxy)
print(ip_info.text)
Este exemplo realmente não é tão diferente do primeiro. Aqui estão as principais diferenças.
- Criamos um array de países:
["us", "gb", "au", "ca"]. - Em vez de fazer uma única solicitação, fazemos várias. Cada vez que criamos uma nova solicitação, usamos
random.choice(countries)para escolher um país aleatório cada vez que criamos nossaproxy_url.
Como Criar uma Conexão de Proxy de Fallback
Nos exemplos acima, usamos apenas proxies de datacenter e proxies gratuitos. Proxies gratuitos não são muito confiáveis. Proxies de datacenter tendem a ser bloqueados em sites mais difíceis.
Neste exemplo, criamos uma função chamada safe_get(). Quando chamamos essa função, primeiro tentamos obter a URL usando uma conexão de datacenter. Quando isso falha, nós recorremos à nossa conexão residencial.
import httpx
from bs4 import BeautifulSoup
import asyncio
country = "us"
username = "your-username"
proxy_url = "brd.superproxy.io:33335"
datacenter_zone = "datacenter_proxy1"
datacenter_pass = "datacenter-password"
residential_zone = "residential_proxy1"
residential_pass = "residential-password"
cert_path = "/home/path/to/brightdata_proxy_ca/New SSL certifcate - MUST BE USED WITH PORT 33335/BrightData SSL certificate (port 33335).crt"
datacenter_proxy = f"http://brd-customer-{username}-zone-{datacenter_zone}-country-{country}:{datacenter_pass}@{proxy_url}"
residential_proxy = f"http://brd-customer-{username}-zone-{residential_zone}-country-{country}:{residential_pass}@{proxy_url}"
async def safe_get(url: str):
async with httpx.AsyncClient(proxy=datacenter_proxy) as client:
print("trying with datacenter")
response = await client.get(url)
if response.status_code == 200:
soup = BeautifulSoup(response.text, "html.parser")
if not soup.select_one("form[action='/errors/validateCaptcha']"):
print("response successful")
return response
print("response failed")
async with httpx.AsyncClient(proxy=residential_proxy, verify=cert_path) as client:
print("trying with residential")
response = await client.get(url)
print("response successful")
return response
async def main():
url = "https://www.amazon.com"
response = await safe_get(url)
with open("out.html", "w") as file:
file.write(response.text)
asyncio.run(main())
Este exemplo é um pouco mais complicado do que os outros que tratamos neste artigo.
- Agora temos dois conjuntos de variáveis de configuração, um para nossa conexão de datacenter e outro para nossa conexão residencial.
- Desta vez, usamos uma sessão
AsyncClient()para introduzir algumas das funcionalidades mais avançadas do HTTPX. - Primeiro, tentamos fazer nossa solicitação com o
datacenter_proxy. - Se não conseguirmos obter uma resposta adequada, tentamos novamente a solicitação usando nosso
residential_proxy. Observe também a flagverifyno código. Ao usar nossos proxies residenciais, você precisa baixar e usar nosso certificado SSL. - Uma vez que obtivemos uma resposta sólida, escrevemos a página em um arquivo HTML. Podemos abrir essa página em nosso navegador e ver o que o proxy realmente acessou e nos enviou de volta.
Se você tentar o código acima, sua saída e o arquivo HTML resultante devem se parecer muito com isto.
trying with datacenter
response failed
trying with residential
response successful

Como os Produtos da Bright Data Ajudam
Como você provavelmente notou ao longo deste artigo, nossos proxies de datacenter são muito acessíveis e nossas proxies residenciais fornecem um excelente fallback para quando os proxies de datacenter não funcionam. Também fornecemos várias outras ferramentas para ajudar com suas necessidades de coleta de dados.
- Web Unlocker: Supere até os anti-bots mais difíceis. O Web Unlocker reconhece e resolve automaticamente quaisquer CAPTCHAs na página. Uma vez que passa pelos anti-bots, ele envia de volta a página da web.
- Scraping Browser: Este produto tem ainda mais recursos. O Scraping Browser realmente permite que você controle um navegador remoto com integração de proxy e um solucionador automático de CAPTCHA.
- APIs de Web Scraper: Com essas APIs, fazemos o scraping para você. Tudo o que você precisa fazer é chamar a API e analisar os dados JSON que você recebe na resposta.
- Conjuntos de dados: Explore nosso marketplace de conjuntos de dados para encontrar centenas de conjuntos de dados pré-coletados, ou solicite/crie um personalizado. Você pode escolher uma taxa de atualização e filtrar apenas os pontos de dados de que precisa.
Conclusão
Quando você combina HTTPX com nossos proxies, você obtém uma maneira privada, eficiente e confiável de raspar a web. Se você quiser rotacionar proxies, é tão simples quanto usar a biblioteca random integrada do Python. Com uma combinação de proxies de datacenter e residenciais, você pode construir uma conexão redundante que supera a maioria dos sistemas de bloqueio.
Como você aprendeu, a Bright Data oferece o pacote completo para seus projetos de scraping de dados. Comece a usar os proxies da Bright Data hoje mesmo!