Come ottenere il contenuto (dati) da un altro sito con PHP
28 marzo 2008 7 commenti
Prendere il contenuto di un altro sito è stato il compito che doveva fare. Ho pensato che sarebbe stato facile, ma le cose uscì esattamente come ho in programma… Per fortuna, è riuscito! Imparare, è anche, e raccogliere informazioni da altri siti web su Internet.
La missione: ottenere il contenuto di un sito
Oggi, al lavoro, ha avuto il compito di "tirare" alcuni dei dati da un sito al "trapianto" in un estratto da un sito web che sto contribuendo a sviluppare. Quando ero ultimo compito non appena ricordato un momento in cui un amico ha fatto la stessa cosa (e, all'epoca, mi ha spiegato, più o meno, ha già fatto). Ho pensato che sarebbe stato molto facile compiere il compito, ma nel tempo, "ha ricordato" che non sono buono come il Gevã… rsrs
La soluzione: nativo di funzioni PHP e le espressioni regolari
Ho trascorso per la ricerca sul web, disperatamente alla ricerca di materiale di riferimento a espressioni regolari (che, come vedrete, è uno dei pilastri per la realizzazione di ottenere alcuni contenuti da un altro sito). Cerchi qui, alla ricerca di lì a chattare con i Gevã laminati su cerco di capire meglio tali espressioni regolari. Prima che, utilizzando un po ' "gambiarra", è riuscito a raggiungere il mio obiettivo.
La prima cosa da fare è prendere l'intero contenuto della pagina che si desidera "manipolare". A tal fine utilizza, per esempio, la funzione file_get_contents (). La riproduzione del contenuto del sito in una variabile, sarebbe bene ( 'll fare un esempio con lo stesso sito che ha dovuto spostare):
1 | $ Url = file_get_contents ( 'http://www.bcb.gov.br/'); |
Pronto, ora contiene la variabile $ url, corda, l'intero contenuto della home page del BCB.
Espressioni regolari
Qui è stato così facile, il difficile cattura è stata solo la porzione di pagina che volevo… Per questo, è necessario utilizzare le espressioni regolari!
Se non sai cosa sono le espressioni regolari, ci vai una breve (e incompleto…) spiegazione di ciò che sono le espressioni regolari, da Wikipedia:
Una espressione regolare in Information Technology, definisce uno standard per essere utilizzato per cercare o sostituire parole o di gruppi di parole. E 'un must per fare ricerche di alcune porzioni di testo.
Con le espressioni regolari è possibile identificare frammenti di parole o di gruppi di parole che corrispondono ( "partita") ad un certo livello ( "pattern"), che è "normale".
Di PHP ha diverse funzioni native di lavorare con le espressioni regolari. Basta sapere che ognuno serve e di uso di meneira corretta.
Ebbene, il prossimo passo verso la soluzione del problema è quello di individuare il modello che si desidera estrarre il sito. Nel caso, ho bisogno di un tavolo con alcuni tassi di cambio (si trova sulla destra, il sito della BCB). Osservando il codice sorgente, ho visto che l'informazione è in una tabella (semanticamente approccio corretto!); Inoltre, questa tabella è circondato tra i commenti HTML "<! - - HOME INDICATORI - ->" e "<! - - FIMINDICADORES -- --> ". Questa è una buona cosa, poiché facilita piuttosto a "identificare il pattern".
Spiegare meglio: il pattern cercato nel caso, è tutto ciò che è tra i commenti HTML "<! - - HOME INDICATORI - ->" e "<! - - FIMINDICADORES - ->." L'intera tabella è lì, per la mia felicità! :-)
Che cosa dobbiamo fare è quella di utilizzare una funzione PHP (per caso, ha scelto la preg_match_all ()) per la ricerca di una espressione regolare all'interno della variabile $ url, che contiene tutta la prima pagina del sito è dove la tabella.
Dopo tanto tempo di test vááárias espressioni regolari, sono giunto alla conclusione che renderebbe un piccolo mutreta. Ma in primo luogo, vorrei mostrare come il codice è fino ad ora.
1 2 | $ Url = file_get_contents ( 'http://www.bcb.gov.br/'); preg_match_all ( '/ MINERALI - >(. )<!--/ s', $ url, $ contenuto); |
Spiegando: il primo argomento della funzione, è lo standard che io cerco, la seconda, è dove io proverò e la terza, guardia in un array tutte le occorrenze delle parole ricercate. Per la maggior parte dei casi, possono essere stati buoni, qui, ma non ho avuto nessun problema, ancora bisogno di un paio di righe di codice.
Attualmente, la variabile $ content contiene un array con le occorrenze trovate. Utilizzando un print_r (), scoperto in che posizione, esattamente quello che stavo cercando: $ contenuto [0] [0].
Facendo un "mutreta"
Per fare questo "mutreta", il gioco contenuto della matrice di posizione a un'altra variabile (al fine di agevolare la manipolazione).
1 2 3 | $ Url = file_get_contents ( 'http://www.bcb.gov.br/'); preg_match_all ( '/ MINERALI - >(. )<!--/ s', $ url, $ contenuto); $ visualizzazione = $ Contenuto [0] [0]; |
Ci sono stati frammenti di ciò che mi è stato restituito (vale a dire la tabella con i tassi di cambio) che non ho voluto apparire sul sito (come alcuni link). Così ho deciso di ritirare la loro funzione di str_replace (), che sostituisce porzioni di stringhe. E 'possibile, come un argomento, passare un array. Così per il momento si avvicina e la fine, il codice è questo:
1 2 3 4 5 | $ Url = file_get_contents ( 'http://www.bcb.gov.br/'); preg_match_all ( '/ MINERALI - >(. )<!--/ s', $ url, $ contenuto); $ visualizzazione = $ Contenuto [0] [0]; ritirare $ = array ( 'maggior parte delle valute', 'Copom minuto', 'più', 'MINERALI ->','<!--'); $ display = str_replace ( $ Ritirare,'', $ display); |
In altre parole, dove alcuni degli elementi appaiono nella matrice $ $ ritirare una visualizzazione, verrà sostituito da "" (niente…). Si noti che gli ultimi due elementi della matrice sono "inquinamento" inutili, che è venuto a causa di mia pigrizia a fare una espressione regolare più elaborata. :-)
Infine…
Dopo di che, solo mandar visualizzazione sullo schermo che "sobrou" tagliare il contenuto della home page del sito BCB.
1 2 3 4 5 6 | $ Url = file_get_contents ( 'http://www.bcb.gov.br/'); preg_match_all ( '/ MINERALI - >(. )<!--/ s', $ url, $ contenuto); $ visualizzazione = $ Contenuto [0] [0] </ span>; ritirare $ = array ( 'maggior parte delle valute', 'Copom minuto', 'più', '$ ->','<!--') MINERALI display = str_replace ($ ritirare,'', $ display); echo $ DISPLAY; |
E se il server non permette la funzione file_get_contents ()?
Ci sono molti server che, per varie ragioni (soprattutto "sicurezza"), non consentono di utilizzare la funzione file_get_contents (). Per questi casi, è possibile immettere una variabile qualsiasi pagina esterna utilizzando il seguente codice (dopo aver domanda spiegazioni nel manuale ufficiale di PHP):
1 2 3 4 5 6 7 | $ Ch = curl_init (); $ timeout = 0; curl_setopt ($ ch, CURLOPT_URL, 'O_SITE_QUE_VOCE_QUER'); curl_setopt ($ ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt ($ ch, CURLOPT_CONNECTTIMEOUT, $ timeout); $ content = curl_exec ( $ Ch); curl_close ($ ch); |
Quindi, il contenuto della pagina "O_SITE_QUE_VOCE_QUER" sarà nella variabile $ content.
Conclusione
Quindi, del personale, di ritirare una parte dei contenuti di un sito web (con l'utilizzo di PHP), i passi sono:
- Imparare che la pagina è che il contenuto fosse accurato;
- Riprodurre il contenuto del sito in una variabile;
- Estrarre le parole che si desidera utilizzare le espressioni regolari;
- Se necessario, tagliare alcune cose più il risultato della ER;
- Visualizzazione schermo del risultato finale.
Il grande salto del gatto in questo caso è se fare con le espressioni regolari; cosa, mi informano, ma si impara facendo! E facendo molto! Leggere i riferimenti alla fine di questo articolo e trovare più materiale su Internet al riguardo.
Altra cosa importante è: si prega di tenere presente che, come lei sta assumendo il contenuto di un sito in cui il cambiamento che la sua struttura, molto probabilmente sarà necessario modificare l'espressione regolare, anche.
Essere consapevoli di una cosa: se lei, sviluppatore web, non ancora specificato usare le espressioni regolari, potete essere certi che la sua ora giunto vai!
Riferimenti nazionali
Espressioni regolari - Guida rapida alla consultazione
Questa è la guida di Aurelio Marino Jargas, eccellente per imparare le espressioni regolari e di consultare in tempo di serraggio!
Articolo di vita nel Linux, Marcelo Santos Araujo, con una introduzione a espressioni regolari.
Riferimenti internazionali
Sito dedicato a espressioni regolari.
Espressione regolare Biblioteca
Biblioteca virtuale di espressioni regolari.
Per testare le espressioni regolari in tempo reale!














Eccellente, sr.Tárcio! Arriva con limone e fatto una limonata. L'articolo è stato molto buono, congratulazioni!
Grazie, Gevã!
Il 50% è il tuo credito! D =
Abraços!
Ricorda che con l'uso di XHTML pagine nella struttura di questo è inutile, dal momento che l'estrazione dei dati può essere fatto esattamente allo stesso modo che i dati estratti da un XML.
@ Rafael Eduardo Kassner
Ciao, Rafael, OK?
Molto interessante il fatto che lei ha citato! Esso potrebbe essere un esempio in modo che possiamo imparare?
Abraços!
Grazie a portata di mano!
Persone che vogliono approfondire, vai Esiste un collegamento sul grande ER:
http://guia-er.sourceforge.net/
Per me è stato molto utile!
@ Juliano
Grazie per aver scelto di ricordare il sito di Aurelio. Meglio anche acquistare il libro è il riferimento egli ha fatto, ma per le consultazioni on-line, è molto buono!
Grazie per la visita!
Trackback on August 26, 2008