Scraping

¿Cuándo necesitas de verdad un navegador headless para hacer scraping?

Un navegador headless es la forma más cara de obtener una página. La mayoría de los sitios no lo necesitan. Aquí está cómo decidir entre HTTP simple y un navegador completo.

Chris Collins

Chris Collins

20 de agosto de 2026 · 8 min de lectura

El reflejo, cuando arranca un trabajo de scraping, es echar mano de un navegador headless. Playwright, Puppeteer o Selenium pueden cargar cualquier cosa que un navegador real cargue, así que se siente como el valor por defecto seguro. Pero un navegador headless es la forma más cara que existe de obtener una página. Quema CPU y memoria, se descarga la página entera y cada activo adjunto a ella, y es lento, lo que limita cuántas páginas puedes recopilar por worker. Muchas veces estás pagando todo eso para extraer unos pocos campos que estuvieron en texto plano todo el tiempo. La pregunta real nunca es “navegador o no” como hábito, es qué requiere de verdad la página específica. Aquí está cómo decidir.

Qué te da realmente un navegador headless

Un navegador headless es un motor de navegador real sin ventana visible. Corre el JavaScript de la página, construye el DOM, ejecuta las llamadas fetch y XHR de fondo que hacen las páginas modernas, renderiza contenido del lado del cliente, y te deja interactuar con el resultado haciendo clic, scrolleando y escribiendo. También presenta una huella de navegador y un handshake TLS completos y realistas, porque genuinamente es un navegador. Eso es mucha capacidad. La trampa es que cada parte de ello cuesta algo, y la mayoría de las páginas no necesitan la mayor parte de ello.

Cuándo basta con HTTP simple, que es más a menudo de lo que crees

Antes de automatizar un navegador, mira de qué está hecha realmente la página. En una buena parte de los casos, un cliente HTTP simple como requests o httpx de Python es todo lo que necesitas.

El primer caso es HTML renderizado en el servidor. Si el dato que quieres está presente en la respuesta HTML inicial, mira el código fuente de la página o haz curl a la URL y lo verás ahí mismo, entonces un navegador no añade nada más que sobrecarga. El segundo, y el que la gente más se salta, es una API JSON subyacente. Las páginas modernas muy a menudo renderizan desde un endpoint de backend que la página misma llama, y si abres el panel de red y observas las solicitudes XHR, con frecuencia encontrarás una respuesta JSON limpia con exactamente el dato que quieres, sin parseo de HTML requerido. Llamar a ese endpoint directamente con HTTP es más rápido, más estable, y más fácil de parsear que renderizar la página que lo consume. El tercer caso son las páginas estáticas o ligeramente dinámicas donde nada importante depende del scripting del lado del cliente.

Este camino no solo es más simple, es dramáticamente más barato. Una solicitud HTTP trae los bytes que pediste y nada más, así que es rápida, paraleliza bien, y mueve una fracción de los datos a través de tus proxies. Ese último punto importa directamente al coste: los patrones generales de cliente están en la guía de usar proxies residenciales con Python, y mantenerse en el camino HTTP es una de las mayores palancas para recortar el ancho de banda de proxy y mantener baja la latencia.

Cuándo necesitas de verdad un navegador

Algunas páginas realmente requieren uno, y forzar HTTP contra ellas es su propia pérdida de tiempo. Echa mano de un navegador headless cuando el dato solo existe después de que corre el JavaScript, una single-page app que renderiza su contenido del lado del cliente sin una API accesible detrás. Echa mano de uno cuando el dato se ensambla a través de interacción, el scroll infinito y la paginación con carga lazy que solo traen más a medida que scrolleas o clicas. Echa mano de uno cuando un login o flujo multipaso depende del scripting del lado del cliente para establecer una sesión usable. Y echa mano de uno cuando un sitio comprueba activamente un contexto de navegador real, ejecutando desafíos de JavaScript o inspeccionando señales solo de navegador que un cliente HTTP pelado no puede satisfacer. En estos casos el navegador no es sobrecarga, es la única herramienta que consigue el dato.

El coste del camino del navegador, dicho sin rodeos

Cuando de verdad usas un navegador, sabe qué estás gastando. El mayor coste oculto es el ancho de banda. Un navegador carga la página entera como lo haría la de una persona, el HTML más cada imagen, hoja de estilos, fuente, tracker, y script de terceros, lo que puede ser muchas veces el tamaño del único documento HTML o blob JSON que en realidad querías. Cada uno de esos bytes viaja a través de tu proxy. La solución es bloquear los tipos de recurso que no necesitas, imágenes, media, fuentes, y analítica, para que el navegador renderice lo suficiente para producir tu dato sin descargar la página entera, lo que puede recortar sustancialmente el ancho de banda de proxy en el camino del navegador. El segundo coste es la velocidad: el renderizado es lento, así que un worker de navegador recopila muchas menos páginas por minuto que un worker HTTP, y los navegadores son voraces de memoria, así que escalar una flota de ellos es infraestructura más pesada que disparar solicitudes HTTP. El tercer coste es una sorpresa para muchos equipos, que es que un navegador headless no es automáticamente más sigiloso. De fábrica carga sus propias pistas detectables, así que un montaje headless ingenuo puede ser más fácil de marcar que una solicitud HTTP bien formada, no más difícil.

El camino intermedio que la mayoría se salta

Una gran cantidad de situaciones de “necesito un navegador” son en realidad “necesito una solicitud que parezca real”. Antes de escalar al renderizado completo, prueba HTTP simple con una huella correcta y consistente: cabeceras completas y coherentes, manejo apropiado de cookies, y una huella TLS y HTTP/2 que concuerde, porque una solicitud que lleva un conjunto de huellas con forma de navegador a menudo pasa donde un cliente pelado es bloqueado. Combina eso con la disciplina general de evitar bloqueos, y muchas páginas que parecían exigir un navegador resultan ceder ante una solicitud HTTP bien formada a una fracción del coste. Escala a un navegador solo cuando el dato genuinamente no venga de ninguna otra forma.

Los proxies hacen falta en cualquier caso

Elegir HTTP en vez de un navegador no cambia tu necesidad de una identidad de red limpia, ambos caminos corren a través de IP residenciales para parecer visitantes corrientes. Lo que cambia es cuánto pagas por hacerlo. Un navegador empuja muchas veces más datos a través del proxy por página, así que en ancho de banda residencial medido la herramienta que eliges tiene un efecto directo sobre el coste. Los proxies residenciales y su precio por GB son los mismos por debajo de cualquiera de los dos enfoques, que es exactamente por qué echar mano de la herramienta más ligera cuando funciona vale la disciplina.

Un flujo de decisión corto

Pasa cada objetivo por la misma comprobación rápida antes de escribir una línea de automatización.

  1. ¿Está el dato en el HTML inicial? Usa HTTP.
  2. ¿Llama la página a un endpoint JSON o XHR que devuelve el dato? Llama a ese endpoint con HTTP.
  3. ¿El contenido solo aparece después de que corre el JavaScript, sin API accesible? Usa un navegador headless.
  4. ¿El dato solo carga a través de scroll o clics? Usa un navegador headless.
  5. ¿Estás bloqueado a pesar de tener el camino de dato correcto? Arregla la huella y la IP primero, luego considera un navegador como último recurso.

En la práctica una mirada rápida al código fuente y al panel de red responde las primeras dos antes de que te comprometas a nada, y las primeras dos cubren más sitios de lo que la mayoría espera. Cuando debas renderizar, mantenlo ligero:

# HTTP first: hit the underlying JSON endpoint the page already calls
import requests
PROXY = "http://customer-USERNAME-country-us:PASSWORD@p.shifter.io:443"
proxies = {"http": PROXY, "https": PROXY}
r = requests.get("https://shop.example.com/api/products?page=1",
proxies=proxies, timeout=15)
r.raise_for_status()
data = r.json() # structured data, no rendering, minimal bytes
# Only if rendering is truly required, run a browser through the same
# proxy and block heavy resource types so it does not pull the whole page:
# route.abort() on image / media / font / stylesheet requests
# before reading the rendered content.

En resumen

Un navegador headless es la herramienta correcta para el renderizado del lado del cliente y la interacción genuina, y la herramienta equivocada para todo lo demás, que es la mayor parte de la web. Comprueba si el dato está en el HTML o detrás de un endpoint JSON antes de automatizar nada, prefiere una solicitud HTTP bien formada con una huella real antes que levantar un navegador, y cuando de verdad renderices, bloquea lo que no necesitas para no estar pagando por descargar una página entera por un puñado de campos. Ambos caminos necesitan IP residenciales, pero solo uno de ellos envía una página entera a través del proxy por cada registro. Echa mano del navegador el último, no el primero, y la herramienta más barata que consiga el dato de forma fiable es la que usar.

Esa capa de red es lo que proporcionan los proxies residenciales, un gran pool de IP reales de nivel doméstico que funciona igual tanto si obtienes con HTTP simple como si manejas un navegador completo. El precio por GB es por qué el camino más ligero rinde: mueves solo el dato que de verdad necesitas, a través de tantos objetivos como requiera el trabajo.

¿Listo para empezar?

Prueba los proxies residenciales de Shifter, más de 205M IPs, más de 195 países, desde 0,75 $/GB.

Comenzar