|
|
@@ -1,52 +1,7 @@ |
|
|
|
# Anche i robot navigano il web |
|
|
|
~web scraping, estrarre informazioni da Internet~ |
|
|
|
|
|
|
|
## intro |
|
|
|
- cosa c'e' sull'internet |
|
|
|
- informazioni |
|
|
|
- risorse |
|
|
|
- servizi |
|
|
|
- web vs web browser |
|
|
|
- analisi di una richiesta HTTP |
|
|
|
- dimostrazione con cUrl |
|
|
|
- estrazione |
|
|
|
- superficie: panoramica possibili utilizzi |
|
|
|
- tecniche |
|
|
|
- ostacoli e limitazioni |
|
|
|
- tecnico-pratiche |
|
|
|
- legali* |
|
|
|
- inserimento |
|
|
|
- superficie: panoramica possibili utilizzi |
|
|
|
- tecniche e ostacoli come da estrazione |
|
|
|
- motivazioni |
|
|
|
- pratiche |
|
|
|
- reperibilita' offline |
|
|
|
- far sopravvivere la fruizione ai provider attuali dei contenuti |
|
|
|
- costruzione di soluzioni utente-centriche |
|
|
|
- politiche |
|
|
|
- liberare le informazioni |
|
|
|
- artistiche |
|
|
|
- manipolare le informazioni per caricarle di altro significato |
|
|
|
|
|
|
|
(*) need halp |
|
|
|
|
|
|
|
|
|
|
|
## pratica 1: cUrl |
|
|
|
|
|
|
|
## (?)pratica 1.5: greasemonkey |
|
|
|
|
|
|
|
## pratica 2: scrapy |
|
|
|
|
|
|
|
## pratica 3: PhantomJs/CasperJs |
|
|
|
|
|
|
|
## (???)pratica 4: selenium/watir |
|
|
|
|
|
|
|
|
|
|
|
**tbd: obiettivi scraping per workshop** |
|
|
|
|
|
|
|
___ |
|
|
|
|
|
|
|
#cosa c'e' sull'internet |
|
|
|
##cosa c'e' sull'internet |
|
|
|
|
|
|
|
- informazioni |
|
|
|
- servizi |
|
|
@@ -98,27 +53,75 @@ Per fare questo è necessario individuare le risorse accessibili tramite la rete |
|
|
|
|
|
|
|
Di seguito vedremo alcune delle tecniche che possiamo utilizzare per crearne uno. |
|
|
|
|
|
|
|
####Prerequisiti |
|
|
|
|
|
|
|
- python con i seguenti moduli installati |
|
|
|
- requests |
|
|
|
- beautiful soup (bs4) |
|
|
|
|
|
|
|
Il sito da cui andremo ad estrarre le informazioni e' il seguente: |
|
|
|
|
|
|
|
```http://viaggiatreno.it/vt_pax_internet/mobile``` |
|
|
|
|
|
|
|
Possiamo quindi iniziare a navigarlo tramite un browser (preferibilmente firefox o chromium/chrome) per farci un idea sul suo funzionamento. E' molto utile in questa fase usare gli strumenti inclusi nel browser come |
|
|
|
|
|
|
|
Il network monitor di firefox: |
|
|
|
https://developer.mozilla.org/it/docs/Tools/Network_Monitor |
|
|
|
|
|
|
|
Oppure l'equivalente per Chrome: |
|
|
|
https://developers.google.com/web/tools/chrome-devtools/network-performance/resource-loading |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
####Prerequisiti |
|
|
|
|
|
|
|
- python ~2.7 con i seguenti moduli installati *(durante il workshop vi aiuteremo durante l'installazione)* |
|
|
|
- ```requests``` che ci permette di gestire le chiamate HTTP[s] e di estrarne il codice HTML |
|
|
|
- ```beautifulsoup``` (bs4) che ci permette di operare selezioni all'interno del codice estratto |
|
|
|
|
|
|
|
|
|
|
|
####Documentazione |
|
|
|
|
|
|
|
http://docs.python-requests.org/en/master/ |
|
|
|
https://www.crummy.com/software/BeautifulSoup/bs4/doc/ |
|
|
|
|
|
|
|
|
|
|
|
####Esecuzione |
|
|
|
|
|
|
|
Il punto di partenza e' quindi creare un nuovo file che chiameremo `scraper.py` con il seguente contenuto: |
|
|
|
|
|
|
|
#! /usr/bin/env python |
|
|
|
# importiamo il modulo requests |
|
|
|
import requests |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# modifichiamo gli header in modo da simulare una richiesta proveniente da un browser web (in questo caso firefox) per evitare possibili ban |
|
|
|
headers = requests.utils.default_headers() |
|
|
|
headers.update({"User-Agent": "Mozilla/5.0"}) |
|
|
|
|
|
|
|
# effettuiamo la richiesta |
|
|
|
r = requests.get('http://viaggiatreno.it/vt_pax_internet/mobile', headers=headers) |
|
|
|
|
|
|
|
print(r.text) |
|
|
|
# stampiamo il risultato |
|
|
|
print(r.text) |
|
|
|
|
|
|
|
salviamo il file ed eseguiamolo: |
|
|
|
|
|
|
|
$ python scraper.py |
|
|
|
|
|
|
|
in modo da vedere il codice html estratto dalla pagina. |
|
|
|
|
|
|
|
Una volta fatto questo torniamo sul sito ed effettuiamo una ricerca per stazione, tenendo aperto il network monitor del browser. Dopodiche', cerceremo di riprodurre la stessa ricerca utilizzando python: |
|
|
|
|
|
|
|
#! /usr/bin/env python |
|
|
|
import requests |
|
|
|
from bs4 import BeautifulSoup |
|
|
|
|
|
|
|
headers = requests.utils.default_headers() |
|
|
|
headers.update({"User-Agent": "Mozilla/5.0"}) |
|
|
|
|
|
|
|
data = { |
|
|
|
|
|
|
|
'codiceStazione': 'S01700Milano+Centrale', |
|
|
|
'lang': 'IT', |
|
|
|
} |
|
|
|
|
|
|
|
r = requests.post('http://viaggiatreno.it/vt_pax_internet/mobile/stazione', headers=headers, data=data) |
|
|
|
|
|
|
|
print(r.text.encode('utf-8')) |
|
|
|
|
|
|
|
|
|
|
|
|