ultimate - web scraping php example




Come implementare un web scraper in PHP? (10)

In realtà sto cercando di grattare BibleGateway.com in quanto non forniscono un'API per accedere ai versi di un'app Web che sto cercando di creare.

Sembra che tu stia provando a 'hotlink' piuttosto che raschiare, ovvero aggiornare in tempo reale in base al loro contenuto del sito?

Questo tutorial è abbastanza buono:

http://www.merchantos.com/makebeta/php/scraping-links-with-php/

Potresti anche voler guardare Prowser.

Quali funzioni PHP integrate sono utili per il web scraping? Quali sono alcune buone risorse (web o stampa) per essere subito aggiornato sul web scraping con PHP?



Classe raschietto dal mio framework:

<?php

/*
    Example:

    $site = $this->load->cls('scraper', 'http://www.anysite.com');
    $excss = $site->getExternalCSS();
    $incss = $site->getInternalCSS();
    $ids = $site->getIds();
    $classes = $site->getClasses();
    $spans = $site->getSpans(); 

    print '<pre>';
    print_r($excss);
    print_r($incss);
    print_r($ids);
    print_r($classes);
    print_r($spans);        

*/

class scraper
{
    private $url = '';

    public function __construct($url)
    {
        $this->url = file_get_contents("$url");
    }

    public function getInternalCSS()
    {
        $tmp = preg_match_all('/(style=")(.*?)(")/is', $this->url, $patterns);
        $result = array();
        array_push($result, $patterns[2]);
        array_push($result, count($patterns[2]));
        return $result;
    }

    public function getExternalCSS()
    {
        $tmp = preg_match_all('/(href=")(\w.*\.css)"/i', $this->url, $patterns);
        $result = array();
        array_push($result, $patterns[2]);
        array_push($result, count($patterns[2]));
        return $result;
    }

    public function getIds()
    {
        $tmp = preg_match_all('/(id="(\w*)")/is', $this->url, $patterns);
        $result = array();
        array_push($result, $patterns[2]);
        array_push($result, count($patterns[2]));
        return $result;
    }

    public function getClasses()
    {
        $tmp = preg_match_all('/(class="(\w*)")/is', $this->url, $patterns);
        $result = array();
        array_push($result, $patterns[2]);
        array_push($result, count($patterns[2]));
        return $result;
    }

    public function getSpans(){
        $tmp = preg_match_all('/(<span>)(.*)(<\/span>)/', $this->url, $patterns);
        $result = array();
        array_push($result, $patterns[2]);
        array_push($result, count($patterns[2]));
        return $result;
    }

}
?>

Ecco un tutorial OK (link rimosso, vedi sotto) sul web scraping usando cURL e file_get_contents . Di leggere anche le prossime parti.

(rimosso il collegamento ipertestuale diretto a causa di avvertenze sul malware)

http://www.oooff.com/php-scripts/basic-php-scraped-data-parsing/basic-php-data-parsing.php



O userei libcurl o LWP di Perl (libwww per perl). C'è un libwww per PHP?


Raschiare generalmente comprende 3 passaggi:

  • per prima cosa OTTIENE o POST la tua richiesta a un URL specificato
  • successivamente si riceve l'html che viene restituito come risposta
  • finalmente estrai da quel codice HTML il testo che vorresti racimolare.

Per eseguire i passaggi 1 e 2, di seguito è riportata una semplice classe php che utilizza Curl per recuperare pagine Web utilizzando GET o POST. Dopo aver recuperato il codice HTML, devi semplicemente usare le espressioni regolari per completare il passaggio 3 analizzando il testo che desideri analizzare.

Per le espressioni regolari, il mio sito di tutorial preferito è il seguente: Esercitazione sulle espressioni regolari

Il mio programma preferito per lavorare con RegExs è Regex Buddy . Ti consiglierei di provare la demo di quel prodotto anche se non hai intenzione di acquistarlo. È uno strumento inestimabile e genererà persino il codice per le regex che fai nella tua lingua preferita (incluso php).

Uso:



$curl = new Curl(); $html = $curl->get("http://www.google.com");

// now, do your regex work against $html

Classe PHP:



<?php

class Curl
{       

    public $cookieJar = "";

    public function __construct($cookieJarFile = 'cookies.txt') {
        $this->cookieJar = $cookieJarFile;
    }

    function setup()
    {


        $header = array();
        $header[0] = "Accept: text/xml,application/xml,application/xhtml+xml,";
        $header[0] .= "text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5";
        $header[] =  "Cache-Control: max-age=0";
        $header[] =  "Connection: keep-alive";
        $header[] = "Keep-Alive: 300";
        $header[] = "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7";
        $header[] = "Accept-Language: en-us,en;q=0.5";
        $header[] = "Pragma: "; // browsers keep this blank.


        curl_setopt($this->curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.8.1.7) Gecko/20070914 Firefox/2.0.0.7');
        curl_setopt($this->curl, CURLOPT_HTTPHEADER, $header);
        curl_setopt($this->curl,CURLOPT_COOKIEJAR, $this->cookieJar); 
        curl_setopt($this->curl,CURLOPT_COOKIEFILE, $this->cookieJar);
        curl_setopt($this->curl,CURLOPT_AUTOREFERER, true);
        curl_setopt($this->curl,CURLOPT_FOLLOWLOCATION, true);
        curl_setopt($this->curl,CURLOPT_RETURNTRANSFER, true);  
    }


    function get($url)
    { 
        $this->curl = curl_init($url);
        $this->setup();

        return $this->request();
    }

    function getAll($reg,$str)
    {
        preg_match_all($reg,$str,$matches);
        return $matches[1];
    }

    function postForm($url, $fields, $referer='')
    {
        $this->curl = curl_init($url);
        $this->setup();
        curl_setopt($this->curl, CURLOPT_URL, $url);
        curl_setopt($this->curl, CURLOPT_POST, 1);
        curl_setopt($this->curl, CURLOPT_REFERER, $referer);
        curl_setopt($this->curl, CURLOPT_POSTFIELDS, $fields);
        return $this->request();
    }

    function getInfo($info)
    {
        $info = ($info == 'lasturl') ? curl_getinfo($this->curl, CURLINFO_EFFECTIVE_URL) : curl_getinfo($this->curl, $info);
        return $info;
    }

    function request()
    {
        return curl_exec($this->curl);
    }
}

?>


Raschiare può essere piuttosto complesso, a seconda di cosa vuoi fare. Leggi questa serie di tutorial su The Basics Of Writing A Scraper in PHP e vedi se riesci a fare i conti con esso.

Puoi utilizzare metodi simili per automatizzare le iscrizioni ai moduli, gli accessi, persino il falso clic sugli annunci! I principali limiti nell'utilizzo di CURL sono che non supporta l'uso di javascript, quindi se stai cercando di raschiare un sito che usa AJAX per la paginazione, ad esempio, può diventare un po 'complicato ... ma ci sono ancora dei modi per aggirarlo!



ScraperWiki è un progetto piuttosto interessante. Ti aiuta a creare scrapers online in Python, Ruby o PHP - sono riuscito a ottenere un semplice tentativo in pochi minuti.







screen-scraping