Hoy vamos a aprender a usar proxies con HTTPX. Un proxy se encuentra entre el raspador y el sitio que intentas raspar. El raspador hace una solicitud al servidor proxy para el sitio de destino. Luego, el proxy busca el sitio de destino y lo devuelve a tu raspador.
Cómo usar proxies no autenticados
En resumen, todas nuestras solicitudes van a una proxy_url
. A continuación se muestra un ejemplo en que se utiliza un proxy no autenticado. Es decir, no utilizamos nombre de usuario ni contraseña. Este ejemplo se inspiró en su documentación.
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)
Cómo usar proxies autenticados
Cuando un proxy requiere un nombre de usuario y una contraseña, se denomina proxy «autenticado». Estas credenciales se utilizan para autenticar tu cuenta y proporcionarte una conexión con el proxy.
Con la autenticación, nuestra proxy_url
tiene este aspecto: http://<username>:<password>@<proxy_url>:<port_number>
. En el ejemplo siguiente, utilizamos nuestra zona
y nombre de usuario
para crear la parte de usuario de la cadena de autenticación.
Usamos proxies de centro de datos para nuestra conexión 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)
El código anterior es bastante sencillo. Es la base de cualquier tipo de proxy que quieras configurar.
- Primero, creamos nuestras variables de configuración:
nombre de usuario
,zona
ycontraseña
. - Los utilizamos para crear nuestra
proxy_url
:f"http://brd-customer-{username}-zone-{zone}:{password}@brd.superproxy.io:33335"
. - Hacemos una solicitud a la API para obtener información general sobre nuestra conexión proxy.
Tu respuesta debe ser similar a la siguiente.
{"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"}}
Cómo utilizar proxies rotativos
Cuando utilizamos proxies rotativos, creamos una lista de proxies y elegimos uno entre ellos de forma aleatoria. En el siguiente código, creamos una lista de países
. Cuando hacemos una solicitud, usamos random.choice()
para usar un país aleatorio de la lista. Nuestra proxy_url
se formatea para adaptarse al país.
El siguiente ejemplo crea una pequeña 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 ejemplo no es muy diferente del primero. Estas son las principales diferencias.
- Creamos una serie de países:
[«us», «gb», «au» y «ca»]
. - En vez de hacer una sola solicitud, hacemos varias. Cada vez que creamos una nueva solicitud, utilizamos
random.choice(countries)
para elegir un país aleatorio cada vez que creamos nuestraproxy_url
.
Cómo crear una conexión proxy alternativa
En los ejemplos anteriores, solo hemos usado proxies gratuitos y de centros de datos. Los proxies gratuitos no son muy fiables. Los proxies de los centros de datos tienden a bloquearse en sitios web más difíciles.
En este ejemplo, creamos una función llamada safe_get()
. Cuando llamamos a esta función, primero intentamos obtener la url utilizando una conexión de centro de datos. Cuando falla, recurrimos a nuestra conexión 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 ejemplo es un poco más complicado que los otros que hemos tratado en este artículo.
- Ahora tenemos dos conjuntos de variables de configuración, uno para nuestra conexión de centro de datos y otro para nuestra conexión residencial.
- Esta vez, utilizamos una sesión
AsyncClient()
para presentar algunas de las funciones más avanzadas de HTTPX. - Primero, intentamos hacer nuestra solicitud con el
datacenter_proxy
. - Si no obtenemos una respuesta adecuada, volvemos a intentar realizar la solicitud con nuestro
residential_proxy
. Ten en cuenta también el indicadorverify
en el código. Al utilizar nuestros proxies residenciales, debes descargar y usar nuestro certificado SSL. - Una vez que obtengamos una respuesta firme, escribimos la página en un archivo HTML. Podemos abrir esta página en nuestro navegador y ver a qué accedió el proxy y qué nos envió.
Si pruebas con el código anterior, la salida y el archivo HTML resultante tendrán un aspecto muy parecido al siguiente.
trying with datacenter
response failed
trying with residential
response successful
Cómo ayudan los productos de Bright Data
Como probablemente hayas advertido a lo largo de este artículo, nuestros proxies de centros de datos son muy asequibles y nuestros proxies residenciales proporcionan una excelente alternativa cuando los proxies de centros de datos no funcionan. También proporcionamos otras herramientas para ayudarte con tus necesidades de recopilación de datos.
- Web Unlocker: supera incluso los antibots más difíciles. Web Unlocker identifica y resuelve automáticamente cualquier CAPTCHA de la página. Una vez que supera los antibots, te devuelve la página web.
- Scraping Browser: este producto tiene aún más funciones. En efecto, Scraping Browser permite controlar un navegador remoto con integración proxy y un solucionador de CAPTCHA automatizado.
- API de Web Scraper: con estas API, hacemos el raspado por ti. Solo tienes que llamar a la API y analizar los datos JSON que recibes en la respuesta.
- Conjuntos de datos: explora nuestro mercado de conjuntos de datos para encontrar cientos de conjuntos de datos recopilados previamente o solicita/crea uno personalizado. Puedes elegir una frecuencia de actualización y filtrar solo los puntos de datos que necesites.
Conclusión
Al combinar HTTPX con nuestros proxies, obtienes una forma privada, eficiente y fiable de navegar por Internet. Si quieres rotar proxies, es tan fácil como usar la biblioteca random
incorporada de Python. Mediante una combinación de centros de datos y proxies residenciales, puedes crear una conexión redundante que supere la mayoría de los sistemas de bloqueo.
Como ya has aprendido, Bright Data ofrece el paquete completo para tus proyectos de raspado web. ¡Comienza tu prueba gratuita con los proxies de Bright Data hoy mismo!
No se requiere tarjeta de crédito