Guía de raspado web con cURL Impersonate

Aprende a utilizar cURL Impersonate para imitar el comportamiento del navegador en el raspado web, con instrucciones detalladas sobre la línea de comandos y el uso de Python, además de consejos avanzados.
11 min read
web scraping with cURL impersonate blog image

En esta guía, aprenderás:

  • Qué es cURL Impersonate
  • Los motivos del proyecto y cómo funciona
  • Cómo usarlo a través de la línea de comandos
  • Cómo usarlo en Python
  • Técnicas y aspectos avanzados

¡Vamos a ello!

¿Qué es cURL Impersonate?

cURL Impersonate es una versión especial de cURL diseñada para imitar el comportamiento de los principales navegadores (es decir, Chrome, Edge, Safari y Firefox). En detalle, esta herramienta realiza apretones de manos TLS y HTTP que se parecen mucho a los de los navegadores reales.

El cliente HTTP se puede usar a través de la herramienta de línea de comandos curl-impersonate , similar a curlnormal, o como biblioteca en Python.

Estos son los navegadores en los que se puede suplantar la identidad:

Navegador Sistema operativo simulado Secuencia de comandos de empaquetado
Chrome 99 Windows 10 curl_chrome99
Chrome 100 Windows 10 curl_chrome100
Chrome 101 Windows 10 curl_chrome101
Chrome 104 Windows 10 curl_chrome104
Chrome 107 Windows 10 curl_chrome107
Chrome 110 Windows 10 curl_chrome110
Chrome 116 Windows 10 curl_chrome116
Chrome 99 Android 12 curl_chrome99_android
Edge 99 Windows 10 curl_edge99
Edge 101 Windows 10 curl_edge101
Firefox 91 ESR Windows 10 curl_ff90esr
Firefox 95 Windows 10 curl_ff95
Firefox 98 Windows 10 curl_ff98
Firefox 100 Windows 10 curl_ff100
Firefox 102 Windows 10 curl_ff102
Firefox 109 Windows 10 curl_ff109
Firefox 117 Windows 10 curl_ff117
Safari 15.3 macOS Big Sur curl_safari15_3
Safari 15.5 macOS Monterey curl_safari15_5

Cada navegador compatible tiene un script de empaquetado específico. Esto configura curl-impersonate con los encabezados, banderas y ajustes apropiados para simular un navegador específico.

Cómo funciona curl-impersonate

Cuando envías una solicitud a un sitio web a través de HTTPS, se produce un proceso denominado protocolo de enlace TLS . Durante este apretón de manos, se comparten detalles sobre el cliente HTTP con el servidor web, creando una huella TLS única. 

Los clientes HTTP tienen capacidades y configuraciones que difieren de las de un navegador estándar. Esta discrepancia da como resultado una huella digital TLS que puede revelar fácilmente el uso de clientes HTTP. Como resultado, las medidas antibots utilizadas por el sitio de destino pueden detectar tus solicitudes como automatizadas y, potencialmente, bloquearlas.

cURL Impersonate soluciona este problema modificando la herramienta estándar curl para que tu huella digital TLS coincida con la de los navegadores reales. Así es como logra el objetivo:

  • Modificación de la biblioteca TLS: para la versión Chrome de curl-impersonate, curl se compila con boringSSL, la biblioteca TLS de Google. Para la versión de Firefox, curl se compila con NSS, la biblioteca TLS que utiliza Firefox.
  • Ajustes de configuración: modifica la forma en que cURL configura varias extensiones de TLS y opciones de SSL para imitar la configuración de los navegadores reales. También añade compatibilidad con las nuevas extensiones de TLS que suelen utilizar los navegadores.
  • Personalización del protocolo de enlace HTTP/2: cambia la configuración que cURL usa para las conexiones HTTP/2 para alinearla con la de los navegadores reales.
  • Indicadores no predeterminados: se ejecuta con indicadores específicos no predeterminados, como --ciphers, --curvesy algunos encabezados -H, lo que ayuda aún más a imitar el comportamiento del navegador.

Por lo tanto, curl-impersonate hace que las solicitudes curl aparezcan desde la perspectiva de la red como si las hubiera realizado un navegador real. ¡Esto es útil para eludir muchos mecanismos de detección de bots!

curl-impersonate: tutorial de línea de comandos

Sigue los pasos que se indican a continuación para aprender a usar cURL Impersonate desde la línea de comandos.

Nota: para completar la información, se mostrarán varios métodos de instalación. Sin embargo, solo debes elegir uno. El método recomendado es usar Docker.

Instalación desde binarios precompilados

Puedes descargar archivos binarios precompilados para Linux y macOS desde la página de versiones de GitHub del proyecto. Estos binarios contienen un curl-suplantate compilado estáticamente. Antes de usarlos, asegúrate de tener instalado lo siguiente:

  • NSS (Network Security Services): un conjunto de bibliotecas diseñadas para apoyar el desarrollo multiplataforma de aplicaciones cliente y servidor habilitadas para la seguridad. NSS se usa en productos de Mozilla como Firefox y Thunderbird para gestionar el protocolo TLS.
  • Certificados de CA: conjunto de certificados digitales que autentican la identidad de los servidores y los clientes durante las comunicaciones seguras. Se aseguran de que la conexión a un servidor sea fiable al verificar que el certificado del servidor haya sido firmado por una CA reconocida (Certificate Authority).

Para cumplir los requisitos previos, en Ubuntu, ejecuta: 

sudo apt install libnss3 nss-plugin-pem ca-certificates

En Red Hat, Fedora o CentOS, ejecuta: 

yum install nss nss-pem ca-certificates

En Archlinux, lanza: 

pacman -S nss ca-certificates

En macOS, ejecuta este comando: 

brew install nss ca-certificates

Además, asegúrate de tener zlib instalado en tu sistema, ya que los paquetes binarios precompilados están comprimidos con gzip.

Instalación mediante Docker

Las imágenes de Docker, basadas en Alpine Linux y Debian, con curl-impersonate compiladas y listas para usar están disponibles en Docker Hub. Estas imágenes incluyen el binario y todos los scripts de empaquetado necesarios.

Las imágenes de Chrome (*-chrome) pueden suplantar a Chrome, Edge y Safari. En cambio, las imágenes de Firefox (*-ff) pueden suplantar a Firefox.

Para descargar la imagen de Docker que prefiera, utiliza uno de los siguientes comandos.

Para la versión de Chrome en Alpine Linux:

docker pull lwthiker/curl-impersonate:0.5-chrome

Para la versión de Firefox en Alpine Linux:

docker pull lwthiker/curl-impersonate:0.5-ff

Para la versión de Chrome en Debian:

docker pull lwthiker/curl-impersonate:0.5-chrome-slim-buster

Para la versión de Firefox en Debian:

docker pull lwthiker/curl-impersonate:0.5-ff-slim-buster

Una vez descargado, como verás, puedes ejecutar curl-impersonate usando un comando docker run.

Instalación desde paquetes de distribución

En Arch Linux, curl-impersonate está disponible a través del paquete AUR curl-impersonate-bin.

En macOS, puedes instalar el paquete Homebrew no oficial para la versión de Chrome con los siguientes comandos:

brew tap shakacode/brew

brew install curl-impersonate

Uso básico

Independientemente del método de instalación, ahora puedes ejecutar un comando curl-impersonate con esta sintaxis:

curl-impersonate-wrapper [options] [target-url]

O, de manera equivalente, en Docker, ejecuta algo como:

docker run --rm lwthiker/curl-impersonate:[curl-impersonate-version]curl-impersonate-wrapper [options] [target_url]

Dónde:

  • curl-impersonate-wrapper es el envoltorio cURL Impersonate que quieres usar (p. ej., curl_chrome116, curl_edge101, curl_ff117, curl_safari15_5, etc.).
  • options son las banderas opcionales que se pasarán a cURL. 
  • target-url es la URL de la página web a la que se va a realizar una solicitud HTTP.

Tenga cuidado al especificar opciones personalizadas, ya que algunos indicadores alteran la firma TLS de cURL, lo que puede hacer que sea detectable. Para obtener más información, consulta nuestra introducción a CURL.

Ten en cuenta que los contenedores configuran automáticamente una colección predeterminada de encabezados HTTP. Para personalizar estos encabezados, modifica los scripts del contenedor para adaptarlos a tus necesidades.

Ahora, usemos curl-impersonate para hacer una solicitud a la página principal de Wikipedia con un contenedor de Chrome:

curl_chrome110 https://www.wikipedia.org

O, si eres usuario de Docker:

docker run --rm lwthiker/curl-impersonate:0.5-chrome curl_chrome110 https://www.wikipedia.org

El resultado será:

<html lang="en" class="no-js">

  <head>

    <meta charset="utf-8">

    <title>Wikipedia</title>

    <meta name="description" content="Wikipedia is a free online encyclopedia, created and edited by volunteers around the world and hosted by the Wikimedia Foundation.">

<!-- omitted for brevity... -->

¡Genial! El servidor devolvió el HTML de la página deseada como si estuvieras accediendo a ella a través de un navegador.

Ahora puedes utilizar cURL Impersonate para raspado web tal y como usarías cURL para raspado web.

curl-impersonate: tutorial de Python

El uso de la línea de comandos es excelente para realizar pruebas, pero los procesos de raspado web suelen basarse en scripts personalizados escritos en lenguajes como Python. ¡Descubre los mejores lenguajes de programación para el raspado web!

Afortunadamente, puedes usar cURL Impersonate en Python gracias a curl-cffi. Este es un enlace de Python para curl-impersonate a través de cffi. En particular, curl-cffi puede suplantar las huellas digitales TLS/JA3 y HTTP/2 de los navegadores para conectarse a páginas web sin ser bloqueado.

¡Descubre cómo usarlo en la sección paso a paso que aparece a continuación!

Requisitos previos

Antes de empezar, asegúrate de tener:

  • Python 3.8+ instalado en tu máquina
  • Un proyecto de Python con un entorno virtual configurado

Opcionalmente, se recomienda un IDE de Python como Visual Studio Code con la extensión Python .

Instalación

Instala curl_cfii mediante pip de la siguiente manera:

pip install curl_cfii

Uso

curl_cffi proporciona una API curl de bajo nivel y una API similar a las solicitudes de alto nivel. Más información en la documentación oficial.

Por lo general, querrás usar una API similar a las solicitudes. Para ello, importa requests de curl_cffi:

from curl_cffi import requests

Ahora puedes usar la versión Chrome de cURL Impersonate en Python para conectarte a una página web con:

response = requests.get("https://www.wikipedia.org", impersonate="chrome")

Print the response HTML with:

print(response.text)

Put it all together, and you will get:

from curl_cffi import requests

# make a GET request to the target page with

# the Chrome version of curl-impersonate

response = requests.get("https://www.wikipedia.org", impersonate="chrome")

# print the server response

print(response.text)

Run the above Python script, and it will print:

<html lang="en" class="no-js">

  <head>

    <meta charset="utf-8">

    <title>Wikipedia</title>

    <meta name="description" content="Wikipedia is a free online encyclopedia, created and edited by volunteers around the world and hosted by the Wikimedia Foundation.">

<!-- omitted for brevity... -->

¡Genial! Ahora estás listo para realizar el raspado web en Python, tal como lo harías con Requests y Beautiful Soup. Para obtener más información, sigue nuestra guía sobre web scraping con Python.

Uso avanzado de cURL Impersonate

¡Es hora de explorar algunos usos y técnicas avanzadas!

Integración de proxy

Simular las huellas digitales del navegador puede no ser suficiente. Es posible que las soluciones antibots sigan bloqueándote, especialmente si realizas demasiadas solicitudes automatizadas en poco tiempo. ¡Aquí es donde entran en juego los proxies!

Enrutando tu petición a través de un servidor proxy, puedes obtener una nueva dirección IP y proteger tu identidad.

Supongamos que la URL de tu servidor proxy es:

http://84.18.12.16:8888

cURL Impersonate admite la integración de proxy a través de la línea de comandos mediante el indicador -x:

curl-impersonate -x http://84.18.12.16:8888 https://httpbin.org/ip

Para obtener más información, lee cómo configurar un proxy en cURL.

https://www.youtube.com/watch?v=oadUjiVxDFY &

En Python, puedes configurar un proxy de forma similar a como lo harías con solicitudes:

from curl_cffi import requests

proxies = {"http": "http://84.18.12.16:8888", "https": "http://84.18.12.16:8888"}

response = requests.get("https://httpbin.org/ip", impersonate="chrome", proxies=proxies)

Para obtener información adicional, consulta cómo integrar un proxy con las solicitudes de Python.

Integración con Libcurl

libcurl-impersonate es una versión compilada de libcurl que incluye las mismas funciones de cURL Impersonate. También ofrece una API extendida para ajustar los detalles de TLS y las configuraciones de los encabezados.

libcurl-impersonate se puede instalar usando el paquete precompilado . Su objetivo es facilitar la integración de cURL Impersonate en bibliotecas de varios lenguajes de programación, como el paquete Python curl-cffi.

Conclusión

En este artículo, has aprendido qué es cURL Impersonate, cómo funciona y cómo usarlo tanto a través de CLI como en Python. Ahora entiendes que es una herramienta para hacer peticiones HTTP simulando la huella TLS de los navegadores del mundo real.

El problema es que las soluciones antibots avanzadas, como Cloudflare, pueden seguir detectando que tus solicitudes provienen de un bot. ¿Cuál es la solución? API Scraper de Bright Data: una solución de raspado integral, todo en uno y de próxima generación.

La API Scraper proporciona todo lo que necesitas para realizar solicitudes web automatizadas mediante cURL o cualquier otro cliente HTTP. Esta solución completa gestiona la huella digital del navegador, la resolución de CAPTCHA y la rotación de IP para que puedas eludir cualquier tecnología antibot. ¡Realizar solicitudes HTTP automatizadas nunca ha sido tan fácil!

Regístrate ahora para obtener una prueba gratuita de la infraestructura de raspado web de Bright Data o habla con uno de nuestros expertos en datos sobre nuestras soluciones de raspado.

No se requiere tarjeta de crédito