Curl è uno dei moduli più potenti di php, permette di inviare post e get a un sito web e di recuperarne il risultato, ci sono molti sistemi per scaricare una pagina web dal propio sito sicuramente usare curl (o una libreria che lo utilizza) è la cosa migliore, questa funzione è il primo passo verso la realizzazione di un bot, diamo un occhiata su come funziona curl…
Vediamo come effettuare una semplice chiamata a una pagina web utilizzando la libreria curl, in questo esempio andremo a fare una ricerca su google, ma la funzione è piuttosto generale e può essere usata con diversi siti, per completezza c’è da aggiungere che per questa operazione si poteva usare anche la funzione get_file_contents nativa di php, tuttavia usando get_file_contents non era possibile settare quasi nulla e molti siti bloccano le richieste da parte di client senza agent o referer settato.
Ecco la funzione getWebPage e il suo uso con google:
function getWebPage( $url ){ /** * Qui settiamo le opzioni base, in caso ci fosse bisogno di post si può usare: * CURLOPT_POST => 1, //Diciamo a curl che vogliamo usare il post. * CURLOPT_POSTFIELDS => 'parametro1=ciao //impostiamo i field di post **/ $options = array( CURLOPT_RETURNTRANSFER => true, // ritorna la pagina CURLOPT_HEADER => false, // non ritornare l'header CURLOPT_REFERER => $url, // settiamo il referer CURLOPT_FOLLOWLOCATION => true, // seguiamo i redirects CURLOPT_ENCODING => "", // tutti gli encodings CURLOPT_USERAGENT => "Mozilla/5.0 (Windows NT 6.1; rv:2.0) Gecko/20100101 Firefox/4.0", // L'identità del browser CURLOPT_AUTOREFERER => true, // setta il referer nel redirect CURLOPT_CONNECTTIMEOUT => 120, // timeout sulla connessione CURLOPT_TIMEOUT => 120, // timeout sulla risposta CURLOPT_MAXREDIRS => 10, // fermati dopo il decimo redirect ); $ch = curl_init( $url ); // impostiamo l'url per il download curl_setopt_array( $ch, $options ); //settiamo le opzioni $content = curl_exec( $ch ); //facciamo richiesta della pagina $err = curl_errno( $ch ); $errmsg = curl_error( $ch ); $header = curl_getinfo( $ch ); curl_close( $ch ); $header['errno'] = $err; //eventuali errori $header['errmsg'] = $errmsg; //header $header['content'] = $content; //il contenuto della pagina quello che ci interessa return $header['content']; } // Chiamata d'esempio $query_search = 'BisonTech.net'; var_dump(getWebPage('http://www.google.it/search?q=' . $query_search));
Una volta ottenuto il codice è possibile parsare o scambiare dati con altri siti usando xml o json.
Come potete vedere nella funzione c’è la possibilità di usare il Post aggiungendo le opzioni CURLOPT_POST e CURLOPT_POSTFIELDS, tuttavia se vi serve il post forse dovreste prendere in considerazione qualcosa di più alto livello delle chiamate dirette al curl, un buon esempio è l’oggetto Zend_Http_Client dello Zend Framework che offre un vero e proprio client web.
Attenzione: NON abusate di questo sistema poichè molti siti (compreso google) bannano gli ip se si usa il loro servizio con sistemi automatici. Inoltre se dovete usare funzioni del genere in produzione su siti di medio/alto traffico consiglio di prevedere una sorta di sistema di cache ne gioverà sia il vostro sito che quello target, ad esempio se 2 utenti nel giro di 1 ora fanno la stessa ricerca su google, è inutile ripetere la ricerca basta memorizzare il risultato da qualche parte in locale e restituire quello alla seconda ricerca.