Hoje, aprenderemos como usar proxies com HTTPX. Um proxy fica entre o scraper e o site que você está tentando copiar. Seu scraper faz uma solicitação ao servidor proxy do 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 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 em sua documentação.
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 exige 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 a autenticação, nosso proxy_url
fica assim: http://<username>:<password>@<proxy_url>:<port_number>
. No exemplo abaixo, usamos zone
e username
para criar a parte do usuário da string de autenticação.
Estamos usando proxies de datacenter para nossa conexão básica.
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. Essa é a base para qualquer tipo de proxy que você queira configurar.
- Primeiro, criamos nossas variáveis de configuração:
username
,zone
epassword
(nome de usuário, zona e senha). - Nós os usamos para criar nosso
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 proxy.
Sua resposta deve ter um formato parecido com este:
{"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 os escolhemos aleatoriamente. No código abaixo, criamos uma lista de países
. Quando fazemos uma solicitação, usamos random.choice()
para usar um país aleatório da lista. Nosso proxy_url
é formatado 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)
Esse exemplo realmente não é muito diferente do primeiro. Aqui estão as principais diferenças.
- Criamos uma matriz de países:
["us", "gb", "au", "ca"]
. - Em vez de fazer uma única solicitação, fazemos várias. Sempre que criamos uma nova solicitação, usamos
random.choice(countries)
para escolher um país aleatório toda vez que criamos nossoproxy_url
.
Como criar uma conexão de proxy alternativa
Nos exemplos acima, usamos somente datacenter e proxies gratuitos. Proxies gratuitos não são muito confiáveis. Os 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 o URL usando uma conexão de datacenter. Quando isso falha, mudamos para 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())
Esse exemplo é um pouco mais complicado do que os outros que abordamos 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 apresentar algumas das funcionalidades mais avançadas do HTTPX. - Primeiro, tentamos fazer nossa solicitação com o
datacenter_proxy
. - Se não obtivermos uma resposta adequada, tentaremos novamente a solicitação usando nosso
residential_proxy
. Observe também o sinalizadorverify
no código. Ao usar nossos proxies residenciais, você precisa baixar e usar nosso certificado SSL. - Assim que obtivermos uma resposta sólida, gravamos a página em um arquivo HTML. Podemos abrir esta página em nosso navegador e ver o que o proxy realmente acessou e enviou de volta para nós.
Se você tentar o código acima, sua saída e o arquivo HTML resultante devem ser muito parecidos com este.
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 nossos proxies residenciais oferecem uma excelente alternativa 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é mesmo os anti-bots mais difíceis. O Web Unlocker reconhece e resolve automaticamente todos os CAPTCHAs na página. Depois de passar pelos anti-bots, ele envia você de volta à página da web.
- Scraping Browser: este produto tem ainda mais recursos. Na verdade, o Scraping Browser permite que você controle um navegador remoto com integração de proxy e um solucionador CAPTCHA automatizado.
- APIs do Web Scraper: com essas APIs, fazemos a coleta para você. Tudo o que você precisa fazer é chamar a API e analisar os dados JSON que recebe na resposta.
- Conjuntos de dados: explore nosso mercado de conjuntos de dados para encontrar centenas de conjuntos de dados pré-coletados ou solicitar/criar um personalizado. Você pode escolher uma taxa de atualização e filtrar somente os pontos de dados necessários.
Conclusão
Quando você combina HTTPX com nossos proxies, você obtém uma maneira privada, eficiente e confiável de navegar na web. Se você quiser rotacionar proxies, é tão simples quanto usar a biblioteca integrada random
do Python. Com uma combinação de datacenter e proxies residenciais, você pode criar uma conexão redundante que ultrapassa a maioria dos sistemas de bloqueio.
Como você aprendeu, a Bright Data oferece o pacote completo para seus projetos de web scraping. Comece seu teste gratuito com os proxies da Bright Data hoje mesmo!
Não é necessário cartão de crédito