Guía general de web scraping 11 min de lectura

Bibliotecas para web scraping

Catálogo de bibliotecas de scraping para Python, JavaScript, PHP, Java, C# y Go: qué elegir para páginas estáticas, contenido dinámico y APIs.

EW
Equipo Web-Scraping.es
Recopilación de datos para las necesidades del negocio
Publicado: 31 enero 2025

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 Async + HTTP/2
curl_cffi Python Cliente HTTP No 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 Esperas automáticas, multinavegador
Selenium varios lenguajes Navegador Parcial Veterano, comunidad enorme
Scrapy Python Framework No* El estándar del crawling a gran escala
cheerio JS / Node Parser --- --- Análisis jQuery rápido de estáticos
Puppeteer JS / Node Navegador Control nativo de Chrome
Playwright JS / Node Navegador Multinavegador, API limpia
Crawlee JS / Node Framework Conmutación automática HTTP/navegador
Guzzle PHP Cliente HTTP No Estándar de facto en PHP
Symfony DomCrawler PHP Parser --- --- Selectores CSS y XPath
Symfony Panther PHP Navegador No Navegador real para PHP
Roach PHP PHP Framework No* El equivalente de Scrapy en PHP
Colly Go Framework No Crawling concurrente veloz
goquery Go Parser --- --- Sintaxis jQuery
chromedp Go Navegador El estándar para dinámicos en Go
Rod Go Navegador API moderna
libcurl C / C++ Cliente HTTP No 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 Puppeteer para .NET
Jsoup Java Parser --- --- El parser principal de Java
HtmlUnit Java Navegador Parcial Navegador headless en Java puro
WebMagic Java Framework No Estilo Scrapy para Java
Nokogiri Ruby Parser --- --- El estándar de parseo en Ruby
Ferrum Ruby Navegador Control de Chrome vía CDP
Kimurai Ruby Framework Estilo Scrapy para Ruby
reqwest Rust Cliente HTTP No El cliente async principal
scraper Rust Parser --- --- Selectores CSS
thirtyfour Rust Navegador Control vía WebDriver
spider Rust Framework 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.