JavaScript, HTML, CSS e... !
2 commenti

Recuperare informazioni tramite data scraping

Parsing HTML di una pagina web con Google Apps Script

 In Google Apps Script è possibile, con veramente pochissime righe di codice, recuperare il contenuto desiderato presente all'interno di una pagina web definendone i tag che lo contengono.

Passando subito all'esempio pratico, il primo passggio è quello di aprire la pagina web desiderata, posizionarsi con il cursore del mouse sull'elemento HTML contenente l'informazione di interesse e dal menu contestuale che si aprirà cliccando con il taso destro selezionare 'Ispeziona'. In questo modo è possibile identificare i tag HTML presenti prima e dopo il dato che si intende recuperare. Copiarli e annotarli in modo da poterli inserire nella funzione che andremo ad utilizzare.
Nel caso dell'esempio in questione ho utilizzato come pagina di destinazione un articolo sul mio blog (link all'articolo) e come informazione da recuperare mi sono concentrato sul numero dei commenti presenti per tale articolo. Di seguito uno screenshot della pagina e del codice HTML oggetto di attenzione, Fig. 1:



pagina target con evidenziato il valore da recuperare ed il relativo codice HTML

Fig. 01 - Pagina target con evidenziato il valore da recuperare ed il relativo codice HTML


La funzione che ho creato allo scopo è la seguente:

function getData() {
  var url = "http://www.michelepisani.it/articoli/cookie-policy-come-gestire-analytics-adsense-e-i-bottoni-social/";
  var string_find_start = '<a href="#comments" class="icon-link"><span class="icon-text">&#59160;</span>';
  var string_find_end = 'commenti</a>';
  var content = UrlFetchApp.fetch(url);
  
  var content = content.getBlob().getDataAsString('ISO-8859-1');
  var string_find_start_length = string_find_start.length;
  var string_find_start_position = content.indexOf(string_find_start);
  var string_find_start_position_content = string_find_start_position + string_find_start_length;
  var string_find_end_position = content.indexOf(string_find_end, string_find_start_position);
  var result = content.substring(string_find_start_position_content, string_find_end_position);
  
  Logger.log(result);
}

Quello di cui ha bisogno è che le venga fornito l'url di destinazione e le porzioni HTML identificative,rispettivamente di inzio e di fine, che racchiudono il contenuto che ci interessa estrapolare.

I passaggi che svolge la funzione prevedono l'uso di UrlFetchApp.fetch(url) per accedere alla risorsa web tramite il suo url dopodiché il contenuto recuperato viene processato dalla seguente riga di codice per convertirlo in UTF-8 evitando la generazione di eventuali caratteri non riconosciuti in fase di visualizzazione:

var content = content.getBlob().getDataAsString('ISO-8859-1');

Le righe di codice successive recuperano il numero della posizione dei caratteri in pagina corrispondenti rispettivamente a quello di inizio del contenuto da recuperare (ovvero l'ultimo carattere della stringa identificativa di inizio) ed a quello di fine (ovvero il primo carattere della stringa identificativa di terminazione).
Conoscendo queste due posizioni viene estratta la parte di stringa al loro interno.

Eseguendo lo script, all'interno della finestra di log, View -> Logs (in quanto è stato indicato con Logger.log() la destinazione del valore di nostro interesse, ma avrei potuto inserirlo in una variabile così come all'interno di uno Spreadsheet), possiamo notare che è stato recuperato il numero dei commenti visualizzato per l'articolo in questione che, nel caso specifico, è 38 (Fig. 2):



risultato del parsing html visualizzato nella finestra di log

Fig. 02 - Risultato del parsing HTML visualizzato nella finestra di log


Per chi volesse ottenere lo stesso risultato in modo più agevolato può fare riferimento al tutorial "Parsing HTML con una Libreria pronta in Google Apps Script" dove mostro come poterlo fare tramite l'utilizzo di una libreria pronta all'uso reperita sul web.
A tal proposito faccio presente che in alcuni casi è sconsigliato l'uso delle librerie nei progetti Apps Script come descritto nell'articolo "Google Apps Script: best practice per il miglioramento delle performance".

Tags

Michele Pisani

Michele Pisani

Sviluppatore Javascript ed esperto in Digital Analytics

L'esperienza nel settore Digital Analytics unita ad anni di sviluppo in Javascript ha trovato la massima espressione in Google Apps Script che mi ha permesso, con estrema facilità e poche righe di codice, di realizzare potenti applicazioni interattive e processi automatizzati integrati con i prodotti della G Suite.

Come contattarmi
scrivi un commento

2 Commenti

  1. lunedì 28 giugno 2021 alle ore 11.16 Marco

    Salve, sono arrivato sulla sua pagina tramite una ricerca, sto cercando un metodo per migrare da Excel a Google Fogli rielaborando le macro fatte in VBA. Pensavo fosse un'operazione non troppo impegnativa, mi sono preso un impegno con i colleghi e non vorrei disattenderlo. Utilizziamo delle macro che svolgono varie operazioni, la prima che è quella che dà il via a tutte le altre, è l'accesso alla rete interna. Dopo essersi loggati, la macro importa una tabella tramite un ciclo for each, quindi per ogni classe ci restituisce righe e colonne che sono all'interno dei tag TD. e ripete l'operazione di importazione ad intervalli regolari. Questa banalissima funzione fatta con VBA non riesco ad elaborarla con Google Script. C'è qualche indicazione che possa essermi utile? Ho anche guardato i suoi video, ma immagino siano argomenti che verranno affrontati successivamente. Non mi è consentito fornirle la url della pagina (essendo aziendale e appartenente ad una rete interna), ma posso darle via email, parti del codice ispezionato e della macro. Attendo una sua gentile risposta, anche se ahimè questo è datato 2017.

    Rispondi a questo commento
    • lunedì 28 giugno 2021 alle ore 21.42 Michele PisaniAutore

      Ciao Marco,
      per collegarsi ad un end point il metodo è quello utilizzato in questo tutorial, ovvero UrlFetchApp.fetch(url): https://developers.google.com/apps-script/reference/url-fetch/url-fetch-app che anche se è datato 2017 è ancora attuale. Se sono previste delle credenziali è possibile inviare la richiesta di autenticazione nell'header tramite il parametro option. A questo punto l'oggetto in risposta può essere letto e gestito con cicli e quant'altro in sintassi JavaScript.

      Rispondi a questo commento

Scrivi un commento

Il tuo indirizzo email non sarà pubblicato.I campi contrassegnati da un * sono obbligatori
Puoi utilizzare i seguenti tag nei commenti:
[bold]testo[/bold] se vuoi evidenziare un testo con il grassetto[code]function helloworld() { }[/code] se vuoi pubblicare una porzione di codice[url]https://www.appsscript.it[/url] se devi riferirti ad un indirizzo web