RSS
 

Usare Curl e Php per prendere il contenuto di una pagina web

20 nov

Salve gente,
oggi voglio presentarvi una funzioncina che potrebbe tornarvi utile… Questa piccola guida è rivolta sopratutto ai programmatori php che si trovano spesso di fronte a problemi che per essere risolti utilizzano il web-scraping .

In Particolare, La mia funzione fa uso di php+curl per prendere il contenuto servito dalla pagina richiesta. L’uso della libreria curl permette di gestire molte più informazioni della semplice chiamata a fopen..

Inoltre curl, nei vari benchmark risulta essere ben 200 volte più veloce a serivire le richieste della normale chiamata a fopen(‘http….’);

Qui di seguito vi lascio il mio codice sorgente free.

Input: url della pagina da crawlare

Output: contenuto della pagina oppure null

Features: lo script ha un set limitato di user agent e li utilizza per simulare una vera chiamata a browser ( alcuni server potrebbero non servire affatto una risposta se il campo User-Agent non è settato )

<?php
$someUA = array (
"Mozilla/5.0 (Windows; U; Windows NT 6.0; fr; rv:1.9.1b1) Gecko/20081007 Firefox/3.1b1",
"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.1) Gecko/2008070208 Firefox/3.0.0",
"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/0.4.154.18 Safari/525.19",
"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.27 Safari/525.13",
"Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30)",
"Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.40607)",
"Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.1; .NET CLR 1.1.4322)",
"Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.1; .NET CLR 1.0.3705; Media Center PC 3.1; Alexa Toolbar; .NET CLR 1.1.4322; .NET CLR 2.0.50727)",
"Mozilla/45.0 (compatible; MSIE 6.0; Windows NT 5.1)",
"Mozilla/4.08 (compatible; MSIE 6.0; Windows NT 5.1)",
"Mozilla/4.01 (compatible; MSIE 6.0; Windows NT 5.1)");
function getRandomUserAgent ( ) {
	srand((double)microtime()*1000000);
	global $someUA;
	return $someUA[rand(0,count($someUA)-1)];
}
function getContent ($url) {

	// Crea la risorsa CURL
	$ch = curl_init();

	// Imposta l'URL e altre opzioni
	curl_setopt($ch, CURLOPT_URL, $url);
	curl_setopt($ch, CURLOPT_HEADER, 0);
	curl_setopt($ch, CURLOPT_USERAGENT, getRandomUserAgent());
	curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
	// Scarica l'URL e lo passa al browser
	$output = curl_exec($ch);
	$info = curl_getinfo($ch, CURLINFO_HTTP_CODE);
	// Chiude la risorsa curl
	curl_close($ch);
	if ($output === false || $info != 200) {
	  $output = null
	}
	return $output;

}
?>

Per utilizzare questa semplice funzione basterà chiamare la funzione getContent con argomento l’url completo della pagina da ricevere.

Saluti, Andrea

Share and Enjoy:
  • del.icio.us
  • Technorati
  • Digg
  • Google Bookmarks
  • Facebook
  • Mixx
 
 

Tags: ,

Leave a Reply

 
 
  1. John Brown

    maggio 27, 2009 at 11:00 pm

    Att.ne!
    La chiamata alla funzione curl_getinfo(CURLINFO_HTTP_CODE); prende in realtà due parametri: la chiamata giusta dovrebbe essere:
    curl_getinfo($ch, CURLINFO_HTTP_CODE);

     
  2. Simulare un User-Agent utilizzando CURL | Mr.Webmaster – Blog

    luglio 26, 2010 at 1:15 am

    [...] tipici dei più comuni browser (come IExploer o Firefox). Di seguito un interessante codice che ho trovato in rete sul blog di Andrea [...]

     
  3. liuk

    settembre 1, 2010 at 10:01 am

    ciao, scusa l’ignoranza ma non riesco a far girare il codice che hai riportato, in particolare non trovo dove definisci la costante CURLINFO_HTTP_CODE, mi puoi aiutare? l’argomento mi interessa e volevo capire meglio come usare questa tecnica

     
  4. veke87

    settembre 1, 2010 at 10:14 am

    liuk scrivi così :)

    curl_getinfo($ch, CURLINFO_HTTP_CODE)

     
  5. liuk

    settembre 9, 2010 at 1:01 pm

    grazie veke87, ora lo script gira, purtroppo non nel mio caso, sto cercando di dialogare con delle api usando cUrl, ma questa api ha bisogno di una chiamata particolare…

     
  6. liuk

    settembre 9, 2010 at 2:40 pm

    ecco ho capito perchè non ottenevo quello che volevo, il problema era che cercavo di visualizzare l’xml che mi torna dal browser senza aver passato l’header giusta, con l’header ora vedo l’xml formattato correttamente
    [header ("Content-Type:text/xml");]

     
 

wordpress seo