web-scraping-caotico/README.md

149 líneas
5.8 KiB
Markdown

2017-11-07 00:07:22 +01:00
# Anche i robot navigano il web
2017-11-07 00:13:55 +01:00
~web scraping, estrarre informazioni da Internet~
2017-10-03 00:56:56 +02:00
2017-11-10 01:02:51 +01:00
##cosa c'e' sull'Internet
2017-11-07 00:07:22 +01:00
- informazioni
- servizi
- persone che ne fruiscono
2017-11-07 00:13:55 +01:00
### Informazioni
2017-11-07 00:07:22 +01:00
Le informazioni descrivono la realta' in cui viviamo e sono la base su cui prendiamo delle decisioni. Sono facili da quantificare. Sono facili da manipolare.
2017-11-10 01:02:51 +01:00
#### Tipi di informazione che si trova sull' Internet
2017-11-07 00:07:22 +01:00
(in ordine dalla piu' alla meno rara)
2017-11-08 23:05:47 +01:00
- edita o elaborata (libri, film, tracce musicali, articoli di un blog) - alto valore intrinseco.
2017-11-09 00:52:47 +01:00
- non elaborata (informazioni metereologiche, post su facebook, indirizzo e recapito di una attività commerciale) - basso valore intrinseco.
2017-11-08 23:05:47 +01:00
- metainformazione - (log di un server web/DNS) - valore intrinseco nullo
#### Manipolazione
2017-11-10 00:00:32 +01:00
La manipolazione dell'informazione la carica di valore, la spiega, la rende fruibile. Invormazioni di tipo diverso necessitano tipi diversi di manipolazione per acquistare valore intrinseco.
2017-11-08 23:05:47 +01:00
Ad esempio un log di Apache (server web):
```64.242.88.10 - - [07/Mar/2004:16:05:49 -0800] "GET /twiki/bin/edit/Main/Double_bounce_sender?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12846```
per assumere significato deve essere contestualizzato con altre informazioni su:
- utente a cui corrisponde l'indirizzo IP
- contenuti a cui corrisponde il percorso
- altri log a cui associarlo per riprodurre la history di navigazione dell'utente
2017-11-07 00:07:22 +01:00
2017-11-07 00:13:55 +01:00
### Manipolare l'informazione
2017-11-10 00:00:32 +01:00
*storiella:
2017-11-07 00:07:22 +01:00
Giangiorgino si sveglia tutte le mattine per andare a prendere lo stesso treno che -di tanto in tanto- non arriva alla stazione per l'orario previsto.
Quando questo succede Giangiorgino deve correre per prendere un autobus e due tram se vuole sperare di arrivare a destinazione entro la stessa ora -cosa che solitamente non riesce a fare-.
Giangiorgino, pensandoci su, capisce di avere le seguenti opzioni:
- svegliarsi mezz'ora prima ogni giorno
- scaricare l'ultima App Trenissimissimo che gli invia ogni ora di ogni giorno notifiche in tempo reale sullo stato dei 36 treni circolanti sulla tratta
2017-11-10 00:00:32 +01:00
- **manipolare l'informazione*** - scrivere un programma che ogni giorno decide sulla base dello stato dei treni l'ora a cui puntare la sveglia
2017-11-08 00:03:01 +01:00
Ecco quindi che il processo ripetitivo di:
- a una data ora visitare il sito trenissimissimo.com
- verificare lo stato di percorrenza del treno
- scegliere il percorso ottimale
- fissare la sveglia di conseguenza
2017-11-09 20:27:49 +01:00
Può essere facilmente delegato a un bot, un processo che una volta avviato è in grado di proseguire la sua esecuzione senza l'intervento di un umano.
2017-11-08 00:03:01 +01:00
2017-11-09 20:41:12 +01:00
Per fare questo è necessario individuare le risorse accessibili tramite la rete che rendano disponibile, in formato più o meno elaborato le informazioni sullo stato dei treni in circolazione. (Giangiorgino ha già controllato, il sito trenissimissimo.com fornisce questo servizio)
2017-11-09 20:38:28 +01:00
2017-11-09 20:27:49 +01:00
2017-11-10 00:53:36 +01:00
####Premessa
2017-11-10 00:00:32 +01:00
Il sito da cui andremo ad estrarre le informazioni e' il seguente:
```http://viaggiatreno.it/vt_pax_internet/mobile```
2017-11-10 00:40:16 +01:00
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
2017-11-10 01:02:51 +01:00
- browser web
2017-11-10 00:40:16 +01:00
- 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
2017-11-10 00:41:52 +01:00
- http://docs.python-requests.org/en/master/
- https://www.crummy.com/software/BeautifulSoup/bs4/doc/
2017-11-10 00:40:16 +01:00
2017-11-10 00:00:32 +01:00
####Esecuzione
Il punto di partenza e' quindi creare un nuovo file che chiameremo `scraper.py` con il seguente contenuto:
2017-11-10 00:40:16 +01:00
# importiamo il modulo requests
2017-11-10 00:00:32 +01:00
import requests
2017-11-10 00:40:16 +01:00
# modifichiamo gli header in modo da simulare una richiesta proveniente da un browser web (in questo caso firefox) per evitare possibili ban
2017-11-10 00:00:32 +01:00
headers = requests.utils.default_headers()
headers.update({"User-Agent": "Mozilla/5.0"})
2017-11-10 00:40:16 +01:00
# effettuiamo la richiesta
2017-11-10 00:00:32 +01:00
r = requests.get('http://viaggiatreno.it/vt_pax_internet/mobile', headers=headers)
2017-11-10 00:40:16 +01:00
# 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'))
2017-11-10 00:53:36 +01:00
Ora che abbiamo il codice html della risposta alla nostra ricerca, possiamo usare beautifulsoup per estrarre solo le informazioni relative ai treni:
#! /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)
2017-11-10 00:40:16 +01:00
2017-11-10 00:53:36 +01:00
soup = BeautifulSoup(r.text, 'html.parser')
treni = soup.find_all("div", class_="bloccorisultato")
2017-11-10 00:40:16 +01:00
2017-11-10 00:53:36 +01:00
for treno in treni:
print(treno)