Volver al blog
Guías
Suciu Dan13 de abril de 20238 min de lectura

Evite Restricciones y Raspe Datos Efectivamente con Proxies y C# HttpClient

Evite Restricciones y Raspe Datos Efectivamente con Proxies y C# HttpClient

¿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 rastreador) 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 reenvía la respuesta al cliente. En el web scraping, el uso de proxies permite ocultar la dirección IP del rastreador, lo que evita que el sitio web detecte y bloquee la solicitud.

El uso de varios proxies también puede ayudar a evitar ser detectado y a que te bloqueen. 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 en C#

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

Cuadro de diálogo «Crear un nuevo proyecto» de Visual Studio filtrado por plantillas de C#

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

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

Cuadro de diálogo «Configurar el nuevo proyecto» de Visual Studio, en el que se muestran los campos de nombre y ubicación del proyecto para una aplicación de consola en C#

Una vez creado el 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 petición HTTP

Hagamos nuestra primera solicitud con `HttpClient`. Sustituye 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 muestra en la consola el contenido de la variable `result`, 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, entra en la página web Free Proxy List y selecciona el proxy más cercano a tu ubicación. Para este ejemplo, voy a seleccionar un proxy ubicado en Alemania. Anota la dirección IP y el puerto del proxy seleccionado.

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

`ServerCertificateCustomValidationCallback` indica a HttpClientHandler que ignore cualquier error relacionado con los certificados HTTPS. Quizás te preguntes por qué hay que hacer esto.

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

Por defecto, HttpClient y otras bibliotecas similares validan el certificado presentado por el servidor de destino y, si no es válido o no coincide con el presentado al cliente, se produce 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 aunque el certificado no sea 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í:

utilizando var client = new HttpClient(httpClientHandler);

El código completo debería quedar así:

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 mostrará 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.

Vamos a realizar la autenticación

Al suscribirte a un servicio de proxy premium, recibirás 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"

    	)

},

Si sustituyes las credenciales de ejemplo, actualizas la URL del proxy y ejecutas el código, verás que la dirección IP que aparece es diferente a la que utiliza tu ordenador. ¡Pruébalo!

Rotación de proxies

El uso rotativo de proxies resulta beneficioso, 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 las direcciones IP que realizan un número excesivo de solicitudes 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 ir alternando con cada solicitud enviada. Al aplicar esta técnica, cada solicitud tendrá una dirección IP diferente, lo que hará que el sitio web de destino despierte menos sospechas.

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 incluido 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 al azar 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 juntar todas las partes. La versión final del código de tu rastreador debería quedar así:

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 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 propensos a ser bloqueados por los sitios web y tienen un tiempo de respuesta más corto.

En comparación, los proxies gratuitos pueden ser lentos, poco fiables, contener malware y tienen más probabilidades de presentar un alto índice de fallos, ya que el sitio de destino bloqueará tus solicitudes.

¿Te gustaría probar WebScrapingAPI? No hay problema, solo tienes que registrarte para disfrutar de nuestra prueba gratuita de 14 días. Podrás utilizar los 5.000 créditos para probar todas las funciones disponibles.

Una vez que tengas una cuenta, ve al API Playground y selecciona la pestaña «Modo proxy» en la sección «Ejemplos de código».

Panel de ejemplos de código de WebScrapingAPI que muestra un ejemplo de solicitud de proxy con cURL y un botón «Copiar»

Ahora utilizaremos la URL del proxy generada en la pestaña «Modo proxy» 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 activar o desactivar funciones específicas de la API. Recuerda también introducir tu clave de API en la propiedad «password». Puedes consultar la documentación completa aquí.

Cada vez que ejecutes este código, recibirás una dirección IP diferente, ya que WebScrapingAPI cambia las direcciones IP con cada solicitud. Para obtener más información sobre esta función, consulta la documentación sobre el modo proxy.

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

Conclusión

El uso de un proxy es un aspecto fundamental del web scraping, ya que permite ocultar la 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, permite llevar a cabo una extracción de datos rápida y eficaz.

Al suscribirte a un servicio de proxies premium como WebScrapingAPI, tendrás acceso a una amplia gama de funciones, entre las que se incluyen la rotación de direcciones IP y la posibilidad de alternar entre proxies de centro de datos y proxies residenciales.

Esperamos que este artículo te haya ayudado a comprender mejor cómo utilizar un proxy con HttpClient y cómo puede serte útil para tus necesidades de scraping. No dudes en registrarte para disfrutar de nuestra prueba gratuita de 14 días, con el fin de probar nuestro servicio y explorar todas sus características y funcionalidades.

Acerca del autor
Suciu Dan, cofundador de 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.