Volver al blog

niquests Web Scraping: Solicitudes HTTP/2 modernas para Python

Alex Johnson
Alex Johnson

Senior Web Scraping Engineer

23-Jul-2026

Resumen:

  • niquests es un reemplazo directo para requests con la misma API más HTTP/2, HTTP/3 y multiplexión de conexiones: cambia la importación y tu código sigue funcionando.
  • Lo que niquests no hace es renderizar JavaScript. Es un cliente HTTP; en una página construida con scripts, devuelve el marcado que el servidor envió, el cual no contiene ninguno de los contenidos.
  • La brecha se muestra en un script. niquests obtiene una página de demostración renderizada por JavaScript sobre HTTP/2 y encuentra 0 bloques de citas en ella.
  • niquests es también el cliente que llama a Scrapeless. Una ejecución en vivo utilizó la misma sesión para POSTear la URL a la API de Scraping Universal de Scrapeless, obtuvo el HTML renderizado y extrajo todos los 10 autores de este.
  • Un cliente HTTP para ambos trabajos. Fetch directos donde funcionan, la API de Scrapeless donde se necesita renderizar — misma Session, misma API.
  • Gratis para empezar en el lado de obtención. Crea tu clave de API de Scrapeless en app.scrapeless.com.

Qué es niquests, y qué no es

niquests es un fork de requests que mantiene la API que ya conoces — Session, get, post, json() — y agrega las características de transporte que requests nunca tuvo: HTTP/2 y HTTP/3, multiplexión de conexiones y DNS sobre HTTPS. Para un scraper, la ventaja práctica es que import niquests as requests actualiza una base de código existente a HTTP moderno sin necesidad de reescribir, y el transporte multiplexado mueve muchas solicitudes a través de menos conexiones.

Lo que no es, es un navegador. niquests habla HTTP, por lo que devuelve exactamente lo que el servidor envía; no ejecuta el JavaScript que construye el contenido de una página moderna. Un transporte más rápido y moderno no cambia eso: una página vacía obtenida a través de HTTP/2 sigue estando vacía. Entonces, un scraper de niquests es dos trabajos para un cliente: obtener las páginas que sirven su contenido directamente, y para las páginas que lo construyen con scripts, llamar a una API de renderizado. Esta guía utiliza la API de Scraping Universal de Scrapeless para el segundo trabajo, con niquests realizando esa llamada. Para el kit de herramientas más amplio, el tutorial de scraping web en Python es el complemento.

Instalación

niquests es toda la cadena de herramientas — no necesita un analizador separado para esta guía. La versión contra la cual se escribió esta guía es niquests 3.20.1:

bash Copy
pip install "niquests==3.20.1"

Mantén tu clave en el entorno, nunca en el código fuente:

bash Copy
export SCRAPELESS_API_KEY="sk_your_scrapeless_key"

La obtención directa, y dónde se detiene

Apunta niquests a una página renderizada por JavaScript y dos cosas son ciertas al mismo tiempo: el transporte es moderno y el contenido está ausente. La conexión negocia HTTP/2 — un protocolo definido por el estándar HTTP/2 que requests no habla — sin embargo, el marcado devuelto tiene cero bloques de cita, porque el contenido se construye del lado del cliente según la especificación de scripting de HTML:

python Copy
# direct.py — transporte moderno, contenido ausente
import niquests

session = niquests.Session()
resp = session.get("https://quotes.toscrape.com/js/", timeout=30)

print("versión http:", resp.conn_info.http_version)
print("bloques de cita en la página js:", resp.text.count('class="quote"'))

El transporte es HTTP/2; el contenido no está ahí:

text Copy
versión http: HttpVersion.h2
bloques de cita en la página js: 0

Ese cero no es un fallo de niquests — es el resultado correcto para un cliente HTTP en una página cuyo contenido llega después de que se ejecutan los scripts. La solución es una capa de obtención que renderice.

La obtención renderizada, con niquests llamando a Scrapeless

Mantén la misma sesión y cambia el objetivo: en lugar de la página, POSTea su URL a la API de Scraping Universal de Scrapeless, que renderiza del lado del servidor y devuelve el HTML terminado. niquests maneja esta solicitud como cualquier otra, así que un cliente cubre ambos caminos: la capa de solicitud y respuesta aquí sigue el estándar de semántica HTTP:

python Copy
# rendered.py — niquests llama a la API de renderizado, luego extrae
import os
import re

import niquests

session = niquests.Session()
resp = session.post(
    "https://api.scrapeless.com/api/v2/unlocker/request",
    headers={"x-api-token": os.environ["SCRAPELESS_API_KEY"]},
    json={"actor": "unlocker.webunlocker", "input": {"url": "https://quotes.toscrape.com/js/", "js_render": True}},
    timeout=120,
)
resp.raise_for_status()
html = resp.json()["data"]

authors = re.findall(r'<small class="author">(.*?)</small>', html)
print("bloques de cita renderizados:", html.count('class="quote"'))
print("autores extraídos:", len(authors))
print("primer autor:", authors[0])

Ahora el contenido está presente y es extraíble:

text Copy
bloques de cita renderizados: 10
autores extraídos: 10

primer autor: Albert Einstein

Copy
Ese es todo el scraper, y nunca dejó niquests: una `Session` que realiza una solicitud directa donde eso funciona y una solicitud de Scrapeless donde se necesita renderizado. La [API de Rasgado Universal](https://www.scrapeless.com/es/product/universal-scraping-api?utm_source=website&utm_medium=blog&utm_campaign=universalscrapingapi&utm_term=niquests-web-scraping) se encarga del renderizado; niquests hace el HTTP.

> Obtén tu clave de API en el plan gratuito: [app.scrapeless.com](https://app.scrapeless.com/passport/login?utm_source=website&utm_medium=blog&utm_campaign=universalscrapingapi&utm_term=niquests-web-scraping)

## Patrones avanzados

- **Migra con una línea.** `import niquests as requests` permite a una base de código existente de `requests` adoptar HTTP/2 y multiplexión sin ningún otro cambio; la API es la misma.
- **Reutiliza la sesión.** Una única `niquests.Session()` agrupa y multiplica conexiones, donde la ventaja de transporte se muestra a través de muchas solicitudes: constrúyela una vez y pásala.
- **Agrega un verdadero analizador cuando superes las expresiones regulares.** La expresión regular aquí mantiene el ejemplo en una sola dependencia; para cualquier cosa más allá de una lista plana, alimenta `resp.json()["data"]` a una biblioteca de selectores y selecciona campos estructurados.
- **Deja que negocie.** niquests elige HTTP/2 o HTTP/3 cuando el servidor lo ofrece y retrocede correctamente cuando no lo hace; no configuras la versión, la lees de `conn_info` cuando quieres confirmarlo.

## Solución de problemas

- **`conn_info.http_version` es HTTP/1.1.** El servidor no ofreció HTTP/2 para esa solicitud, o un intermediario lo degradó. Esto es normal y no un error; niquests utiliza la mejor versión disponible.
- **Cero bloques de una página que puedes ver en un navegador.** El contenido se renderiza con JavaScript y la obtención directa devolvió HTML pre-renderizado: el caso de `js-page quote blocks: 0`. Ruta esa URL a través de la llamada Scrapeless con `js_render` en su lugar.
- **`json()` genera una excepción en la respuesta de Scrapeless.** La solicitud falló antes del renderizado. Llama primero a `raise_for_status()`, y confirma que la clave está configurada y que el actor y la entrada están estructurados como se muestra.
- **Tiempos de espera en páginas lentas.** El renderizado toma más tiempo que una obtención estática. Da al POST de Scrapeless un `timeout` generoso, como lo hace el ejemplo, en lugar del corto predeterminado que usarías para una solicitud directa.

## Conclusión

niquests se gana su lugar como el único cliente HTTP que necesita un scraper: la API de `requests` con transporte moderno, manejando tanto la obtención directa como la llamada a una API de renderizado. La capa que convierte una página construida con script en contenido es la obtención: el resultado de cero bloques de la solicitud directa lo establece — y un POST de Scrapeless, hecho por niquests mismo, cierra la brecha. Conecta los dos caminos en una sola sesión y los diez autores de la página de demostración vuelven a través de HTTP que no tuviste que reescribir.

[Crea una cuenta gratuita en Scrapeless](https://app.scrapeless.com/passport/login?utm_source=website&utm_medium=blog&utm_campaign=universalscrapingapi&utm_term=niquests-web-scraping) para obtener una clave de API, y la [documentación para desarrolladores](https://docs.scrapeless.com?utm_source=website&utm_medium=blog&utm_campaign=universalscrapingapi&utm_term=niquests-web-scraping) cubre los parámetros `unlocker.webunlocker`. Consulta [los precios de Scrapeless](https://www.scrapeless.com/es/pricing?utm_source=website&utm_medium=blog&utm_campaign=universalscrapingapi&utm_term=niquests-web-scraping) cuando planees un trabajo recurrente.

## FAQ

**P: ¿Puede niquests rasgar páginas renderizadas por JavaScript por sí mismo?**

No. niquests es un cliente HTTP, no un navegador; devuelve el marcado que envía el servidor y no ejecuta scripts. En una página que construye su contenido del lado del cliente, la obtención directa vuelve sin el contenido: el resultado de cero bloques de la guía. Rutea esas páginas a través de la API Universal de Rasgado Scrapeless, que las renderiza, y niquests también hace esa llamada.

**P: ¿Cómo es niquests diferente de requests?**

La misma API, transporte más nuevo. niquests es un fork de `requests` que agrega HTTP/2, HTTP/3, multiplexión de conexiones y DNS sobre HTTPS, manteniendo `Session`, `get`, `post` y `json()` idénticos. `import niquests as requests` suele ser toda la migración.

**P: ¿Necesito un analizador separado?**

Para una lista plana de campos, una expresión regular o la biblioteca estándar es suficiente, como se mostró. Para extracción anidada o estructurada, empareja niquests con una biblioteca de selectores: niquests obtiene, el analizador selecciona. Esta guía se mantiene a una dependencia a propósito.

**P: ¿Ayuda HTTP/2 con el bloqueo de rasgado?**

Es una actualización de transporte, no una medida anti-bloqueo. La multiplexión HTTP/2 mejora el rendimiento a través de muchas solicitudes, pero no renderiza JavaScript ni elimina desafíos de acceso, ese es el trabajo de la capa de obtención, que es por eso que el camino renderizado pasa por Scrapeless.

**P: ¿Es legal rasgar con niquests?**
El cliente HTTP no cambia las reglas de recopilación. Solo recopile páginas públicas, respete los términos del sitio y las directrices de robots estandarizadas por <a href="https://datatracker.ietf.org/doc/html/rfc9309" rel="nofollow"><strong>el Protocolo de Exclusión de Robots</strong></a>, mantenga los volúmenes limitados y maneje cualquier dato personal según las leyes que le correspondan.

En Scrapeless, solo accedemos a datos disponibles públicamente y cumplimos estrictamente con las leyes, regulaciones y políticas de privacidad del sitio web aplicables. El contenido de este blog es sólo para fines de demostración y no implica ninguna actividad ilegal o infractora. No ofrecemos garantías y renunciamos a toda responsabilidad por el uso de la información de este blog o enlaces de terceros. Antes de realizar cualquier actividad de scraping, consulte a su asesor legal y revise los términos de servicio del sitio web de destino u obtenga los permisos necesarios.

Artículos más populares

Catalogar