Web Scraping

Andrea Borruso

Introduzione

Il web scraping

È una tecnica per estrarre informazioni dai siti web.

Può essere eseguita manualmente, ma di solito è più veloce, più efficiente e meno soggetta a errori, se la si automatizza.

Il web scraping consente di acquisire (anche) dati non tabellari o scarsamente strutturati dai siti web e di convertirli in un formato strutturato e utilizzabile, come un file CSV o un foglio di calcolo.

Il web scraping

Lo scraping non si limita alla semplice acquisizione di dati: può anche aiutare ad archiviare i dati e a tenere traccia delle modifiche apportate ai dati online.

I primi passi

Prima di iniziare a fare un web scraping:

  • verificate che non ci siano opzioni migliori;
  • verificate se è possibile copiare e incollare facilmente i dati da un sito in un foglio elettronico. Questo potrebbe essere più veloce dello scraping;
  • verificate se il sito o il servizio fornisce già un’API (Application Programming Interface) per estrarre i dati strutturati;
  • verificate se non sia più efficace una richeista FOIA (Freedom of Information Act) per ottenere i dati.

Il testo strutturato

HTML

Una delle fonti principali di dati per lo scraping è l’HTML. Ovvero il linguaggio di markup utilizzato per creare le pagine web.

<!DOCTYPE html>
<html lang="it">
<head>
    <meta charset="UTF-8">
    <title>Documento Minimale</title>
</head>
<body>
    <h1>Titolo Principale</h1>
    <p>Questo è un esempio di paragrafo in un documento HTML minimale.</p>
</body>
</html>

HTML, come un albero

flowchart LR
  Documento --> html["Elemento:<br>&lt;html&gt;"]
  html --> head["Elemento:<br>&lt;head&gt;"]
  html --> body["Elemento:<br>&lt;body&gt;"]
  head --> title["Elemento:<br>&lt;title&gt;"]
  title --> Text["Testo:<br>&quot;Titolo pagina&quot;"]
  body --> h1["Elemento:<br>&lt;h1&gt;"]
  h1 --> Text2["Testo:<br>&quot;Introduzione&quot;"]
  body --> a["Elemento:<br>&lt;a&gt;"]
  a --> Text3["Testo:<br>&quot;Link a Google&quot;"]
  a --> href["Attributo:<br>href=&quot;https://www.google.com&quot;"]

Strumenti

Due essenziali

  • blocco note (Notepad++, Visual Studio Code, ecc.)
  • browser;
    • strumenti di sviluppo.

Estensioni per il browser

Altri strumenti

Analizziamo una pagina web

Il portale del reclutamento

Partiamo con l’esempio del Portale del Reclutamento della Funzione Pubblica.

  • qual è l’obiettivo?
  • quali sono i dati che vogliamo estrarre?
  • gli URL hanno qualcosa di particolare?
  • i contenuti sono strutturati?
  • guardiamo il codice sorgente.

Proviamo una prima estrazione

Esploriamo l’HTML

I titoli de Il Post

XPath

XPath - XML Path Language - è un linguaggio che permette di individuare parti specifiche di un documento XML (e per estensione, documenti HTML per il web).

XPath

//div/article/div/a/h2

XPath cheatsheet

  • nodename: Seleziona tutti i nodi con il nome “nodename”.
  • /: Una barra singola all’inizio indica una selezione a partire dal nodo radice; le barre successive indicano la selezione di un nodo figlio dal nodo corrente.
  • //: Seleziona nodi figli diretti e indiretti nel documento a partire dal nodo corrente - ciò ci - permette di “saltare livelli”.
  • .: Seleziona il nodo contesto corrente.
  • ..: Seleziona il genitore del nodo contesto.
  • @: Seleziona gli attributi del nodo contesto.
  • [@attribute = 'value']: Seleziona nodi con un particolare valore di attributo.

CSS Selector

div > article > div > a > h2

I selettori CSS (Cascading Style Sheets) sono schemi utilizzati per selezionare gli elementi HTML da stilizzare con le regole CSS. Consentono di specificare a quali elementi del documento si applicano le regole di stile.

Estraiamoli

La rete diplomatica italiana:
https://www.esteri.it/it/ministero/struttura/laretediplomatica/

IMPORTXML(url, xpath_query, locale)

Sheet

Esempi

Il browser

Monitorare l’aggiornamento dati sul PNRR

Catalogo dati PNRR

Obiettivi 🎳

  • essere avvisati quando c’è un aggiornamento;
    • creare una copia dei dati;
    • aggiornare automaticamente dashboard, mappe, ecc.;
    • verificare la qualità dei dati;
    • verificare avanzamenti …

Analisi 🤓

  • c’è un “vero” catalogo dati?
  • c’è un feed RSS?
  • c’è un’API?
  • c’è una newsletter?

Analisi 🤓

  • Quali dati vogliamo?
  • Dove sono i dati?
  • Come sono i dati?
  • Quanti sono i dati?
  • Come è strutturato l’elenco dei dati?

Estraiamo l’elenco

<span class="title-file" data-size="326.0 kb" data-extension="csv" data-url="/content/dam/sogei-ng/open-data-b/OpenData_PNRR_map_indicatori_comuni.csv">
    OpenData_PNRR_map_indicatori_comuni.csv -
    <span class="extension">(326.0 kb)</span>
</span>
<span class="title-file hidden" data-size="682.0 kb" data-extension="json" data-url="/content/dam/sogei-ng/open-data-b/OpenData_PNRR_map_indicatori_comuni_v7.json">
    OpenData_PNRR_map_indicatori_comuni_v7.json -
    <span class="extension">(682.0 kb)</span>
</span>
  • tutti gli oggetti span con la proprietà data-url
  • in XPATH: //span[@data-url]

Appunti

Il post

//h2[contains(@class, '_article-title')]

//div[contains(@class, 'col')]/article//h2

Il traffico

Esempio del JSON dei microdati https://www.istat.it/it/archivio/167566

Siti

Web scraping

  • non è facile;
  • non è per tutte/i;
  • va fatto in modo “etico”;
  • è divertente.