Volver al blog
Guías
Suciu DanLast updated on Mar 31, 20267 min read

Elude las restricciones y extrae datos de forma eficaz con proxies y HttpClient de C#

Elude las restricciones y extrae datos de forma eficaz con proxies y HttpClient de C#

El web scraping es una potente herramienta que permite extraer datos valiosos de sitios web con diversos fines. Sin embargo, muchos sitios web bloquean los intentos de scraping para proteger sus datos. Una forma de eludir estos bloqueos es utilizando un servidor proxy.

En este artículo, veremos cómo utilizar un proxy con C# HttpClient, una biblioteca muy popular para realizar solicitudes HTTP en C#. Abordaremos los requisitos previos, la configuración y consejos para la depuración y la resolución de problemas.

Además, repasaremos cómo enviar una solicitud y mejorar el rendimiento de las mismas. Al final de este artículo, comprenderás bien cómo utilizar un proxy con C# HttpClient y cómo puede beneficiarte en tus tareas de web scraping.

¿Qué son los proxies?

Los proxies, también conocidos como servidores proxy, actúan como intermediarios entre un cliente (como un navegador web o un scraper) y un servidor de destino (como un sitio web). El cliente envía una solicitud al proxy, que a su vez la reenvía al servidor de destino.

Una vez que el servidor de destino responde, el proxy envía la respuesta al cliente. En el web scraping, el uso de proxies puede ocultar la dirección IP del scraper, evitando que el sitio web detecte y bloquee la solicitud.

El uso de varios proxies también puede ayudar a evitar la detección y el bloqueo. Algunos proveedores de proxies incluso ofrecen la opción de rotar las direcciones IP, lo que proporciona una protección adicional contra el bloqueo de tus solicitudes.

Creación de un proyecto C#

En este artículo se utilizará Visual Studio 2022 para Windows y .Net 6.0. Para seguir los pasos, abra Visual

En Visual Studio, selecciona C# en el menú desplegable Todos los lenguajes. Si la plantilla Aplicación de consola no está visible, utiliza el campo Buscar plantillas para localizarla. A continuación, haz clic en Siguiente.

Elige la ubicación para tu proyecto en la siguiente pantalla. A continuación, haz clic en Siguiente para pasar a la pantalla de Información adicional. Asegúrate de que tienes seleccionado .NET 7.0 antes de hacer clic en Crear.

Tras la creación del proyecto, verás el código «Hello World» en la pantalla:

// See https://aka.ms/new-console-template for more information

Console.WriteLine("Hello, World!");

Realizar una solicitud HTTP

Hagamos nuestra primera solicitud con `HttpClient`. Reemplaza el código de ejemplo por este:

using var client = new HttpClient();

var result = await client.GetStringAsync("https://api.ipify.org?format=json");

Console.WriteLine(result); 

Este código utiliza la clase HttpClient del espacio de nombres System.Net.Http para realizar una solicitud HTTP GET al punto final https://api.ipify.org/ y recuperar la respuesta como una cadena.

A continuación se ofrece un desglose del código:

  • `using var client = new HttpClient();`: Esta línea crea una nueva instancia de la clase `HttpClient` y la asigna a la variable client. La instrucción `using` garantiza la eliminación correcta del objeto client una vez que ya no sea necesario.
  • `var result = await client.GetStringAsync("https://api.ipify.org/");`: Esta línea utiliza el método `GetStringAsync()` del objeto client para enviar una solicitud GET al punto final https://api.ipify.org/. Este método lee la respuesta como una cadena y la almacena en la variable result. La palabra clave `await` hace que la solicitud sea asíncrona, lo que permite que el programa continúe ejecutando otro código mientras se procesa la solicitud.
  • `Console.WriteLine(result);`: Esta línea escribe el contenido de la variable result en la consola, que es la respuesta de la solicitud GET.

Guarda el código y ejecútalo. Verás tu dirección IP en el terminal.

Uso de proxies con HttpClient

Antes de volver a programar, visita el sitio web Free Proxy List y selecciona un proxy que esté más cerca de tu ubicación. Para este ejemplo, seleccionaré un proxy ubicado en Alemania. Anota la dirección IP y el puerto del proxy seleccionado.

Para utilizar un proxy con HttpClient, necesitamos crear una instancia de HttpClientHandler. Dentro de esta instancia, configuramos dos propiedades: la URL del proxy y el puerto, y `ServerCertificateCustomValidationCallback`. Es un nombre largo para una variable, pero es importante.

`ServerCertificateCustomValidationCallback` le indica a HttpClientHandler que ignore cualquier error de certificado HTTPS. Quizás te preguntes por qué tienes que hacer esto.

El servidor proxy intercepta e inspecciona el tráfico, incluido el certificado HTTPS, antes de reenviarlo al servidor de destino. Como resultado, el certificado presentado por el servidor de destino al servidor proxy puede ser diferente del que se presenta al cliente.

Por defecto, HttpClient y otras bibliotecas similares validarán el certificado presentado por el servidor de destino, y si no es válido o no coincide con el presentado al cliente, generarán una excepción. De ahí provienen los errores de certificado.

Ignorar los errores de certificado HTTPS al utilizar el modo proxy permite que la solicitud continúe incluso si el certificado no es válido, lo cual resulta útil en algunos casos en los que el servidor proxy intercepta y modifica el certificado.

Es hora de escribir el código. Empecemos con la instancia de HttpClientHandler:

using System.Net;

using var httpClientHandler = new HttpClientHandler

{

	Proxy = new WebProxy("http://5.9.139.204:24000"),

	ServerCertificateCustomValidationCallback = HttpClientHandler.DangerousAcceptAnyServerCertificateValidator

};

Tenemos que proporcionar a la clase HttpClient una instancia de HttpClientHandler. El código del cliente modificado debería quedar así:

using var client = new HttpClient(httpClientHandler);

El código completo debería tener este aspecto:

using System.Net;

using var httpClientHandler = new HttpClientHandler

{

	Proxy = new WebProxy("http://5.9.139.204:24000"),

	ServerCertificateCustomValidationCallback = HttpClientHandler.DangerousAcceptAnyServerCertificateValidator

};

using var client = new HttpClient(httpClientHandler);

var result = await client.GetStringAsync("https://api.ipify.org?format=json");

Console.WriteLine(result);

Al ejecutar el código, se devolverá la dirección IP del proxy en lugar de tu dirección IP. Puedes abrir la URL de ipify en tu navegador y comparar los resultados.

Hagamos la autenticación

Cuando te registras en un servicio de proxy premium, recibes un nombre de usuario y una contraseña para utilizarlos en tu aplicación con fines de autenticación.

Es hora de sustituir la definición de WebProxy por esta:

Proxy = new WebProxy

{

    	Address = new Uri($"http://5.9.139.204:24000"),

    	Credentials = new NetworkCredential(

        	userName: "PROXY_USERNAME",

        	password: "PROXY_PASSWORD"

    	)

},

Al sustituir las credenciales del marcador de posición, actualizar la URL del proxy y ejecutar el código, verás que la dirección IP que se muestra es diferente de la que utiliza tu ordenador. ¡Pruébalo!

Rotación de proxies

La rotación de proxies es beneficiosa, ya que ayuda a evitar la detección y evita que los sitios web bloqueen tu dirección IP. Los sitios web pueden supervisar y bloquear direcciones IP que realizan solicitudes excesivas en un breve periodo de tiempo o aquellas relacionadas con actividades de scraping.

Podemos utilizar el sitio web Free Proxy List para generar una lista de proxies que podamos rotar con cada solicitud enviada. Al implementar esta técnica, cada solicitud tendrá una dirección IP distinta, lo que hará que el sitio web de destino resulte menos sospechoso.

Ten en cuenta que la lista de proxies que puedas encontrar en el sitio web puede diferir de la lista que he recopilado. He seleccionado cinco proxies y los he definido en una lista como esta:

List<string> proxiesList = new List<string> {

	"http://65.108.230.238:45977",

	"http://163.116.177.46:808",

	"http://163.116.177.31:808",

	"http://20.111.54.16:80",

	"http://185.198.61.146:3128"

};

Elijamos un índice aleatorio de esta lista y utilicemos el elemento de ese índice seleccionado con la clase Uri:

var random = new Random();

int index = random.Next(proxiesList.Count);

Lo que tenemos que hacer ahora es combinar todas las partes. La versión final de tu código de scraper debería tener el siguiente aspecto:

using System.Net;

List<string> proxiesList = new List<string> {

	"http://65.108.230.238:45977",

	"http://163.116.177.46:808",

	"http://163.116.177.31:808",

	"http://20.111.54.16:80",

	"http://185.198.61.146:3128"

};

var random = new Random();

int index = random.Next(proxiesList.Count);

using var httpClientHandler = new HttpClientHandler

{

	Proxy = new WebProxy(proxiesList[index]),

	ServerCertificateCustomValidationCallback = HttpClientHandler.DangerousAcceptAnyServerCertificateValidator

};

using var client = new HttpClient(httpClientHandler);

var result = await client.GetStringAsync("https://api.ipify.org?format=json");

Console.WriteLine(result);

Uso de proxies de WebScrapingAPI

Optar por proxies premium de un servicio como WebScrapingAPI es una mejor opción que utilizar proxies gratuitos, ya que son más fiables, más rápidos y ofrecen una mayor seguridad. Los proxies premium son menos susceptibles de ser bloqueados por los sitios web y tienen un tiempo de respuesta menor.

En comparación, los proxies gratuitos pueden ser lentos, poco fiables, contener malware y son más propensos a tener una alta tasa de fallos, ya que el sitio de destino bloqueará tus solicitudes.

¿Te interesa probar WebScrapingAPI? No hay problema, solo tienes que registrarte para obtener nuestra prueba gratuita de 14 días. Puedes utilizar los 5000 créditos para probar todas las funciones disponibles.

Una vez que tengas una cuenta, ve al API Playground y selecciona la pestaña «Proxy Mode» en la sección «Code Samples».

Ahora utilizaremos la URL de proxy generada en la pestaña «Proxy Mode» con nuestra implementación en C#.

Actualiza la URL del proxy y las credenciales en httpClientHandler para que queden así:

using var httpClientHandler = new HttpClientHandler

{

	Proxy = new WebProxy

	{

    	Address = new Uri($"http://proxy.webscrapingapi.com:80"),

    	Credentials = new NetworkCredential(

        	userName: "webscrapingapi.render_js=0.device=desktop.proxy_type=datacenter",

        	password: "YOUR_API_KEY"

    	)

	},

	ServerCertificateCustomValidationCallback = HttpClientHandler.DangerousAcceptAnyServerCertificateValidator

};

Puedes utilizar la propiedad username para habilitar o deshabilitar funciones específicas de la API. Recuerda también configurar tu clave de API en la propiedad password. Puedes consultar la documentación completa aquí.

Cada vez que ejecute este código, recibirá una dirección IP diferente, ya que WebScrapingAPI rota las IP con cada solicitud. Puede obtener más información sobre esta función leyendo la documentación sobre el modo proxy.

También tienes la opción de cambiar entre proxies de centro de datos y residenciales. Puedes encontrar más detalles al respecto en la sección Proxies de nuestra documentación.

Conclusión

El uso de un proxy es un aspecto esencial del web scraping, ya que te permite ocultar tu dirección IP y acceder a sitios web restringidos. La biblioteca HttpClient de C# es una potente herramienta para la extracción de datos y, cuando se combina con un proxy fiable, puedes lograr una extracción de datos eficiente y rápida.

Al suscribirte a un servicio de proxy premium como WebScrapingAPI, tendrás acceso a una amplia gama de funciones, incluyendo la rotación de IP y la opción de cambiar entre proxies de centro de datos y residenciales.

Esperamos que este artículo te haya proporcionado una visión útil sobre el uso de un proxy con HttpClient y cómo puede beneficiarte en tus necesidades de scraping. No dudes en registrarte para nuestra prueba gratuita de 14 días, para probar nuestro servicio y explorar todas las características y funcionalidades.

Acerca del autor
Suciu Dan, Cofundador @ WebScrapingAPI
Suciu DanCofundador

Suciu Dan es cofundador de WebScrapingAPI y escribe guías prácticas dirigidas a desarrolladores sobre el scraping web con Python, el scraping web con Ruby y las infraestructuras de proxy.

Empieza a crear

¿Estás listo para ampliar tu recopilación de datos?

Únete a más de 2000 empresas que utilizan WebScrapingAPI para extraer datos de la web a escala empresarial sin ningún gasto de infraestructura.