#+TITLE: Web Scraping con Python #+AUTHOR: Leonardo Tamiano #+OPTIONS: num:nil toc:1 #+REVEAL_THEME: cyberpunk #+REVEAL_TRANS: linear #+REVEAL_EXTRA_CSS: local.css * What is Web Scraping? #+REVEAL: split Per "*web scraping"* si intende l'utilizzo di una serie di tecnologie al fine di estrarre dati dal web (tipicamente da pagine *HTML*) in modo da poterli poi processare come si vuole. Un tipico esempio di web scraping consiste nell'estrarre dei dati di interesse da una pagina web per poi metterli in un'altra pagina web, andando però a cambiare lo stile utilizzato per mostrare i dati. ** Document Object Model #+REVEAL: split I file scritti in *HTML* possono essere rappresentati tramite una struttura dati chiamata *Document Object Model* (DOM). Il DOM è una struttura alborea che contiene sia la struttura del documento e sia il contenuto del documento. #+REVEAL: split #+begin_src html Titolo Pagina

Headline level 1

This is a paragraph!

#+end_src #+REVEAL_HTML:

Esempio file HTML

#+REVEAL: split #+REVEAL_HTML: #+REVEAL_HTML:

Esempio DOM generato con live-dom-viewer

#+REVEAL: split #+REVEAL_HTML: #+REVEAL_HTML:

Esempio DOM generato con Graphviz

#+REVEAL: split Tipicamente le librerie utilizzate per fare web scraping funzionano in due passi: 1. Si costruiscono il DOM rappresentante il documento da analizzare. 2. Offrono una serie di APIs per muoversi all'interno del DOM e raccogliere solamente i dati di nostro interesse. * Beautiful Soup #+REVEAL: split *Beautiful Soup* è una libreria Python che ci permette di fare web scraping. #+begin_quote Beautiful Soup is a Python library for pulling data out of HTML and XML files. It works with your favorite parser to provide idiomatic ways of navigating, searching, and modifying the parse tree. It commonly saves programmers hours or days of work. #+end_quote #+REVEAL_HTML:

Source: Beautiful Soup

** Installation #+REVEAL: split Per quanto riguarda l'installazione possiamo utilizzare *pip*, il packat manager per python. #+begin_src sh pip install beautifulsoup4 #+end_src ** Generating the DOM #+REVEAL: split Supponiamo di aver salvato il codice html fatto vedere prima nel file *web_page_example.html*. Per generare il DOM possiamo procedere come segue #+begin_src python #!/usr/bin/env python3 from bs4 import BeautifulSoup # -- read file f = open("./web_page_example.html", "r") text = f.read() # -- generate DOM structure soup = BeautifulSoup(text, 'html.parser') #+end_src ** Navigating the DOM #+REVEAL: split Una volta che abbiamo generato la struttura DOM la possiamo navigare in vari modi: - Trovare tutti i tags di un certo tipo #+begin_src python # -- find all tags of the form

...

paragraphs = soup.find_all("p") #+end_src - Trovare tutti i tags con un certo attributo #+begin_src python # -- find all tags of the form footer_div = soup.find("div", {"id": "footer"}) #+end_src #+REVEAL: split - A partire da un nodo del DOM possiamo ripetere la ricerca per trovare tutti i tags contenuti in quel particolare sotto-albero del DOM. #+begin_src python if footer_div: # -- find firsts

...

inside author_p = footer_div.find("p") #+end_src - Possiamo anche esplorare il DOM utilizzando la notazione con il punto (*.*) come segue #+begin_src python author_p = footer_div.p #+end_src Così facendo però non siamo sicuri se l'elemento a cui stiamo tentando di accedere esiste davvero. ** Extracting Data from the DOM #+REVEAL: split Una volta che abbiamo i tag di interesse possiamo accedere ai dati veri e propri come segue #+begin_src python # -- get all data print(author_p.decode_contents()) # prints: Author: Leonardo Tamiano # -- get only text data # prints: Author: Leonardo Tamiano print(author_p.text) #+end_src #+REVEAL: split # TODO: add link Il codice esempio fatto vedere è disponibile al seguente link: * Real (Life) Example #+REVEAL: split Consideriamo la seguente pagina, che mostra gli orari delle lezioni. #+REVEAL_HTML: #+REVEAL_HTML:

Ripreso da: http://www.informatica.uniroma2.it/

#+REVEAL: split Il nostro obiettivo è scaricare il file *.html* contenente le informazioni degli orari e salvare i dati in un file *.csv*, in modo poi da poterli processare a nostro piacimento. #+REVEAL: split # TODO: add link Lo script python che fa questo è disponibile al seguente link: