En otro artículo analizamos en qué lenguaje escribir un scraper y comparamos los lenguajes entre sí. Aquí bajamos al siguiente nivel de detalle: un catálogo de bibliotecas concretas. Si el lenguaje ya está decidido, solo queda escoger las herramientas, y este es su panorama, organizado por lenguajes y roles, con enlaces a los sitios oficiales.
Cuatro roles de bibliotecas
Antes de enumerar paquetes concretos conviene entender que casi cualquier scraper se monta con herramientas de cuatro tipos. Y a menudo una biblioteca no se usa sola, sino en tándem: por ejemplo, el cliente HTTP descarga el HTML y el parser lo analiza.
- Clientes HTTP. Envían peticiones y reciben la respuesta (HTML, JSON). Rápidos y ligeros, pero no ejecutan JavaScript: solo ven lo que devuelve el servidor. Sirven para páginas estáticas y para llamar directamente a la API del sitio.
- Parsers de HTML/XML. Convierten la cadena de HTML en un árbol en el que se pueden buscar datos con selectores CSS o XPath. Por sí mismos no descargan nada: reciben como entrada un HTML ya obtenido.
- Automatización de navegador (headless). Arrancan un navegador real (normalmente Chromium), ejecutan JavaScript y saben hacer clic, desplazarse, rellenar formularios y esperar a que aparezcan elementos. Imprescindibles para las SPA y el contenido dinámico, aunque pesados en recursos.
- Frameworks integrales. Se hacen cargo de todo el pipeline: cola de peticiones, concurrencia, reintentos, procesamiento y almacenamiento de los datos (pipelines). Pensados para tareas masivas y recurrentes, donde no importa una página, sino miles.
A continuación, las bibliotecas por lenguaje, agrupadas internamente según estos roles.
Python
Clientes HTTP: requests — el clásico, síncrono y sencillo; httpx — el sustituto moderno con soporte de async y HTTP/2; aiohttp — cliente asíncrono para cargas altas; curl_cffi — imita la huella TLS de un Chrome real y ayuda a superar la protección anti-bots básica sin navegador.
Parsers: BeautifulSoup — el más amable para quien empieza; lxml — rápido, escrito en C, con soporte de XPath; parsel — el motor de selectores del ecosistema de Scrapy; selectolax — el más veloz con grandes volúmenes; pyquery — sintaxis al estilo jQuery.
Automatización de navegador: Playwright — la elección moderna por defecto (async, esperas automáticas); Selenium — el veterano, con una comunidad enorme; SeleniumBase — una capa sobre Selenium con modo de camuflaje; nodriver — herramienta stealth del autor de undetected-chromedriver (este último ha quedado bastante desfasado y supera peor las protecciones modernas).
Frameworks: Scrapy — el estándar maduro para el crawling a gran escala con pipelines; Crawlee for Python — un híbrido que alterna entre HTTP y navegador; MechanicalSoup — trabajo ligero con formularios y sesiones; Scrapling — un scraper adaptativo reciente, resistente a los cambios de maquetación.
JavaScript / Node.js
Clientes HTTP: el fetch nativo; axios — el cliente más popular, con una API cómoda; got — ligero y rápido; undici — cliente de alto rendimiento del equipo de Node.js.
Parsers: cheerio — análisis rápido de HTML estático al estilo jQuery; jsdom — emulación completa del DOM (más pesada que cheerio); parse5 y htmlparser2 — parsers de bajo nivel sobre los que se construyen otras herramientas.
Automatización de navegador: Puppeteer — control de Chrome/Chromium; Playwright — lo mismo, con soporte multinavegador y una API limpia; puppeteer-extra — plugins, incluido stealth para camuflarse.
Frameworks: Crawlee — el potente framework de Apify, con colas, proxies y conmutación automática HTTP/navegador; node-crawler — un crawler clásico con pool de peticiones.
PHP
Clientes HTTP: Guzzle — el estándar de facto, compatible con PSR; Symfony HttpClient — cliente moderno del ecosistema Symfony; el cURL nativo.
Parsers: Symfony DomCrawler — análisis con selectores CSS y XPath; DiDOM — rápido y simple; Simple HTML DOM — el umbral de entrada más bajo, digiere HTML «roto».
Navegación y navegador: Symfony BrowserKit (clase HttpBrowser) — emulación de navegador en PHP puro que sigue enlaces y envía formularios, pero no ejecuta JS (aquí migró también el veterano Goutte); Symfony Panther y php-webdriver — control de un Chrome/Firefox real para contenido dinámico; chrome-php — control directo de Chrome.
Frameworks: Roach PHP — un equivalente completo de Scrapy para PHP, con pipelines y middleware; crwlr — framework de «pasos» listos que se combinan en crawlers.
Go (Golang)
Clientes HTTP: net/http — la potente biblioteca estándar; resty — un wrapper cómodo con una API lacónica.
Parsers: goquery — análisis al estilo jQuery (selectores CSS); htmlquery — consultas por XPath.
Automatización de navegador: chromedp — el estándar del sector, control de Chrome vía DevTools Protocol; Rod — una alternativa moderna con una API cómoda; playwright-go — el port de Playwright.
Frameworks: Colly — framework rápido y concurrente para contenido estático; Geziyor — framework con soporte de renderizado JS; Ferret — extracción de datos mediante un lenguaje de consultas declarativo propio.
C / C++
En este nicho casi no hay frameworks de alto nivel: la pareja «cliente HTTP + parser» se monta a mano, en busca de la máxima velocidad y el mínimo consumo de memoria.
Clientes HTTP: libcurl — la biblioteca fundamental sobre la que se sostienen los clientes de la mayoría de lenguajes; CPR — un wrapper moderno de C++ sobre libcurl, al estilo de requests de Python.
Parsers: libxml2 — parser maduro de HTML/XML; Gumbo — parser HTML5 de Google; lexbor — un motor HTML/CSS moderno y veloz; pugixml — parser XML ligero para sitemaps y RSS.
No hay ejecución de JavaScript de serie: cuando hace falta, se integra un motor de navegador embebido o un headless externo.
C# / .NET
Clientes HTTP: HttpClient — el cliente de serie de .NET; RestSharp — un wrapper cómodo para peticiones REST.
Parsers: HtmlAgilityPack — el más popular, tolera HTML «roto» y soporta XPath; AngleSharp — conforme a los estándares del W3C, con querySelector como en el navegador; Fizzler — motor de selectores CSS sobre HtmlAgilityPack.
Automatización de navegador: PuppeteerSharp — el port de Puppeteer; Playwright for .NET — el port oficial de Playwright; Selenium WebDriver.
Frameworks: DotnetSpider — framework en la línea de Scrapy; Abot — un crawler configurable.
Java
Clientes HTTP: Apache HttpClient — el estándar maduro; OkHttp — un cliente moderno y rápido.
Parsers: Jsoup — la herramienta principal para analizar HTML en Java, con selectores CSS muy cómodos.
Automatización de navegador: HtmlUnit — navegador headless escrito en el propio Java, con soporte parcial de JS; Selenium y Playwright for Java — control de un navegador real.
Frameworks: WebMagic — framework al estilo Scrapy; Crawler4j — un crawler simple y rápido.
Ruby
Clientes HTTP: Faraday — cliente flexible con middleware; HTTParty — lacónico y sencillo.
Parsers: Nokogiri — el estándar para analizar HTML/XML en Ruby (CSS y XPath).
Automatización de navegador: Ferrum — control de Chrome vía CDP; Watir y Selenium — navegador real.
Navegación y frameworks: Mechanize — sigue enlaces y trabaja con formularios (sin JS); Kimurai — framework en la línea de Scrapy, con soporte de motores headless.
Rust
Clientes HTTP: reqwest — el cliente async principal; ureq — síncrono y simple.
Parsers: scraper — selectores CSS, en espíritu similar a BeautifulSoup/Cheerio; select — un parser de selectores alternativo.
Automatización de navegador: fantoccini y thirtyfour — control del navegador vía WebDriver; headless_chrome y chromiumoxide — trabajo con Chrome vía DevTools Protocol.
Frameworks: spider — un crawler concurrente de alto rendimiento.
Tabla comparativa de bibliotecas
| Biblioteca | Lenguaje | Tipo | Ejecuta JS | Async / concurrencia | Qué la distingue |
|---|---|---|---|---|---|
| requests | Python | Cliente HTTP | No | No | El referente de la sencillez |
| httpx | Python | Cliente HTTP | No | Sí | Async + HTTP/2 |
| curl_cffi | Python | Cliente HTTP | No | Sí | Suplantación de la huella TLS |
| BeautifulSoup | Python | Parser | --- | --- | Umbral de entrada bajo |
| selectolax | Python | Parser | --- | --- | El más rápido con grandes volúmenes |
| Playwright | Python | Navegador | Sí | Sí | Esperas automáticas, multinavegador |
| Selenium | varios lenguajes | Navegador | Sí | Parcial | Veterano, comunidad enorme |
| Scrapy | Python | Framework | No* | Sí | El estándar del crawling a gran escala |
| cheerio | JS / Node | Parser | --- | --- | Análisis jQuery rápido de estáticos |
| Puppeteer | JS / Node | Navegador | Sí | Sí | Control nativo de Chrome |
| Playwright | JS / Node | Navegador | Sí | Sí | Multinavegador, API limpia |
| Crawlee | JS / Node | Framework | Sí | Sí | Conmutación automática HTTP/navegador |
| Guzzle | PHP | Cliente HTTP | No | Sí | Estándar de facto en PHP |
| Symfony DomCrawler | PHP | Parser | --- | --- | Selectores CSS y XPath |
| Symfony Panther | PHP | Navegador | Sí | No | Navegador real para PHP |
| Roach PHP | PHP | Framework | No* | Sí | El equivalente de Scrapy en PHP |
| Colly | Go | Framework | No | Sí | Crawling concurrente veloz |
| goquery | Go | Parser | --- | --- | Sintaxis jQuery |
| chromedp | Go | Navegador | Sí | Sí | El estándar para dinámicos en Go |
| Rod | Go | Navegador | Sí | Sí | API moderna |
| libcurl | C / C++ | Cliente HTTP | No | Sí | El cimiento de todos los lenguajes |
| lexbor | C / C++ | Parser | --- | --- | Motor HTML/CSS veloz |
| HtmlAgilityPack | C# | Parser | --- | --- | Tolera HTML «roto» |
| AngleSharp | C# | Parser | --- | --- | Conforme al W3C, querySelector |
| PuppeteerSharp | C# | Navegador | Sí | Sí | Puppeteer para .NET |
| Jsoup | Java | Parser | --- | --- | El parser principal de Java |
| HtmlUnit | Java | Navegador | Parcial | Sí | Navegador headless en Java puro |
| WebMagic | Java | Framework | No | Sí | Estilo Scrapy para Java |
| Nokogiri | Ruby | Parser | --- | --- | El estándar de parseo en Ruby |
| Ferrum | Ruby | Navegador | Sí | Sí | Control de Chrome vía CDP |
| Kimurai | Ruby | Framework | Sí | Sí | Estilo Scrapy para Ruby |
| reqwest | Rust | Cliente HTTP | No | Sí | El cliente async principal |
| scraper | Rust | Parser | --- | --- | Selectores CSS |
| thirtyfour | Rust | Navegador | Sí | Sí | Control vía WebDriver |
| spider | Rust | Framework | Sí | Sí | Alto rendimiento |
* Los frameworks Scrapy y Roach PHP, por sí solos, trabajan únicamente con HTML estático, pero el renderizado JS se conecta como plugin (Scrapy, mediante scrapy-playwright; Roach, mediante Browsershot). El signo «---» en una columna significa que el criterio no aplica a ese tipo de bibliotecas.
Cómo montar un stack que funcione
La lógica corta para elegir herramientas según la tarea:
- Página estática o petición directa a la API — bastan un cliente HTTP y un parser: por ejemplo, requests + BeautifulSoup, Guzzle + DomCrawler, net/http + goquery.
- El contenido se carga por JavaScript, hacen falta clics y scroll — recurra a la automatización de navegador: Playwright, Puppeteer, chromedp.
- Miles de páginas, ejecución regular, procesamiento y almacenamiento de datos — necesita un framework: Scrapy, Crawlee, Colly, Roach PHP.
- El sitio bloquea bots de forma activa — añada una capa aparte: suplantación de la huella TLS (curl_cffi), modos stealth (nodriver, puppeteer-extra), proxies. Funciona por encima de cualquiera de las bibliotecas anteriores y no depende del lenguaje elegido.
En próximos materiales analizaremos bibliotecas concretas con ejemplos prácticos: recogida de datos, paginación y manejo de bloqueos.