mercoledì 2 marzo 2016

Come rubare i dati da un sito internet con il php

Rubare, che parolone... diciamo prendere in prestito :p
Scherzi a parte, in questo post vi insegnerò come pescare dei dati da un sito internet usando il php.

Attenzione, questa guida non serve per insegnarvi a violare il diritto d'autore, ma serve solo a chi ha bisogno di prelevare ed elaborare meglio dei dati pubblici (non protetti da diritti d'autore) presenti su internet.
Questo sito internet non si assume alcuna responsabilità per ogni eventuale uso improprio di queste informazioni (cit.)


Vi faccio un esempio pratico.
C'è un sito web che ha tutte le schede dei libri,
A voi servono quei dati per fare una ricerca o qualche altro lavoro, ma non vi vanno bene come sono intabellati.
Sono dati pubblici no? L'autore di un determinato libro è un'informazione libera, così come anche chi è l'editore, e magari anche quali sono i capitoli del libro.

Bene, prendiamo allora questo esempio per fare una prova pratica.

Prima di tutto, per poter prendere i dati da siti in https, andate nel file php.ini ed abilitate l'openssl, scommentando la seguente riga:
extension=php_openssl.dll
Scommentare vuol dire ovviamente togliere il punto e virgola prima della parola extension.
Una volta fatto, riavviate il webserver (apache, nginx o quel che è)... io non l'ho fatto e c'ho perso un'ora per cercare di capire come mai non funzionava :p

Ora passiamo al codice php.

La funzione da usare per pescare l'html da una pagina presente su un altro sito internet è la file_get_contents.

Quindi il codice potrebbe essere una cosa del genere:
$source_html=file_get_contents($url);
Dove ovviamente la variabile $url contiene l'indirizzo del sito web da cui vogliamo pescare i dati.

Se tutto è andato a buon fine, ora nella variabile $source_html avremo tutto l'html della pagina che ci interessa.
Per vedere che effettivamente sia così, facciamo un bel:
echo $source_html;
Il risultato dovrebbe essere la pagina originale clonata dentro la nostra pagina web.

Un altro metodo per pescare il codice html da un altro sito è quello di usare le curl.

Bene, ora avete capito come prendere il codice sorgente da un altro sito e salvarlo in una variabile php.

Adesso non vi resta che la parte più difficile, pulire il codice html.
Per far ciò potreste usare la funzione strip_tags().
$source_html=strip_tags($source_html);
Se invece volete far sparire tutto il codice html risparmiando però qualche tag, basta che lo aggiungete come parametro, come ho scritto qui di seguito per il tag td.
$source_html=strip_tags($source_html,"<td>");

Prima di fare qualsiasi pulizia del codice però, apritelo così com'è, perchè dovete individurare i vari delimitatori e dovete trovare una logica per estrapolare solo i dati che vi servono.

Se siete bravi con le espressioni regolari, vi lascio un link utile:
http://php.net/manual/it/reference.pcre.pattern.syntax.php

Io che invece non sono un maestro di regex, ho preferito districarmi con le seguenti funzioni: substr e strpos.

Ad esempio, se so che nell'html il nome dell'autore del libro è preceduto sempre dalla parola Autore, mi basterà trovare quella parola del codice (meglio ancora se ha qualche carattere univoco in più, tipo i due punti, es Autore:) e tagliare tutto ciò che c'è prima.
Ovviamente bisogna individuare anche il delimitatore finale, altrimenti non si riuscirà mai ad isolare l'autore dal resto delle informazioni.
Facciamo quindi finta che nel codice html rimasto dalla pagina originale ci sia scritto "bla bla bla Autore: Pippo Manzo</td> bla bla bla".
Innanzitutto va precisato che in questo esempio il tag td lo vedo perchè l'ho risparmiato dalla strip_tags, e l'ho risparmiato appunto perchè ho studiato prima l'html della pagina, vedendo che si chiudeva il td proprio dopo il nome dell'autore :)
Quindi posso recuperare l'autore dalla mia variabile $source_html facendo:

$autore0=substr($source_html,strpos($source_html,"Autore:"));
$autore1=substr($autore0,0,strpos($autore0,"</td>"));
$autore=trim(str_replace("Autore:","",$autore1));

Che tradotto vuol dire che:
Salvo nella variabile $autore0 un pezzo di codice html, quello che va dalla posizione in cui si trova la parola Autore: in poi (ovvero taglio tutto quello che c'è prima di Autore:).
Qui ho usato sia la funzione stropos per trovare la posizione della parola Autore:, sia la funzione substr per tagliare il codice hml nella porzione desiderata.
Poi ho fatto lo stesso per tagliare tutto dalla posizione 0 (ovvero dall'inizio del contenuto della variabile $autore0) alla posizione in cui si trova il tag </td>, ottenendo così ad esempio: "Autore: Pippo Manzo".
Ma a me serve solo il nome Pippo Manzo, quindi uso la funzione str_replace per far sparire la parola Autore: (compresa di duepunti), e già che ci sono tolgo anche gli spazi vuoti con la funzione trim.

Un po' contorto come procedimento, ma questo è quello che uso di solito io :p
A volte potrebbe anche esser necessario splittare le variabili in un array con la funzione explode e poi ciclarle col ciclo for per ricavare e pulire più nominativi contemporaneamente... dipende dai casi insomma, e si può fare in tanti modi diversi... buon divertimento :)

ps se per caso avete problemi con accentate e caratteri speciali, leggete questo post

1 commenti so far

Piaciuto l'articolo? Lascia un commento!

EmoticonEmoticon