Informazioni

  • Copyright © 2022 Gabriele Romanato
  • Codice fiscale: RMNGRL78L20A485X
  • Privacy Policy

Creare una classe PHP per lo scraping di pagine HTML

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());
Precedente Parsing e conversione in JSON di un feed RSS Parsing e conversione in JSON di un feed RSS
Estrarre i link interni di una pagina remota Successivo Estrarre i link interni di una pagina remota