Cómo usar proxies con HTTPX

Aprende a configurar proxies HTTPX con ejemplos de proxies no autenticados, autenticados, rotativos y alternativos.
7 min read
How To Use Proxies With HTTPX blog image

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 y contraseñ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 nuestra proxy_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 indicador verify 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
Captura de pantalla de la página principal de Amazon

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