JavaScript, HTML, CSS e... !
5 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

5 Commenti

  1. Monday, June 28, 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
    • Monday, June 28, 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
  2. Friday, December 23, 2022 alle ore 19:33 Alessandro

    Buonasera Michele,

    sono un felice acquirente del tuo libro che mi ha aperto molti mondi e possibilità di utilizzo nel mio contesto di lavoro, ed ho già realizzato un paio di progetti che permettono di risparmiare non poco tempo.

    Ti scrivo perchè sto cercando di realizzare un Foglio Google che riassume in anteprima il numero di lead disponibili per ciascuna campagna di vendita, senza dover ogni volta aprire la pagina delle singole campagne (sono 12), utilizzando il metodo sopra descritto per recuperare i dati dall'applicativo web aziendale (a cui ovviamente si accede tramite la propria username e password).

    Al codice sopra ho sostituito le variabili url , string_find_start e string_find_end con i dati della pagina della prima campagna, ma ricevo l'errore di url non trovato relativamente alla riga 5 ( var content = UrlFetchApp.fetch(url);) pur avendo la stessa pagina aperta in un altro tab dello stesso browser.

    Nella mia ignoranza (sono un venditore/team leader esperto di funzioni Excel ma entrato da poco nel mondo GAS e con zero conoscenze HTML) presumo l'errore sia dovuto alla necessità di loggarmi con le credenziali all'interno dello stesso script.

    É possibile aggiungere delle funzioni in cui inserire solo le mie credenziali per far funzionare questo script nel mio contesto (e quindi risolvere in maniera semplice per mie conoscenze attuali)? O servono conoscenze HTML specifiche?

    Ti ringrazio in anticipo per qualsiasi aiuto e indicazione

    Rispondi a questo commento
    • Friday, December 23, 2022 alle ore 19:37 Alessandro

      la risposta credo sia analoga al commento precedente, ma se riesci a spiegarmela in termini più semplici te ne sarei grato

      Rispondi a questo commento
      • Friday, December 23, 2022 alle ore 22:46 Michele PisaniAutore

        Ciao Alessandro, piacere di conoscerti e grazie della fiducia! :)
        Mi fa piacere che stai ottenendo dei risultati utili per il tuo lavoro! Relativamente alla tua domanda, se la pagina è dietro credenziali potrebbe non essere effettivamente fattibile accederci da script. Il fatto che sia aperta sul tuo browser non è risolutivo poiché Apps Script effettua le chiamate passando dai server Google e non dal browser che lo avvia. In questi casi ti suggerirei di capire se il servizio dove girano le tue campagne offre delle API, a quel punto sicuramente sarà necessario autenticarsi ma i dati in risposta potranno essere gestibili (è richiesto sicuramente studiare la documentazione di queste eventuali API, sia in termini di autenticazione che di dati ottenibili).

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