Descrizione dei metodi (v1)
Questa JavaScript API è considerata obsoleta, si consiglia di utilizzare l' API versione 2
Si prega di notare che alcuni metodi richiedono l'uso della parola chiave yield
yield this.request()
yield this.request(method, url, queryParams, opts)
Ottenere una risposta HTTP tramite richiesta, gli argomenti specificati sono:
method- metodo della richiesta (GET, POST...)url- link per la richiestaqueryParams- hash con parametri get o hash con il corpo della richiesta postopts- hash con le opzioni della richiesta
Se viene utilizzato il metodo POST, il corpo della richiesta può essere trasmesso in due modi:
- elencando semplicemente i nomi delle variabili e i loro valori in
queryParams. Ad esempio:
{
key: set.query,
id: 1234,
type: 'text'
}
- tramite la variabile body in
opts. Ad esempio:
body: 'key=' + set.query + '&id=1234&type=text'
opts.check_content
check_content: [ condizione1, condizione2, ...] - array di condizioni per verificare il contenuto ricevuto; se la verifica fallisce, la richiesta verrà ripetuta con un altro proxy.
Funzionalità:
- utilizzo di stringhe come condizioni (ricerca per occorrenza della stringa)
- utilizzo di espressioni regolari come condizioni
- utilizzo di funzioni di verifica personalizzate, a cui vengono passati i dati e gli header della risposta
- è possibile impostare contemporaneamente diversi tipi di condizioni
- per la negazione logica, inserire la condizione in un array, ovvero
check_content: ['xxxx', [/yyyy/]]significa che la richiesta sarà considerata riuscita se i dati ricevuti contengono la sottostringa xxxx e allo stesso tempo l'espressione regolare /yyyy/ non trova corrispondenze nella pagina
Per una richiesta riuscita, devono passare tutte le verifiche specificate nell'array
Esempio (nei commenti è indicato cosa serve affinché la richiesta sia considerata riuscita):
let response = yield this.request('GET', set.query, {}, {
check_content: [
/<\/html>|<\/body>/, //questa espressione regolare deve corrispondere nella pagina ricevuta
['XXXX'], //questa sottostringa non deve essere presente nella pagina ricevuta
'</html>', //questa sottostringa deve essere presente nella pagina ricevuta
(data, hdr) => {
return hdr.Status == 200 && data.length > 100;
} //questa funzione deve restituire true
]
});
opts.decode
decode: 'auto-html' - rilevamento automatico della codifica e conversione in utf8
Valori possibili:
auto-html- basato su header, tag meta e contenuto della pagina (opzione consigliata ottimale)utf8- indica che il documento è in codifica utf8<encoding>- qualsiasi altra codifica
opts.headers
headers: { ... } - hash con gli header, il nome dell'header va specificato in minuscolo, è possibile indicare anche i cookie
Esempio:
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', ...] - consente di ridefinire l'ordine di ordinamento degli header
opts.recurse
recurse: N - numero massimo di reindirizzamenti (redirect), predefinito 7, utilizzare 0 per disabilitare i redirect
opts.proxyretries
proxyretries: N - numero di tentativi di esecuzione della richiesta, per impostazione predefinita viene preso dalle impostazioni dello scraper
opts.parsecodes
parsecodes: { ... } - elenco dei codici di risposta HTTP che lo scraper considererà riusciti, per impostazione predefinita viene preso dalle impostazioni dello scraper. Se si specifica '*': 1, tutte le risposte saranno considerate riuscite.
Esempio:
parsecodes: {
200: 1,
403: 1,
500: 1
}
opts.timeout
timeout: N - timeout della risposta in secondi, per impostazione predefinita viene preso dalle impostazioni dello scraper
opts.do_gzip
do_gzip: 1 - determina se utilizzare la compressione (gzip/deflate/br), abilitato per impostazione predefinita (1), per disabilitare impostare il valore a 0
opts.max_size
max_size: N - dimensione massima della risposta in byte, per impostazione predefinita viene preso dalle impostazioni dello scraper
opts.cookie_jar
cookie_jar: { ... } - hash con i cookie.
opts.attempt
attempt: N - indica il numero del tentativo corrente; quando si utilizza questo parametro, il gestore dei tentativi integrato per questa richiesta viene ignorato
opts.browser
browser: 1 - emulazione automatica degli header del browser (1 - abilitato, 0 - disabilitato)
opts.use_proxy
use_proxy: 1 - ridefinisce l'uso del proxy per una singola richiesta all'interno dello scraper JS rispetto al parametro globale Use proxy (1 - abilitato, 0 - disabilitato)
opts.noextraquery
noextraquery: 0 - disabilita l'aggiunta di Extra query string all'URL della richiesta (1 - abilitato, 0 - disabilitato)
opts.save_to_file
save_to_file: file - consente di scaricare un file direttamente su disco, evitando la scrittura in memoria. Al posto di file si specifica il nome e il percorso con cui salvare il file. Quando si utilizza questa opzione, viene ignorato tutto ciò che riguarda data (verifica del contenuto in check_content, response.data sarà vuoto, ecc.).
opts.data_as_buffer
data_as_buffer: 0 - determina se restituire data come stringa String (0) o come oggetto Buffer (1), per impostazione predefinita viene restituita una stringa String
opts.bypass_cloudflare
bypass_cloudflare: 0 - bypass automatico della protezione JavaScript di CloudFlare utilizzando il browser Chrome (1 - abilitato, 0 - disabilitato)
opts.follow_meta_refresh
follow_meta_refresh: 0 - consente di seguire i redirect dichiarati tramite il meta tag HTML:
<meta http-equiv="refresh" content="time; url=..." />
opts.tlsOpts
tlsOpts: { ... } – consente di passare le impostazioni per le connessioni https
yield this.parser.request()
yield this.parser.request(parser, preset, overrideParams, query)
Ottenere i risultati da un altro scraper (integrato o un altro scraper JS), gli argomenti specificati sono:
parser- nome dello scraper (SE::Google, JS::Custom::Example)preset- preset delle impostazioni dello scraper chiamatooverrideParams- hash con le ridefinizioni delle impostazioni dello scraper chiamatoquery- richiesta
In overrideParams è possibile ridefinire i parametri dello scraper chiamato, sono inoltre disponibili questi flag:
overrideParams.resultArraysWithObjects
resultArraysWithObjects: 0 - determina in quale formato restituire gli array dei risultati dello scraper chiamato:
- se abilitato (1) - verranno restituiti array di oggetti
[{link: 'link1', anchor: 'anchor1'}, {link: 'link2', anchor: 'anchor2'}, ...] - se disabilitato (0) - verranno restituiti array standard di valori
['link1', 'anchor1', 'link2', 'anchor2', ...]
overrideParams.needData
needData: 1 - determina se trasmettere (1) o meno (0) nella risposta data/pages[], può essere utilizzato per l'ottimizzazione
tools.*
Oggetto globale tools, consente di accedere alle funzioni integrate di A-Parser (analogo agli strumenti del template toolkit $tools.*).
tools.query non è disponibile, è necessario utilizzare this.query
this.doLog()
Indica se la registrazione del log dell'attività è abilitata, può essere utilizzato come flag per l'ottimizzazione, nei casi in cui il log non viene registrato e l'argomento per this.logger.put è un'espressione complessa
this.logger.*
.put()
this.logger.put(message) - aggiunge la riga message al log dell'attività
.putHTML()
this.logger.putHTML(code) - output nel log dell'attività di codice HTML, che verrà visualizzato nella textarea
yield this.sleep()
yield this.sleep(sec)
Imposta un ritardo nel thread per il numero di secondi sec, può essere frazionario.
yield this.mutex.*
Mutex per la sincronizzazione tra i thread, consente di bloccare una sezione di codice per un singolo thread
.lock()
Attesa del lock, l'esecuzione continuerà con il primo thread che ha acquisito il lock, gli altri thread attenderanno il rilascio del lock
.unlock()
Rilascio del lock, il thread successivo continuerà l'esecuzione se era in attesa del lock (.lock())
this.cookies.*
Lavoro con i cookie per la richiesta corrente
.getAll()
Ottenere un array di cookie
.setAll()
Impostazione dei cookie, come argomento deve essere passato un array con i cookie
.set()
this.cookies.set(host, path, name, value) - impostazione di un singolo cookie
this.query.add()
this.query.add(query, maxLvl)
Aggiunta di una nuova query (query) con la possibilità opzionale di specificare il livello massimo (maxLvl), analogamente a tools.query.add() È possibile passare come query (query) un hash con i parametri, funziona analogamente al Costruttore di query
Esempio:
this.query.add({
query: "http://site.com",
param1: "..",
...
});
this.proxy.*
Lavoro con i proxy
.next()
Cambiare il proxy con il successivo, il vecchio proxy non verrà più utilizzato per la richiesta corrente
.ban()
Cambiare e bannare il proxy (necessario quando il servizio blocca l'operazione per IP), il proxy verrà bannato per il tempo specificato nelle impostazioni dello scraper (proxybannedcleanup)
.get()
Ottenere il proxy corrente (l'ultimo proxy con cui è stata effettuata la richiesta)
.set()
this.proxy.set('http://127.0.0.1:8080', noChange = false) - impostare il proxy per la richiesta successiva, il parametro noChange è opzionale, se impostato su true il proxy non cambierà tra i tentativi
yield this.captcha.*
Lavoro con i captcha
.recognize()
yield this.captcha.recognize(preset, image, type, overrides) - caricamento del captcha per il riconoscimento
image- dati binari dell'immagine per il riconoscimentopreset- indica il preset per
Util::AntiGatetypespecificare uno tra: 'jpeg', 'gif', 'png'
Il risultato sarà un hash con i campi:
answer- testo dall'immagineid- id del captcha, per poter segnalare successivamente un errore tramitereportBaderror- errore testuale, se answer non è impostato
.recognizeFromUrl()
yield this.captcha.recognizeFromUrl(preset, url, overrides) - analogo al metodo precedente, ma il caricamento del captcha verrà eseguito automaticamente tramite link (url), senza l'uso di proxy
.reportBad()
yield this.captcha.reportBad(preset, id, overrides) - segnalare al servizio che il captcha è stato risolto in modo errato
this.utils.*
.updateResultsData()
this.utils.updateResultsData(results, data) - metodo per la compilazione automatica di $pages.$i.data e $data, necessario chiamarlo per aggiungere il contenuto della pagina risultante
.urlFromHTML()
this.utils.urlFromHTML(url, base) - elabora un link ottenuto dal codice HTML - decodifica le entità (& ecc.), opzionalmente è possibile passare base - URL di base (ad esempio l'URL della pagina di origine), in questo modo è possibile ottenere il link completo
.url.extractDomain()
this.utils.url.extractDomain(url, removeDefaultSubdomain) - il metodo accetta come primo parametro un link e restituisce il dominio da quel link. Il secondo parametro opzionale determina se rimuovere il sottodominio www dal dominio. Per impostazione predefinita 0 - ovvero non rimuovere.
.url.extractTopDomain()
this.utils.url.extractTopDomain(url) - il metodo accetta come primo parametro un link e restituisce il dominio da quel link, senza sottodomini.
.url.extractTopDomainByZone()
this.utils.url.extractTopDomainByZone(url) - il metodo accetta come primo parametro un link e restituisce il dominio da quel link, inclusi i casi senza sottodomini. Funziona con tutte le zone regionali
.url.extractMaxPath()
this.utils.url.extractMaxPath(url) - il metodo accetta una stringa e seleziona un URL da essa
.url.extractWOParams()
this.utils.url.extractWOParams(url)- il metodo accetta un link e restituisce lo stesso link troncato prima della stringa dei parametri. Ovvero restituirà l'URL fino al ?
.removeHtml()
this.utils.removeHtml(string) - il metodo accetta una stringa e la restituisce pulita
dai tag html
.removeNoDigit()
this.utils.removeNoDigit(string) - il metodo accetta una stringa, rimuove tutto tranne le cifre e restituisce il risultato
.removeComma()
this.utils.removeComma(string) - il metodo accetta una stringa, rimuove caratteri come .,\r\n e restituisce il risultato
this.sessionManager.*
Per utilizzare le sessioni nello scraper JS, è necessario prima inizializzare il Gestore delle sessioni. Questo viene fatto utilizzando la funzione init()
init() {
this.sessionManager.init({
//qui è possibile impostare parametri aggiuntivi
});
}
In this.sessionManager.init() è possibile utilizzare i seguenti parametri:
name- parametro opzionale, consente di ridefinire il nome dello scraper a cui appartengono le sessioni, per impostazione predefinita è uguale al nome dello scraper in cui avviene l'inizializzazionecanChangeProxy- parametro opzionale, possibilità di cambiare proxy, per impostazione predefinita è uguale a 1domain- parametro opzionale, indica di cercare le sessioni tra tutte quelle salvate per questo scraper (se il valore non è impostato), oppure solo per un dominio specifico (è necessario specificare il dominio con un punto davanti, ad esempio.site.com)
Esistono diverse funzioni per lavorare con le sessioni:
.get()
this.sessionManager.get() - ottiene una nuova sessione, deve essere chiamato prima di effettuare una richiesta
.reset()
this.sessionManager.reset() - pulizia dei cookie e ottenimento di una nuova sessione. Deve essere chiamato se la richiesta con la sessione corrente non ha avuto successo.
.save()
this.sessionManager.save() - salvataggio di una sessione riuscita o salvataggio di dati arbitrari nella sessione
results.<array>.addElement()
Il metodo results.<array>.addElement() consente di compilare gli array in results in modo più comodo. Utilizzandolo, non è necessario ricordare la sequenza delle variabili nell'array ed elencarle manualmente.
results.serp.addElement({
link: 'https://google.com',
anchor: 'Google',
snippet: 'Loreps ipsum...',
});
Metodi init() e destroy()
Il metodo init() viene chiamato all'avvio dell'attività, destroy() - al completamento.
Esempio di utilizzo:
const puppeteer = require("puppeteer");
let globalBrowser;
class Parser {
constructor() {
...
}
async init() {
globalBrowser = await puppeteer.launch();
};
async destroy() {
if(globalBrowser)
await globalBrowser.close();
}
}
Link utili
🔗 Esempio di salvataggio di un file su disco
Esempio che dimostra come salvare i file direttamente su disco
🔗 Esempio di lavoro con le sessioni
Utilizzo della funzionalità delle sessioni negli scraper JavaScript
🔗 Esempio di salvataggio dei dati nella sessione
Dimostrazione della possibilità di memorizzare dati arbitrari in una sessione
🔗 Utilizzo di results.addElement()
Esempio di popolamento di un array di dati utilizzando results.addElement() e dimostrazione della differenza rispetto al normale .push()