got-scraft
v2.8.0
Published
Módulo de scraping con axios + cheerio. Anti-bloqueo para cualquier web.
Maintainers
Readme
got-scraft
Módulo profesional de scraping con axios + cheerio. Anti-bloqueo integrado para cualquier sitio web.
npm install got-scraftnpm install https://github.com/natsu-dev01/got-scraft.gitconst got = require('got-scraft');About
got-scraft es un módulo de scraping diseñado para extraer datos de cualquier sitio web evitando bloqueos. Todo en uno: HTTP client, parser HTML, anti-detección, y extractores de datos.
Por qué got-scraft
- Anti-bloqueo real: proxies rotativos, rate limiting, cache busting, headers camuflados
- Sin navegador: usa axios + cheerio, más rápido que Puppeteer
- Dual CJS/ESM: funciona con
require()eimport - TypeScript: definiciones de tipos incluidas
- Integridad: verificación SHA256 contra manipulation
- Zero config: funciona out-of-the-box
Capacidades
| Area | Que hace | |------|----------| | HTTP | fetch, fetchWithRetry, post, sesiones con cookies | | HTML | cheerio, meta tags, Open Graph, encoding auto | | Extraccion | links, imágenes, scripts, emails, forms, JSON-LD | | Anti-bloqueo | ProxyRotator, Throttler, cacheBust, isBlocked | | Headers | 12 perfiles de dispositivo, headers rotativos |
Anti-bloqueo
Proxy rotatorio
const got = require('got-scraft');
const rotator = new got.ProxyRotator()
.loadFromFile('./proxies.txt')
.add('127.0.0.1:8080');
// Rotación automática en errores
const html = await got.fetchWithRetry('https://ejemplo.com', {
proxyRotator: rotator,
retries: 5,
rotateOnError: true,
});Rate limiting
const got = require('got-scraft');
const throttler = new got.Throttler(20); // 20 req/min
const html = await got.fetch('https://ejemplo.com', { throttler });Cache busting
const got = require('got-scraft');
// Auto: agrega ?_=timestamp a cada URL
await got.fetch('https://ejemplo.com', { cacheBust: true });
// Manual
const url = got.cacheBust('https://ejemplo.com');Sesión completa
const got = require('got-scraft');
const session = got.createSession({
minGap: 3000, // 3s entre requests
maxRPM: 15, // 15 requests/minuto
cacheBust: true,
cookieJar: true,
randomizeHeaders: true,
});
const a = await session.get('https://ejemplo.com/a');
const b = await session.get('https://ejemplo.com/b');Detectar bloqueo
const got = require('got-scraft');
const html = await got.fetch('https://ejemplo.com');
if (got.isBlocked(html)) {
console.log('Respuesta bloqueada');
}
// Inspeccionar respuesta completa
const response = await got.axios.get('https://ejemplo.com');
console.log(got.inspectResponse(response));API completa
HTTP
| Función | Descripción |
|---------|-------------|
| fetch(url, opts?) | GET request |
| fetchWithRetry(url, opts?) | GET con reintentos + backoff |
| post(url, body, opts?) | POST request |
| createClient(opts?) | Cliente axios reusable |
| createSession(opts?) | Sesión con rate limit + cookies |
HTML
| Función | Descripción |
|---------|-------------|
| load(html, opts?) | Carga HTML (auto-detect encoding) |
| getMeta($, prop) | Meta tag por propiedad |
| getAllMeta($) | Todas las meta tags |
| getOG($) | Tags Open Graph (og:*) |
| getText($) | Texto plano del body |
| getLines($) | Líneas de texto no vacías |
| matchText(text, patterns[]) | Regex múltiple |
| stripHTML(html) | Limpia etiquetas HTML |
| parseNumber(str) | "1.5k" → "1500" |
Extractores
| Función | Descripción |
|---------|-------------|
| extractLinks($, baseUrl) | Todos los links |
| extractImages($, baseUrl) | Todas las imágenes |
| extractScripts($, baseUrl) | Scripts externos |
| extractStyles($, baseUrl) | Hojas de estilo |
| extractEmails(text) | Direcciones de email |
| extractIFrames($, baseUrl) | Iframes |
| extractForms($) | Formularios con campos |
| extractJsonLd($) | Datos JSON-LD estructurados |
Anti-bloqueo
| Función/Clase | Descripción |
|---------------|-------------|
| ProxyRotator | Rotador de proxies (HTTP/SOCKS) |
| Throttler | Limitador de requests/minuto |
| cacheBust(url) | Evita caché del navegador |
| isBlocked(html) | Detecta bloqueo en respuesta |
| inspectResponse(res) | Inspecciona respuesta axios |
Headers
| Función | Descripción |
|---------|-------------|
| buildHeaders(opts?) | Headers camuflados completos |
| buildSecChUa() | Sec-Ch-Ua aleatorio |
| PROFILES | 12 perfiles de dispositivo |
| AGENTS | User-Agents de cada perfil |
| REFERERS | 23 referers reales |
| LANGUAGES | 12 locales de idioma |
Cookies
| Función | Descripción |
|---------|-------------|
| cookiesFromFile(path) | Lee cookies de archivo |
| cookiesFromNetscape(path) | Lee cookies formato Netscape |
| cookiesFromBrowser(path) | Alias de cookiesFromNetscape |
| cookiesToHeader(cookies) | Convierte a string header |
| mergeCookies(...cookies) | Fusiona múltiples fuentes |
Utilidades
| Función | Descripción |
|---------|-------------|
| rand(min, max) | Entero aleatorio |
| pick(arr) | Elemento aleatorio |
| shuffle(arr) | Fisher-Yates shuffle |
| shuffleObjectKeys(obj) | Keys en orden aleatorio |
| sleep(ms) | Pausa en milisegundos |
| randomDelay(min?, max?) | Pausa aleatoria |
| saveJSON(data, path) | Guarda JSON a archivo |
| loadJSON(path) | Lee JSON de archivo |
| log(msg, data?) | Log a stderr con timestamp |
Meta scraper
const got = require('got-scraft');
const info = await got.scrapeMeta('https://ejemplo.com');
// { url, title, meta: {...}, og: {...} }Ejemplo: scraper de video de Facebook
const got = require('got-scraft');
const TARGET_URL = process.argv[2] || 'https://www.facebook.com/facebook/videos/10153231379946729/';
function extractVideoUrls(html) {
const result = { hd: null, sd: null };
const hd = html.match(/browser_native_hd_url"\s*:\s*"([^"]+)"/);
const sd = html.match(/browser_native_sd_url"\s*:\s*"([^"]+)"/);
if (hd) result.hd = hd[1].replace(/\\\//g, '/');
if (sd) result.sd = sd[1].replace(/\\\//g, '/');
return result;
}
async function scrapeVideo() {
const session = got.createSession({
minGap: 3000,
maxRPM: 15,
cookieJar: false,
});
const html = await session.get(TARGET_URL);
const $ = got.load(html);
const jsonLd = got.extractJsonLd($);
const videoUrls = extractVideoUrls(html);
const result = {
url: TARGET_URL,
scrapedAt: new Date().toISOString(),
title: $('title').text(),
description: got.getMeta($, 'description'),
og: got.getOG($),
videoUrls,
jsonLd,
};
console.log(JSON.stringify(result, null, 2));
}
scrapeVideo().catch(console.error);YouTube scraper
Extrae metadata, formatos y URLs de streaming. Si YouTube cifra las URLs (casi siempre), got-scraft descarga yt-dlp automáticamente desde GitHub y lo usa para descifrarlas.
const got = require('got-scraft');
// Metadata + formatos
const info = await got.getVideoInfo('https://youtu.be/dQw4w9WgXcQ');
console.log(info.title); // Rick Astley - Never Gonna Give You Up
console.log(info.author); // Rick Astley
console.log(info.lengthSeconds); // 213
console.log(info.formats); // [27 formatos con itag, calidad, codecs]
// URLs de streaming descifradas (usa yt-dlp si es necesario)
const audio = await got.getAudioUrl('https://youtu.be/dQw4w9WgXcQ');
console.log(audio.url); // URL real de streaming
const video = await got.getVideoUrl('https://youtu.be/dQw4w9WgXcQ');
console.log(video.url);
// Descargar audio como MP3
await got.download('https://youtu.be/dQw4w9WgXcQ', './audio.mp3');API YouTube
| Función | Descripción |
|---------|-------------|
| getVideoInfo(url, opts?) | Metadata + todos los formatos |
| getAudioUrl(url, opts?) | URL de streaming de audio (mejor calidad) |
| getVideoUrl(url, opts?) | URL de streaming de video |
| getDirectUrl(url, formatSelector, opts?) | URL para un itag específico |
| download(url, dest, opts?) | Descarga audio como MP3 |
Opciones:
| Opción | Tipo | Descripción |
|--------|------|-------------|
| preferAudioItag | number | Itag preferido para audio (ej: 140 = m4a 128kbps, 251 = webm 160kbps) |
| preferVideoItag | number | Itag preferido para video (ej: 18 = 360p, 137 = 1080p) |
| ytDlpPath | string | Ruta personalizada a yt-dlp (si no se especifica, se descarga solo) |
Dependencias
| Paquete | Versión | Uso | |---------|---------|-----| | axios | ^1.18 | HTTP client | | cheerio | ^1.2 | HTML parser | | tough-cookie | ^5.1 | Cookie jar | | axios-cookiejar-support | ^5.0 | Cookies en axios | | https-proxy-agent | ^7.0 | Proxy HTTP/HTTPS | | socks-proxy-agent | ^8.0 | Proxy SOCKS | | iconv-lite | ^0.6 | Encoding conversion | | chardet | ^2.1 | Detección de encoding |
Licencia
MIT
