In questo tutorial vedremo come implementare una classe PHP per lo scraping delle pagine HTML.
La nostra classe dovrà avere un unico metodo pubblico che restituirà il contenuto HTML della pagina e la sua rappresentazione DOM usando la classe core DOMDocument
di PHP.
Useremo curl avendo cura di specificare uno User-Agent e di verificare che il contenuto restituito sia effettivamente una pagina HTML. Inoltre forniremo l'opzione di omettere la verifica sul certificato SSL a scopo di debugging o quando la pagina non è servita con il protocollo HTTPS.
Nel parsing del DOM della pagina disabiliteremo i Warning della libreria libXML in quanto non si può sapere in anticipo se la pagina richiesta contenga codice HTML valido.
class Scraper
{
private $url;
private $skipSSL;
public function __construct($url, $skipSSL = false)
{
$this->url = $url;
$this->skipSSL = $skipSSL;
}
public function get()
{
return $this->parsePage();
}
private function parsePage()
{
$page = $this->getPage();
if(is_null($page)) {
return $page;
}
$document = new DOMDocument();
libxml_use_internal_errors(true);
$document->loadHTML($page);
return [
'html' => $page,
'document' => $document
];
}
private function getPage()
{
if(!filter_var($this->url, FILTER_VALIDATE_URL)) {
return null;
}
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $this->url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, true);
if($this->skipSSL) {
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
}
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2');
$response = curl_exec($ch);
$contentType = curl_getinfo($ch, CURLINFO_CONTENT_TYPE);
if(curl_error($ch) || strstr($contentType, 'text/html') === false) {
return null;
}
curl_close($ch);
return $response;
}
}
Esempio d'uso:
require_once 'lib/Scraper.php';
$scraper = new Scraper('https://gabrieleromanato.com');
print_r($scraper->get());