PHP: creare uno scraper

Short link

Uno scraper è un piccolo applicativo che estrae dati dalle pagine web. Implementare uno scraper in PHP richiede una conoscenza di base delle funzioni di stream e delle espressioni regolari di tipo PCRE (Perl-Compatible Regular Expression). Nell'esempio che segue vedremo come estrarre i miei ultimi post dalla mia pagina personale sul blog di Html.it.

Per prima cosa abbiamo bisogno di caricare in memoria la pagina di destinazione come stringa:


$page = file_get_contents('http://blog.html.it/author/gabroman/');

Ora la variabile $page contiene tutta la marcatura e i contenuti della pagina. A questo punto occorre operare una ricerca usando le espressioni regolari. Abbiamo bisogno di estrarre tutte le ricorrenze dei link che puntano ai miei post. Per questo useremo la funzione preg_match_all(). Il terzo parametro di questa funzione conserva un array contenente tutti i riscontri al pattern passato come primo parametro:


preg_match_all('#<a href="http://blog.html.it/\d+/\d+/\d+/.+/" title="URL permanente di questo post">.+</a>#', $page, $matches);

Il pattern seleziona tutti i link in cui la stringa http://blog.html.it/ sia seguita da una combinazione di slash e cifre e quindi da qualsiasi altro carattere. Questo pattern seleziona URL del tipo http://blog.html.it/07/12/2011/titolo-articolo/. Ovviamente è fondamentale che sia anche presente la stringa title="URL permanente di questo post" per essere certi che stiamo selezionando link che puntano a post.

Ci interessano solo i primi cinque post, quindi passiamo usiamo la funzione array_slice() usando l'array $matches che contiene tutti i link selezionati dall'espressione regolare:


$links = array_slice($matches[0], 0, 5);

Infine, effettuiamo un semplice loop sul nuovo array per visualizzare tutti i link:


$html = '<ul>' . "\n";
foreach($links as $link) {
  
  $html .= '<li>' . $link . '</li>' . "\n";


}
$html .= '</ul>' . "\n";
echo $html;

Potete visionare l'esempio finale in questa pagina.

L'autore

Gabriele Romanato, sviluppatore web full stack specializzato in siti, applicativi web ed e-commerce con Node.js e PHP.