Servidores proxy de Go: configurar servidores proxy con Go Guide

En este artículo, aprenderás a configurar un servidor proxy para el raspado web en Go.
28 min read
Setting Proxy in GO

Todas las interacciones en Internet requieren el uso de una dirección IP. Los sitios web utilizan esta dirección IP para identificar al usuario o usuarios y determinar tu ubicación y otros metadatos, como tu proveedor de Internet (ISP), zona horaria o tipo de dispositivo. Los servidores web utilizan esta información para ayudar a personalizar o restringir el contenido o los recursos. Esto significa que, al realizar el raspado web, los sitios web pueden bloquear las solicitudes que se originan en tu dirección IP si consideran que el patrón o el comportamiento del tráfico son inusuales, similares a los de un bot o malintencionados. Afortunadamente, los servidores proxy pueden ayudar.

Un servidor proxy es un servidor intermediario que actúa como una puerta de enlace entre un usuario e Internet. Recibe las solicitudes de los usuarios, las reenvía a los recursos web y, a continuación, devuelve los datos obtenidos a los usuarios. Un servidor proxy te ayuda a navegar y raspar de forma discreta ocultando tu dirección IP real, lo que mejora la seguridad, la privacidad y el anonimato.

Los servidores proxy también ayudan a eludir las prohibiciones de IP al cambiar la dirección IP, haciendo que parezca que las solicitudes provienen de diferentes usuarios. Los servidores proxy ubicados en diferentes regiones te permiten acceder a contenido geolocalizado, como películas o noticias, evitando el geobloqueo.

En este artículo, aprenderás cómo configurar un servidor proxy para el raspado web en Go. También descubrirás los servidores proxy de Bright Data y cómo pueden ayudarte a simplificar este proceso.

Configurar un servidor proxy

En este tutorial, aprenderás cómo modificar una aplicación de raspador web desarrollada en Go para interactuar con el sitio web It’s FOSS a través de un servidor proxy local o autoalojado. En este tutorial, se presupone que ya tienes configurado tu entorno de desarrollo de Go.

Para empezar, debes configurar tu servidor proxy con Squid, un software de servidor proxy de código abierto. Si estás familiarizado con otro software de servidor proxy, también puedes usarlo. El siguiente artículo usa Squid en un equipo Linux de Fedora 39. Para la mayoría de las distribuciones de Linux, Squid está incluido en los repositorios predeterminados. También puedes consultar la documentación  para descargar los paquetes necesarios para tu sistema operativo.

Desde tu terminal, ejecuta el siguiente comando para instalar Squid:

dnf install squid -y

Una vez completado, inicia el servicio ejecutando el siguiente comando:

sudo systemctl enable --now squid

Comprueba el estado del servicio con este comando:

sudo systemctl status squid

El resultado debería ser el siguiente:

Servidores proxy de Go

Esto indica que el servicio está activo y en ejecución. De forma predeterminada, Squid ejecuta y escucha las solicitudes en el puerto 3128. Usa el siguiente comando curl para probar la comunicación a través del servidor proxy:

curl --proxy 127.0.0.1:3128 "http://lumtest.com/myip.json"

Tu respuesta debería tener este aspecto:

curl --proxy 127.0.0.1:3128 "http://lumtest.com/myip.json"
{"ip":"196.43.196.126","country":"GH","asn":{"asnum":327695,"org_name":"AITI"},"geo":{"city":"","region":"","region_name":"","postal_code":"","latitude":8.1,"longitude":-1.2,"tz":"Africa/Accra"}}

Los metadatos deben incluir tu dirección IP pública y el país y la organización que la poseen. También confirma que has instalado correctamente un servidor proxy que funciona.

Configurar el raspador de demostración

Para que este proceso sea más sencillo, hay disponible una sencilla aplicación de raspador web de Go en este repositorio de GitHub. El raspador captura el título, el extracto y las categorías de las últimas publicaciones de blog en It’s FOSS, un popular blog para hablar sobre productos de software de código abierto. A continuación, el raspador visita Lumtest para obtener información sobre la dirección IP utilizada por el cliente HTTP del raspador para interactuar con la web. La misma lógica se implementa con tres paquetes diferentes de Go: Colly, goquery y Selenium. En la siguiente sección, aprenderás a modificar cada implementación para usar un servidor proxy.

Empieza por clonar el repositorio ejecutando el siguiente comando en tu terminal o shell favorito:

$ git clone https://github.com/rexfordnyrk/go_scrap_proxy.git

Este repositorio consta de dos ramas: la rama main, que contiene el código completo, y la rama basic, que contiene el código inicial que vas a modificar. Usa el siguiente comando para desplegar a la rama basic:

$ git checkout basic

Esta rama contiene tres archivos .go para cada implementación de biblioteca del raspador sin un proxy configurado. También contiene un archivo ejecutable chromedriver, que es requerido por la implementación de Selenium del raspador:

.
├── chromedriver
├── colly.go
├── go.mod
├── goquery.go
├── go.sum
├── LICENSE
├── README.md
└── selenium.go

1 directory, 8 files

Puedes ejecutar cualquiera de ellas de forma individual con el comando go run con el nombre de archivo específico. Por ejemplo, el siguiente comando ejecuta el raspador con Colly:

go run ./colly.go 

El resultado debería ser el siguiente:

$ go run ./colly.go

Article 0: {"category":"Newsletter ✉️","excerpt":"Unwind your new year celebration with new open-source projects, and keep an eye on interesting distro updates.","title":"FOSS Weekly #24.02: Mixing AI With Linux, Vanilla OS 2, and More"}
Article 1: {"category":"Tutorial","excerpt":"Wondering how to use tiling windows on GNOME? Try the tiling assistant. Here's how it works.","title":"How to Use Tiling Assistant on GNOME Desktop?"}
Article 2: {"category":"Linux Commands","excerpt":"The free command in Linux helps you gain insights on system memory usage (RAM), and more. Here's how to make good use of it.","title":"Free Command Examples"}
Article 3: {"category":"Gaming 🎮","excerpt":"Here are the best tips to make your Linux gaming experience enjoyable.","title":"7 Tips and Tools to Improve Your Gaming Experience on Linux"}
Article 4: {"category":"Newsletter ✉️","excerpt":"The first edition of FOSS Weekly in the year 2024 is here. See, what's new in the new year.","title":"FOSS Weekly #24.01: Linux in 2024, GDM Customization, Distros You Missed Last Year"}
Article 5: {"category":"Tutorial","excerpt":"Wondering which init service your Linux system uses? Here's how to find it out.","title":"How to Check if Your Linux System Uses systemd"}
Article 6: {"category":"Ubuntu","excerpt":"Learn the logic behind each step you have to follow for adding an external repository in Ubuntu and installing packages from it.","title":"Installing Packages From External Repositories in Ubuntu [Explained]"}
Article 7: {"category":"Troubleshoot 🔬","excerpt":"Getting a warning that the boot partition has no space left? Here are some ways you can free up space on the boot partition in Ubuntu Linux.","title":"How to Free Up Space in /boot Partition on Ubuntu Linux?"}
Article 8: {"category":"Ubuntu","excerpt":"Wondering which Ubuntu version you're using? Here's how to check your Ubuntu version, desktop environment and other relevant system information.","title":"How to Check Ubuntu Version Details and Other System Information"}

Check Proxy IP map[asn:map[asnum:29614 org_name:VODAFONE GHANA AS INTERNATIONAL TRANSIT] country:GH geo:map[city:Accra latitude:5.5486 longitude:-0.2012 lum_city:accra lum_region:aa postal_code: region:AA region_name:Greater Accra Region tz:Africa/Accra] ip:197.251.144.148]

Este resultado contiene toda la información del artículo extraído de It’s FOSS. En la parte inferior del resultado, encontrarás la información de la IP devuelta por Lumtest que te informa sobre la conexión actual utilizada por el raspador. La ejecución de las tres implementaciones debería dar una respuesta similar. Una vez que hayas probado las tres, estarás listo para empezar a buscar datos con un proxy local.

Implementación de raspadores con un proxy local

En esta sección, conocerás las tres implementaciones del raspador y las modificarás para usar tu servidor proxy. Cada archivo .go consta de la función main() donde se inicia la aplicación y la función ScrapeWithLibrary() que contiene las instrucciones para el raspado.

Uso de goquery con un proxy local

goquery es una biblioteca para Go que proporciona un conjunto de métodos y funcionalidades para analizar y manipular documentos HTML, de forma similar a cómo funciona jQuery para JavaScript. Es particularmente útil para el raspado web, ya que permite recorrer, consultar y manipular la estructura de las páginas HTML. Sin embargo, esta biblioteca no gestiona solicitudes de red ni operaciones de ningún tipo, lo que significa que debes obtener y proporcionarle la página HTML.

Si vas al archivo goquery.go, encontrarás la implementación de goquery del raspador web. Ábrelo en tu IDE o editor de texto favorito.

Dentro de la función ScrapeWithGoQuery(), debes modificar el transporte del cliente HTTP con la URL de tu servidor proxy HTTP, que es una combinación del nombre del host o la IP y el puerto con el formato http://HOST:PUERTO.

Asegúrate de importar el paquete net/url a este archivo. Pega y reemplaza la definición del cliente HTTP por el siguiente segmento de código:

...

func ScrapeWithGoquery() {
    // Define the URL of the proxy server
    proxyStr := "http://127.0.0.1:3128"

    // Parse the proxy URL
    proxyURL, err := url.Parse(proxyStr)
    if err != nil {
        fmt.Println("Error parsing proxy URL:", err)
        return
    }

    //Create an http.Transport that uses the proxy
    transport := &http.Transport{
        Proxy: http.ProxyURL(proxyURL),
    }

    // Create an HTTP client with the transport
    client := &http.Client{
        Transport: transport,
    }
    
... 

Este segmento modifica el cliente HTTP con un transporte configurado para usar el servidor proxy local. Asegúrate de reemplazar la dirección IP por la dirección IP de tu servidor proxy.

Ahora, ejecuta esta implementación con el siguiente comando del directorio del proyecto:

go run ./goquery.go

El resultado debería ser el siguiente:

$ go run ./goquery.go

Article 0: {"category":"Newsletter ✉️","excerpt":"Unwind your new year celebration with new open-source projects, and keep an eye on interesting distro updates.","title":"FOSS Weekly #24.02: Mixing AI With Linux, Vanilla OS 2, and More"}
Article 1: {"category":"Tutorial","excerpt":"Wondering how to use tiling windows on GNOME? Try the tiling assistant. Here's how it works.","title":"How to Use Tiling Assistant on GNOME Desktop?"}
Article 2: {"category":"Linux Commands","excerpt":"The free command in Linux helps you gain insights on system memory usage (RAM), and more. Here's how to make good use of it.","title":"Free Command Examples"}
Article 3: {"category":"Gaming 🎮","excerpt":"Here are the best tips to make your Linux gaming experience enjoyable.","title":"7 Tips and Tools to Improve Your Gaming Experience on Linux"}
Article 4: {"category":"Newsletter ✉️","excerpt":"The first edition of FOSS Weekly in the year 2024 is here. See, what's new in the new year.","title":"FOSS Weekly #24.01: Linux in 2024, GDM Customization, Distros You Missed Last Year"}
Article 5: {"category":"Tutorial","excerpt":"Wondering which init service your Linux system uses? Here's how to find it out.","title":"How to Check if Your Linux System Uses systemd"}
Article 6: {"category":"Ubuntu","excerpt":"Learn the logic behind each step you have to follow for adding an external repository in Ubuntu and installing packages from it.","title":"Installing Packages From External Repositories in Ubuntu [Explained]"}
Article 7: {"category":"Troubleshoot 🔬","excerpt":"Getting a warning that the boot partition has no space left? Here are some ways you can free up space on the boot partition in Ubuntu Linux.","title":"How to Free Up Space in /boot Partition on Ubuntu Linux?"}
Article 8: {"category":"Ubuntu","excerpt":"Wondering which Ubuntu version you're using? Here's how to check your Ubuntu version, desktop environment and other relevant system information.","title":"How to Check Ubuntu Version Details and Other System Information"}

Check Proxy IP map[asn:map[asnum:29614 org_name:VODAFONE GHANA AS INTERNATIONAL TRANSIT] country:GH geo:map[city:Accra latitude:5.5486 longitude:-0.2012 lum_city:accra lum_region:aa postal_code: region:AA region_name:Greater Accra Region tz:Africa/Accra] ip:197.251.144.148]

Uso de Colly con un proxy local

Colly es un marco de raspado web versátil y eficiente para Go, conocido por su API fácil de usar y su perfecta integración con bibliotecas de análisis de HTML como goquery. Sin embargo, a diferencia de goquery, admite y proporciona una API para gestionar varios comportamientos relacionados con la red, incluidas las solicitudes asincrónicas de raspado a alta velocidad, el almacenamiento en caché local y la limitación de velocidad para garantizar un uso eficiente y responsable de los recursos web, la gestión automática de cookies y sesiones, los agentes de usuario personalizables y la gestión integral de errores. Además, admite el uso de proxies con cambio o rotación de los mismos, y se puede ampliar para tareas como raspar contenido generado por JavaScript mediante la integración con navegadores sin interfaz gráfica.

Abre el archivo colly.go en tu editor o IDE y pega las siguientes líneas de código justo después de iniciar un nuevo recopilador dentro de la función ScrapeWithColly():

...
    // Define the URL of the proxy server
    proxyStr := "http://127.0.0.1:3128"
    // SetProxy sets a proxy for the collector
    if err := c.SetProxy(proxyStr); err != nil {
        log.Fatalf("Error setting proxy configuration: %v", err)
    }
    
...

Este segmento de código usa el método SetProxy() de Colly para definir el servidor proxy que utilizará esta instancia recopiladora para las solicitudes de red.

Ahora, ejecuta esta implementación con el siguiente comando del directorio del proyecto:

go run ./colly.go

El resultado debería ser el siguiente:

$ go run ./colly.go

Article 0: {"category":"Newsletter ✉️","excerpt":"Unwind your new year celebration with new open-source projects, and keep an eye on interesting distro updates.","title":"FOSS Weekly #24.02: Mixing AI With Linux, Vanilla OS 2, and More"}
Article 1: {"category":"Tutorial","excerpt":"Wondering how to use tiling windows on GNOME? Try the tiling assistant. Here's how it works.","title":"How to Use Tiling Assistant on GNOME Desktop?"}
Article 2: {"category":"Linux Commands","excerpt":"The free command in Linux helps you gain insights on system memory usage (RAM), and more. Here's how to make good use of it.","title":"Free Command Examples"}
Article 3: {"category":"Gaming 🎮","excerpt":"Here are the best tips to make your Linux gaming experience enjoyable.","title":"7 Tips and Tools to Improve Your Gaming Experience on Linux"}
Article 4: {"category":"Newsletter ✉️","excerpt":"The first edition of FOSS Weekly in the year 2024 is here. See, what's new in the new year.","title":"FOSS Weekly #24.01: Linux in 2024, GDM Customization, Distros You Missed Last Year"}
Article 5: {"category":"Tutorial","excerpt":"Wondering which init service your Linux system uses? Here's how to find it out.","title":"How to Check if Your Linux System Uses systemd"}
Article 6: {"category":"Ubuntu","excerpt":"Learn the logic behind each step you have to follow for adding an external repository in Ubuntu and installing packages from it.","title":"Installing Packages From External Repositories in Ubuntu [Explained]"}
Article 7: {"category":"Troubleshoot 🔬","excerpt":"Getting a warning that the boot partition has no space left? Here are some ways you can free up space on the boot partition in Ubuntu Linux.","title":"How to Free Up Space in /boot Partition on Ubuntu Linux?"}
Article 8: {"category":"Ubuntu","excerpt":"Wondering which Ubuntu version you're using? Here's how to check your Ubuntu version, desktop environment and other relevant system information.","title":"How to Check Ubuntu Version Details and Other System Information"}

Check Proxy IP map[asn:map[asnum:29614 org_name:VODAFONE GHANA AS INTERNATIONAL TRANSIT] country:GH geo:map[city:Accra latitude:5.5486 longitude:-0.2012 lum_city:accra lum_region:aa postal_code: region:AA region_name:Greater Accra Region tz:Africa/Accra] ip:197.251.144.148]

Uso de Selenium con un proxy local

Selenium es una herramienta que se usa principalmente para automatizar las interacciones del navegador web en las pruebas de aplicaciones web. Es capaz de realizar tareas como hacer clic en botones, introducir texto y extraer datos de páginas web, por lo que es ideal para raspar contenido web con interacciones automatizadas. La imitación de las interacciones de usuarios reales es posible gracias al WebDriver, que Selenium utiliza para controlar los navegadores. Si bien este ejemplo usa Chrome, Selenium también es compatible con otros navegadores, incluidos Firefox, Safari e Internet Explorer.

El servicio del WebDriver de Selenium te permite proporcionar un proxy y otras configuraciones para influir en el comportamiento del navegador subyacente al interactuar con la web, al igual que un navegador real. Esto se puede configurar a través de programación mediante la definición selelium.Capabilities{}.

Para usar Selenium con un proxy local, edita el archivo selenium.go dentro de ScrapeWithSelenium() y reemplaza la definición de selelium.Capabilities{} por el siguiente segmento de código:

...

    // Define proxy settings
    proxy := selenium.Proxy{
        Type: selenium.Manual,
        HTTP: "127.0.0.1:3128", // Replace with your proxy settings
        SSL:  "127.0.0.1:3128", // Replace with your proxy settings
    }

    // Configuring the WebDriver instance with the proxy
    caps := selenium.Capabilities{
        "browserName": "chrome",
        "proxy":       proxy,
    }
    
...

Este segmento de código define los distintos parámetros de proxy para Selenium, que se utilizan para configurar las capacidades de Selenium para el WebDriver. En la próxima ejecución, se utilizará la conexión proxy.

Ahora, ejecuta la implementación con el siguiente comando del directorio del proyecto:

go run ./selenium.go

El resultado debería ser el siguiente:

$ go run ./selenium.go

Article 0: {"category":"Newsletter ✉️","excerpt":"Unwind your new year celebration with new open-source projects, and keep an eye on interesting distro updates.","title":"FOSS Weekly #24.02: Mixing AI With Linux, Vanilla OS 2, and More"}
Article 1: {"category":"Tutorial","excerpt":"Wondering how to use tiling windows on GNOME? Try the tiling assistant. Here's how it works.","title":"How to Use Tiling Assistant on GNOME Desktop?"}
Article 2: {"category":"Linux Commands","excerpt":"The free command in Linux helps you gain insights on system memory usage (RAM), and more. Here's how to make good use of it.","title":"Free Command Examples"}
Article 3: {"category":"Gaming 🎮","excerpt":"Here are the best tips to make your Linux gaming experience enjoyable.","title":"7 Tips and Tools to Improve Your Gaming Experience on Linux"}
Article 4: {"category":"Newsletter ✉️","excerpt":"The first edition of FOSS Weekly in the year 2024 is here. See, what's new in the new year.","title":"FOSS Weekly #24.01: Linux in 2024, GDM Customization, Distros You Missed Last Year"}
Article 5: {"category":"Tutorial","excerpt":"Wondering which init service your Linux system uses? Here's how to find it out.","title":"How to Check if Your Linux System Uses systemd"}
Article 6: {"category":"Ubuntu","excerpt":"Learn the logic behind each step you have to follow for adding an external repository in Ubuntu and installing packages from it.","title":"Installing Packages From External Repositories in Ubuntu [Explained]"}
Article 7: {"category":"Troubleshoot 🔬","excerpt":"Getting a warning that the boot partition has no space left? Here are some ways you can free up space on the boot partition in Ubuntu Linux.","title":"How to Free Up Space in /boot Partition on Ubuntu Linux?"}
Article 8: {"category":"Ubuntu","excerpt":"Wondering which Ubuntu version you're using? Here's how to check your Ubuntu version, desktop environment and other relevant system information.","title":"How to Check Ubuntu Version Details and Other System Information"}

Check Proxy IP {"ip":"197.251.144.148","country":"GH","asn":{"asnum":29614,"org_name":"VODAFONE GHANA AS INTERNATIONAL TRANSIT"},"geo":{"city":"Accra","region":"AA","region_name":"Greater Accra Region","postal_code":"","latitude":5.5486,"longitude":-0.2012,"tz":"Africa/Accra","lum_city":"accra","lum_region":"aa"}}

Si bien puedes mantener un servidor proxy tú mismo, estás limitado por varios factores, como la configuración de un servidor nuevo para varias regiones y otros problemas de mantenimiento y seguridad.

Servidores proxy de Bright Data

Bright Data ofrece una galardonada infraestructura de red proxy global con un conjunto completo de servidores y servicios proxy que se pueden utilizar para diversos fines de recopilación de datos web.

Con la extensa red global de servidores proxy de Bright Data, puedes acceder y recopilar datos fácilmente desde varias ubicaciones internacionales. Bright Data también ofrece una variedad de tipos de proxy, incluidos más de 350 millones de proxies residencialesde ISPde centros de datosmóviles únicos, cada uno de los cuales con beneficios distintos, como legitimidad, velocidad y fiabilidad, para tareas específicas de recopilación de datos web.

Además, el  sistema de rotación de proxies Bright Data garantiza un alto nivel de anonimato y minimiza la detección, lo que lo hace ideal para la recopilación continua y a gran escala de datos web.

Configuración de un proxy residencial con Bright Data

Es fácil obtener un proxy residencial con Bright Data. Todo lo que tienes que hacer es registrarte para disfrutar de una prueba gratuita. Cuando te hayas registrado, verás algo como esto:

Panel de control de BD

Haz clic en el botón Comenzar para acceder a proxies residenciales.

Se te pedirá que rellenes el siguiente formulario:

Configuración de proxies residenciales de BD

Continúa y proporciona un nombre para esta instancia. Aquí es my_go_demo_proxy. También debes especificar el tipo de IP que se va a proporcionar: selecciona Compartido (si quieres usar proxies compartidos). A continuación, indica el nivel de geolocalización que deseas imitar al acceder al contenido web. De forma predeterminada, este es el nivel o la zona de País. También debes especificar si quieres que las páginas web que solicitas se almacenen en la caché. Por ahora, desactiva el almacenamiento en la caché.

Después de completar esta información, haz clic en Añadir para crear y proporcionar lo necesario para tu proxy residencial.

A continuación, tienes que activar tu proxy residencial. Sin embargo, como usuario nuevo, primero se te pedirá que proporciones tu información de facturación. Una vez que hayas completado ese paso, entra en tu panel de control y haz clic en el proxy residencial que acabas de crear:

configurar proxies en go

Asegúrate de que la pestaña Parámetros de acceso esté seleccionada.

Aquí encontrarás los distintos parámetros necesarios para usar el proxy residencial, como el host, el puerto y las credenciales de autenticación. Necesitarás esta información pronto.

Ahora es el momento de integrar tu proxy residencial de Bright Data con las tres implementaciones del raspador. Si bien este es un proceso similar al que se hizo para el servidor local, también incluirás la autenticación aquí. Además, dado que estás interactuando con la web mediante programación, es posible que no puedas revisar y aceptar los certificados SSL del servidor proxy como lo harías en un navegador con una interfaz gráfica de usuario. Por lo tanto, debes deshabilitar la verificación de certificados SSL en tu cliente web mediante programación para que tus solicitudes no se interrumpan.

Empieza creando un directorio llamado brightdata en el directorio del proyecto y copia los tres archivos .go en el directorio brightdata. La estructura de tu directorio debería tener este aspecto:

.
├── brightdata
│   ├── colly.go
│   ├── goquery.go
│   └── selenium.go
├── chromedriver
├── colly.go
├── go.mod
├── goquery.go
├── go.sum
├── LICENSE
├── README.md
└── selenium.go

2 directories, 11 files

De ahora en adelante, modificarás los archivos del directorio brightdata.

Uso de goquery con un proxy residencial de Bright Data

Dentro de la función ScrapeWithGoQuery(), debes modificar la variable proxyStr para incluir las credenciales de autenticación en la URL del proxy con el formato http://USUARIO:CONTRASEÑA@HOST:PUERTO. Reemplaza la definición actual por el siguiente segmento de usuario:

...

func ScrapeWithGoquery() {
    // Define the proxy server with username and password
    proxyUsername := "username" //Your residential proxy username 
    proxyPassword := "your_password" //Your Residential Proxy password here
    proxyHost := "server_host" //Your Residential Proxy Host
    proxyPort := "server_port"  //Your Port here
    
    proxyStr := fmt.Sprintf("http://%s:%s@%s:%s", url.QueryEscape(proxyUsername), url.QueryEscape(proxyPassword), proxyHost, proxyPort)
    
    // Parse the proxy URL
...

A continuación, debes modificar el transporte del cliente HTTP con una configuración para ignorar la verificación del certificado SSL/TLS del servidor proxy. Empieza por añadir el paquete crypto/tls a tus importaciones. A continuación, sustituye la definición http.Transport por el siguiente segmento de código después de analizar la URL del proxy:

...

func ScrapeWithGoquery() {
    
    // Parse the proxy URL
...

    //Create an http.Transport that uses the proxy
    transport := &http.Transport{
        Proxy: http.ProxyURL(proxyURL),
        TLSClientConfig: &tls.Config{
            InsecureSkipVerify: true, // Disable SSL certificate verification
        },
    }

    // Create an HTTP client with the transport
... 

Este segmento modifica el cliente HTTP con un transporte configurado para usar el servidor proxy local. Asegúrate de reemplazar la dirección IP por la de tu servidor proxy.

A continuación, ejecuta esta implementación con el siguiente comando del directorio del proyecto:

go run brightdata/goquery.go 

El resultado debería ser el siguiente:

$ go run brightdata/goquery.go 

Article 0: {"category":"Newsletter ✉️","excerpt":"Open source rival to Twitter, a hyped new terminal and a cool new Brave/Chrome feature among many other things.","title":"FOSS Weekly #24.07: Fedora Atomic Distro, Android FOSS Apps, Mozilla Monitor Plus and More"}
Article 1: {"category":"Explain","excerpt":"Intel makes things confusing, I guess. Let's try making the processor naming changes simpler.","title":"Intel Processor Naming Changes: All You Need to Know"}
Article 2: {"category":"Linux Commands","excerpt":"The Cut command lets you extract a part of the file to print without affecting the original file. Learn more here.","title":"Cut Command Examples"}
Article 3: {"category":"Raspberry Pi","excerpt":"A UART attached to your Raspberry Pi can help you troubleshoot issues with your Raspberry Pi. Here's what you need to know.","title":"Using a USB Serial Adapter (UART) to Help Debug Your Raspberry Pi"}
Article 4: {"category":"Newsletter ✉️","excerpt":"Damn Small Linux resumes development after 16 years.","title":"FOSS Weekly #24.06: Ollama AI, Zorin OS Upgrade, Damn Small Linux, Sudo on Windows and More"}
Article 5: {"category":"Tutorial","excerpt":"Zorin OS now provides a way to upgrade to a newer major version. Here's how to do that.","title":"How to upgrade to Zorin OS 17"}
Article 6: {"category":"Ubuntu","excerpt":"Learn the logic behind each step you have to follow for adding an external repository in Ubuntu and installing packages from it.","title":"Installing Packages From External Repositories in Ubuntu [Explained]"}
Article 7: {"category":"Troubleshoot 🔬","excerpt":"Getting a warning that the boot partition has no space left? Here are some ways you can free up space on the boot partition in Ubuntu Linux.","title":"How to Free Up Space in /boot Partition on Ubuntu Linux?"}
Article 8: {"category":"Ubuntu","excerpt":"Wondering which Ubuntu version you’re using? Here’s how to check your Ubuntu version, desktop environment and other relevant system information.","title":"How to Check Ubuntu Version Details and Other System Information"}

Check Proxy IP map[asn:map[asnum:7922 org_name:COMCAST-7922] country:US geo:map[city:Crown Point latitude:41.4253 longitude:-87.3565 lum_city:crownpoint lum_region:in postal_code:46307 region:IN region_name:Indiana tz:America/Chicago] ip:73.36.77.244]

Te darás cuenta de que, aunque estés raspando los mismos artículos, la comprobación de la IP del proxy devolvió información diferente, lo que indica que estás navegando desde una ubicación o un país diferente.

Uso de Colly con un proxy residencial de Bright Data

Aunque Colly no proporciona un método para deshabilitar la verificación del certificado SSL/TLS mediante programación, sí ofrece uno en el que puedes proporcionar tu propio transport para que lo utilice tu cliente HTTP.

Con el archivo colly.go abierto en tu editor o IDE, pega las siguientes líneas de código después de iniciar un nuevo recopilador dentro de la función ScrapeWithColly() (no olvides añadir las importaciones net/url y net/http):

...
func ScrapeWithColly() {
    ...
    
    //Create an http.Transport that uses the proxy
    transport := &http.Transport{
        TLSClientConfig: &tls.Config{
            InsecureSkipVerify: true, // Disable SSL certificate verification
        },
    }
    
    // Set the collector instance to use the configured transport
    c.WithTransport(transport)
    
    
...

Este segmento de código define un transporte HTTP con la verificación del certificado SSL desactivada y utiliza el método Colly WithTransport() para configurar el transporte del recopilador para las solicitudes de red.

Modifica la variable proxyStr para que contenga las credenciales del proxy residencial (igual que hiciste con goquery). Sustituye la línea proxyStr por el siguiente segmento de código:

...

    // Define the proxy server with username and password
    proxyUsername := "username" //Your residential proxy username 
    proxyPassword := "your_password" //Your Residential Proxy password here
    proxyHost := "server_host" //Your Residential Proxy Host
    proxyPort := "server_port"  //Your Port here

    proxyStr := fmt.Sprintf("http://%s:%s@%s:%s", url.QueryEscape(proxyUsername), url.QueryEscape(proxyPassword), proxyHost, proxyPort)

...

No olvides reemplazar los valores de cadena por los de la página Parámetros de acceso de tu proxy residencial.

A continuación, ejecuta esta implementación con el siguiente comando del directorio del proyecto:

go run brightdata/colly.go
go run brightdata/colly.go 
…

Check Proxy IP map[asn:map[asnum:2856 org_name:British Telecommunications PLC] country:GB geo:map[city:Turriff latitude:57.5324 longitude:-2.3883 lum_city:turriff lum_region:sct postal_code:AB53 region:SCT region_name:Scotland tz:Europe/London] ip:86.180.236.254]

En la parte «Comprobar la IP del proxy» del resultado, observarás el cambio de país a pesar de que se utilizan las mismas credenciales.

Uso de Selenium con un proxy residencial de Bright Data

Cuando trabajes con Selenium, debes modificar la definición selenium.Proxy{} para que use la cadena URL del proxy con las credenciales. Sustituye la definición del proxy actual por la siguiente:

...

    // Define the proxy server with username and password
    proxyUsername := "username"      //Your residential proxy username
    proxyPassword := "your_password" //Your Residential Proxy password here
    proxyHost := "server_host"       //Your Residential Proxy Host
    proxyPort := "server_port"       //Your Port here

    proxyStr := fmt.Sprintf("http://%s:%s@%s:%s", url.QueryEscape(proxyUsername), url.QueryEscape(proxyPassword), proxyHost, proxyPort)

    // Define proxy settings
    proxy := selenium.Proxy{
        Type: selenium.Manual,
        HTTP: proxyStr,
        SSL:  proxyStr,
    }
    
...

No olvides importar el paquete net/url.

Este segmento de código define los distintos parámetros del proxy y se combina para crear la URL del proxy utilizada en la configuración del proxy.

Ahora, el WebDriver de Chrome debe configurarse con opciones para deshabilitar la verificación del certificado SSL mientras se usa el proxy residencial, como se hizo de manera similar en las implementaciones anteriores. Para ello, modifica los argumentos de la definición chromeCaps para que incluya la opción --ignore-certificate-errors de la siguiente manera:

... 
    caps.AddChrome(chrome.Capabilities{Args: []string{
        "--headless=new", // Start browser without UI as a background process
        "--ignore-certificate-errors", // // Disable SSL certificate verification
    }})
...

De forma predeterminada, Selenium no admite la configuración de un proxy autenticado. Sin embargo, puedes solucionar este problema con un paquete pequeño para crear una extensión de Chrome para una conexión de un proxy autenticado.

Primero, añade el paquete a tu proyecto usando este comando go get:

go get https://github.com/rexfordnyrk/proxyauth

A continuación, importa el paquete al archivo brightdata/selenium.go añadiendo la línea "github.com/rexfordnyrk/proxyauth" al bloque de importación situado en la parte superior del archivo.

A continuación, debes crear la extensión de Chome con el método BuildExtension() del paquete proxyauth y pasarlo junto con las credenciales de tu proxy residencial de Bright Data. Para ello, pega el siguiente segmento de código después de la definición chromeCaps, pero antes de la línea caps.AddChrome(chromeCaps):

…
    //Building proxy auth extension using BrightData Proxy credentials
    extension, err := proxyauth.BuildExtention(proxyHost, proxyPort, proxyUsername, proxyPassword)
    if err != nil {
        log.Fatal("BuildProxyExtension Error:", err)
    }

    //including the extension to allow proxy authentication in chrome
    if err := chromeCaps.AddExtension(extension); err != nil {
        log.Fatal("Error adding Extension:", err)
    }

…

Este fragmento crea una extensión de Chrome y la añade al WebDriver de Chrome para permitir las solicitudes web autenticadas mediante las credenciales de proxy proporcionadas.

Puedes ejecutar esta implementación mediante el siguiente comando del directorio del proyecto:

go run brightdata/selenium.go

El resultado debería ser el siguiente:

$ go run brightdata/selenium.go 

Article 0: {"categoryText":"Newsletter ✉️","excerpt":"Check out the promising new features in Ubuntu 24.04 LTS and a new immutable distro.","title":"FOSS Weekly #24.08: Ubuntu 24.04 Features, Arkane Linux, grep, Fedora COSMIC and More"}
…
Article 8: {"categoryText":"Ubuntu","excerpt":"Wondering which Ubuntu version you’re using? Here’s how to check your Ubuntu version, desktop environment and other relevant system information.","title":"How to Check Ubuntu Version Details and Other System Information"}

Check Proxy IP {"ip":"176.45.169.166","country":"SA","asn":{"asnum":25019,"org_name":"Saudi Telecom Company JSC"},"geo":{"city":"Riyadh","region":"01","region_name":"Riyadh Region","postal_code":"","latitude":24.6869,"longitude":46.7224,"tz":"Asia/Riyadh","lum_city":"riyadh","lum_region":"01"}}

Una vez más, si observas la información de la IP en la parte inferior del resultado, verás que también se utiliza un país diferente para enviar la solicitud. Este es el sistema de rotación de proxies de Bright Data en funcionamiento.

Como puedes ver, usar Bright Data en tu aplicación de Go es sencillo. Primero, crea el proxy residencial en la plataforma de Bright Data y obtén tus credenciales. En segundo lugar, usa esa información para modificar el código y usar el proxy para la web.

Conclusión

Los servidores proxy web son un componente crucial para las interacciones del usuario a medida en Internet. En este artículo, has aprendido todo sobre los servidores proxy y cómo configurar un servidor proxy autoalojado con Squid. También has aprendido a integrar un servidor proxy local en tus aplicaciones de Go, un raspador web en este caso.

Si estás interesado en trabajar con servidores proxy, deberías considerar la posibilidad de usar Bright Data. Su red proxy de última generación puede ayudarte a recopilar datos rápidamente sin que tengas que preocuparte por ninguna infraestructura o mantenimiento adicionales.