Descripción de métodos (v1)
Esta API de JavaScript se considera obsoleta; recomendamos utilizar la API versión 2
Tenga en cuenta que algunos métodos requieren el uso de la palabra clave yield
yield this.request()
yield this.request(method, url, queryParams, opts)
Obtención de una respuesta HTTP mediante una solicitud; se especifican los siguientes argumentos:
method- método de la solicitud (GET, POST...)url- enlace para la solicitudqueryParams- hash con parámetros GET o hash con el cuerpo de la solicitud POSTopts- hash con opciones de la solicitud
Si se utiliza el método POST, el cuerpo de la solicitud se puede pasar de dos maneras:
- simplemente enumerando los nombres de las variables y sus valores en
queryParams. Por ejemplo:
{
key: set.query,
id: 1234,
type: 'text'
}
- a través de la variable body en
opts. Por ejemplo:
body: 'key=' + set.query + '&id=1234&type=text'
opts.check_content
check_content: [ condición1, condición2, ...] - matriz de condiciones para verificar el contenido recibido; si la verificación falla, la solicitud se repetirá con otro proxy.
Posibilidades:
- uso de cadenas como condiciones (búsqueda por coincidencia de cadena)
- uso de expresiones regulares como condiciones
- uso de funciones de verificación propias, a las que se les pasan los datos y los encabezados de la respuesta
- se pueden definir varios tipos de condiciones a la vez
- para la negación lógica, coloque la condición en una matriz, es decir,
check_content: ['xxxx', [/yyyy/]]significa que la solicitud se considerará exitosa si los datos recibidos contienen la subcadena xxxx y, al mismo tiempo, la expresión regular /yyyy/ no encuentra coincidencias en la página.
Para que la solicitud sea exitosa, deben pasar todas las verificaciones especificadas en la matriz.
Ejemplo (en los comentarios se indica qué se necesita para que la solicitud se considere exitosa):
let response = yield this.request('GET', set.query, {}, {
check_content: [
/<\/html>|<\/body>/, //esta expresión regular debe coincidir en la página obtenida
['XXXX'], //esta subcadena no debe estar en la página obtenida
'</html>', //esta subcadena debe estar en la página obtenida
(data, hdr) => {
return hdr.Status == 200 && data.length > 100;
} //esta función debe devolver true
]
});
opts.decode
decode: 'auto-html' - detección automática de la codificación y conversión a utf8
Valores posibles:
auto-html- basado en encabezados, etiquetas meta y el contenido de la página (opción recomendada óptima)utf8- indica que el documento está en codificación utf8<encoding>- cualquier otra codificación
opts.headers
headers: { ... } - hash con encabezados, el nombre del encabezado se especifica en minúsculas, se puede incluir cookie entre otros
Ejemplo:
headers: {
accept: 'image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8',
'accept-encoding': 'gzip, deflate, br',
cookie: 'a=321; b=test',
'user-agent' 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36'
}
opts.headers_order
headers_order: ['cookie', 'user-agent', ...] - permite redefinir el orden de clasificación de los encabezados
opts.recurse
recurse: N - número máximo de redirecciones, por defecto 7, use 0 para desactivar el seguimiento de redirecciones
opts.proxyretries
proxyretries: N - número de intentos para realizar la solicitud, por defecto se toma de la configuración del extractor
opts.parsecodes
parsecodes: { ... } - lista de códigos de respuesta HTTP que el extractor considerará exitosos, por defecto se toma de la configuración del extractor. Si se especifica '*': 1, todas las respuestas se considerarán exitosas.
Ejemplo:
parsecodes: {
200: 1,
403: 1,
500: 1
}
opts.timeout
timeout: N - tiempo de espera de la respuesta en segundos, por defecto se toma de la configuración del extractor
opts.do_gzip
do_gzip: 1 - determina si se debe usar compresión (gzip/deflate/br), activado por defecto (1), para desactivarlo establezca el valor en 0
opts.max_size
max_size: N - tamaño máximo de la respuesta en bytes, por defecto se toma de la configuración del extractor
opts.cookie_jar
cookie_jar: { ... } - hash con cookies.
opts.attempt
attempt: N - indica el número del intento actual; al usar este parámetro, se ignora el manejador de intentos integrado para esta solicitud
opts.browser
browser: 1 - emulación automática de encabezados de navegador (1 - activado, 0 - desactivado)
opts.use_proxy
use_proxy: 1 - anula el uso de proxy para una solicitud individual dentro del extractor JS por encima del parámetro global Use proxy (1 - activado, 0 - desactivado)
opts.noextraquery
noextraquery: 0 - desactiva la adición de Extra query string a la URL de la solicitud (1 - activado, 0 - desactivado)
opts.save_to_file
save_to_file: file - permite descargar un archivo directamente al disco, omitiendo la escritura en memoria. En lugar de file, se especifica el nombre y la ruta para guardar el archivo. Al usar esta opción, se ignora todo lo relacionado con data (verificación de contenido en check_content, response.data estará vacío, etc.).
opts.data_as_buffer
data_as_buffer: 0 - determina si se devuelve data como una cadena String (0) o como un objeto Buffer (1), por defecto se devuelve una cadena String
opts.bypass_cloudflare
bypass_cloudflare: 0 - evasión automática de la protección JavaScript de CloudFlare utilizando el navegador Chrome (1 - activado, 0 - desactivado)
opts.follow_meta_refresh
follow_meta_refresh: 0 - permite seguir redirecciones declaradas mediante la etiqueta meta HTML:
<meta http-equiv="refresh" content="time; url=..." />
opts.tlsOpts
tlsOpts: { ... } – permite pasar ajustes para conexiones https
yield this.parser.request()
yield this.parser.request(parser, preset, overrideParams, query)
Obtención de resultados de otro extractor (integrado u otro extractor JS), se especifican los siguientes argumentos:
parser- nombre del extractor (SE::Google, JS::Custom::Example)preset- ajuste preestablecido del extractor llamadooverrideParams- hash con anulaciones de la configuración del extractor llamadoquery- consulta
En overrideParams se pueden redefinir los parámetros del extractor llamado, también están disponibles estos indicadores:
overrideParams.resultArraysWithObjects
resultArraysWithObjects: 0 - determina en qué formato devolver las matrices de resultados del extractor llamado:
- si está activado (1) - se devolverán matrices de objetos
[{link: 'link1', anchor: 'anchor1'}, {link: 'link2', anchor: 'anchor2'}, ...] - si está desactivado (0) - se devolverán matrices de valores estándar
['link1', 'anchor1', 'link2', 'anchor2', ...]
overrideParams.needData
needData: 1 - determina si se debe pasar (1) o no (0) data/pages[] en la respuesta, puede usarse para optimización
tools.*
Objeto global tools, permite acceder a las funciones integradas de A-Parser (análogo a herramientas del motor de plantillas $tools.*).
tools.query no está disponible, es necesario usar this.query
this.doLog()
Indica si el registro de la tarea está activado, puede usarse como un indicador para optimización, en casos donde no se lleva registro y el argumento de this.logger.put es una expresión compleja
this.logger.*
.put()
this.logger.put(message) - añade la línea message al registro de la tarea
.putHTML()
this.logger.putHTML(code) - salida de código HTML al registro de la tarea, que se mostrará en el textarea
yield this.sleep()
yield this.sleep(sec)
Establece un retraso en el hilo por un número de segundos sec, puede ser fraccionario.
yield this.mutex.*
Mutex para la sincronización entre hilos, permite bloquear una sección de código para un solo hilo
.lock()
Espera de bloqueo, la ejecución continuará el primer hilo que capture el bloqueo, los demás hilos esperarán la liberación del bloqueo
.unlock()
Liberación del bloqueo, el siguiente hilo continuará la ejecución si estaba esperando el bloqueo (.lock())
this.cookies.*
Trabajo con cookies para la solicitud actual
.getAll()
Obtención de una matriz de cookies
.setAll()
Establecimiento de cookies, se debe pasar una matriz con cookies como argumento
.set()
this.cookies.set(host, path, name, value) - establecimiento de una sola cookie
this.query.add()
this.query.add(query, maxLvl)
Adición de una nueva consulta (query) con la posibilidad de especificar opcionalmente el nivel máximo (maxLvl), de manera similar a tools.query.add() Se puede pasar como consulta (query) un hash con parámetros, funciona de manera similar al Constructor de consultas
Ejemplo:
this.query.add({
query: "http://site.com",
param1: "..",
...
});
this.proxy.*
Trabajo con proxy
.next()
Cambiar al siguiente proxy, el proxy antiguo ya no se utilizará para la solicitud actual
.ban()
Cambiar y banear el proxy (necesario cuando el servicio bloquea el trabajo por IP), el proxy será baneado por el tiempo especificado en la configuración del extractor (proxybannedcleanup)
.get()
Obtener el proxy actual (el último proxy con el que se realizó la solicitud)
.set()
this.proxy.set('http://127.0.0.1:8080', noChange = false) - establecer el proxy para la siguiente solicitud, el parámetro noChange es opcional, si se establece en true el proxy no cambiará entre intentos
yield this.captcha.*
Trabajo con captcha
.recognize()
yield this.captcha.recognize(preset, image, type, overrides) - carga de captcha para reconocimiento
image- datos binarios de la imagen para reconocimientopreset- indica el ajuste preestablecido para
Util::AntiGatetypese especifica uno de: 'jpeg', 'gif', 'png'
El resultado será un hash con los campos:
answer- texto de la imagenid- id del captcha, para poder informar de un error posteriormente a través dereportBaderror- error de texto, si answer no está definido
.recognizeFromUrl()
yield this.captcha.recognizeFromUrl(preset, url, overrides) - similar al método anterior, pero la carga del captcha se realizará automáticamente mediante el enlace (url), sin usar proxy
.reportBad()
yield this.captcha.reportBad(preset, id, overrides) - informar al servicio que el captcha se resolvió incorrectamente
this.utils.*
.updateResultsData()
this.utils.updateResultsData(results, data) - método para el llenado automático de $pages.$i.data y $data, es necesario llamarlo para añadir el contenido de la página resultante
.urlFromHTML()
this.utils.urlFromHTML(url, base) - procesa un enlace obtenido de código HTML: decodifica entidades (&, etc.), opcionalmente se puede pasar base (URL base, por ejemplo, la URL de la página de origen), permitiendo obtener el enlace completo
.url.extractDomain()
this.utils.url.extractDomain(url, removeDefaultSubdomain) - el método acepta como primer parámetro un enlace y devuelve el dominio de ese enlace. El segundo parámetro opcional determina si se debe recortar el subdominio www del dominio. Por defecto es 0, es decir, no recortar.
.url.extractTopDomain()
this.utils.url.extractTopDomain(url) - el método acepta como primer parámetro un enlace y devuelve el dominio de ese enlace, sin subdominios.
.url.extractTopDomainByZone()
this.utils.url.extractTopDomainByZone(url) - el método acepta como primer parámetro un enlace y devuelve el dominio de ese enlace, incluyendo sin subdominios. Funciona con todas las zonas regionales.
.url.extractMaxPath()
this.utils.url.extractMaxPath(url) - el método acepta una cadena y extrae una URL de ella
.url.extractWOParams()
this.utils.url.extractWOParams(url)- el método acepta un enlace y devuelve el mismo enlace recortado hasta la cadena de parámetros. Es decir, devolverá la URL hasta el ?
.removeHtml()
this.utils.removeHtml(string) - el método acepta una cadena y la devuelve limpia
de etiquetas html
.removeNoDigit()
this.utils.removeNoDigit(string) - el método acepta una cadena, elimina todo excepto los dígitos y devuelve el resultado
.removeComma()
this.utils.removeComma(string) - el método acepta una cadena, elimina caracteres como .,\r\n y devuelve el resultado
this.sessionManager.*
Para usar sesiones en el extractor JS, primero se debe inicializar el Administrador de sesiones. Esto se hace con la función init()
init() {
this.sessionManager.init({
//aquí se pueden establecer parámetros adicionales
});
}
En this.sessionManager.init() se pueden usar los siguientes parámetros:
name- parámetro opcional, permite redefinir el nombre del extractor al que pertenecen las sesiones, por defecto es igual al nombre del extractor en el que se realiza la inicializacióncanChangeProxy- parámetro opcional, posibilidad de cambiar de proxy, por defecto es 1domain- parámetro opcional, indica buscar sesiones entre todas las guardadas para este extractor (si no se define valor), o solo para un dominio específico (es necesario especificar el dominio con un punto delante, por ejemplo.site.com)
Existen varias funciones para trabajar con sesiones:
.get()
this.sessionManager.get() - obtiene una nueva sesión, debe llamarse antes de realizar la solicitud
.reset()
this.sessionManager.reset() - limpieza de cookies y obtención de una nueva sesión. Debe llamarse si la solicitud con la sesión actual no fue exitosa.
.save()
this.sessionManager.save() - guardado de una sesión exitosa o guardado de datos arbitrarios en la sesión
results.<array>.addElement()
El método results.<array>.addElement() permite llenar matrices en results de manera más conveniente. Al usarlo, no es necesario recordar la secuencia de variables en la matriz ni enumerarlas manualmente.
results.serp.addElement({
link: 'https://google.com',
anchor: 'Google',
snippet: 'Loreps ipsum...',
});
Métodos init() y destroy()
El método init() se llama al inicio de la tarea, destroy() al finalizar.
Ejemplo de uso:
const puppeteer = require("puppeteer");
let globalBrowser;
class Parser {
constructor() {
...
}
async init() {
globalBrowser = await puppeteer.launch();
};
async destroy() {
if(globalBrowser)
await globalBrowser.close();
}
}
Enlaces útiles
🔗 Ejemplo de guardado de archivo en disco
Ejemplo que demuestra el método para guardar archivos directamente en el disco
🔗 Ejemplo de trabajo con sesiones
Uso de la funcionalidad de sesiones en extractores JavaScript
🔗 Ejemplo de guardado de datos en la sesión
Demostración de la posibilidad de almacenar datos arbitrarios en la sesión
🔗 Uso de results.addElement()
Ejemplo de llenado de una matriz de datos usando results.addElement() y demostración de la diferencia con el .push() habitual