61 votes

Comment implémenter un scraper web en PHP ?

Quelles fonctions PHP intégrées sont utiles pour le web scraping ? Quelles sont les bonnes ressources (web ou papier) pour se familiariser avec le web scraping avec PHP ?

50voto

tyshock Points 1098

Le scraping comprend généralement 3 étapes :

  • Vous devez d'abord envoyer votre requête GET ou POST à une URL spécifiée
  • Ensuite, vous recevez le html qui est retourné comme le réponse
  • que vous avez finalement analysé à partir de ce html le texte que vous voulez récupérer.

Pour accomplir les étapes 1 et 2, vous trouverez ci-dessous une classe php simple qui utilise Curl pour récupérer des pages Web en utilisant GET ou POST. Après avoir récupéré le HTML, il suffit d'utiliser des expressions régulières pour accomplir l'étape 3 en analysant le texte que vous souhaitez récupérer.

Pour les expressions régulières, mon site de tutoriel préféré est le suivant : Tutoriel sur les expressions régulières

Mon programme favori pour travailler avec les RegExs est Regex Buddy . Je vous conseille d'essayer la démo de ce produit même si vous n'avez pas l'intention de l'acheter. C'est un outil inestimable qui générera même du code pour les regex que vous ferez dans le langage de votre choix (y compris le 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);
    }
}

?>

34voto

SoulBlighter Points 317

J'aimerais recommander ce cours que j'ai découvert récemment. Analyseur DOM HTML simple

27voto

crono Points 1626

Il existe un Livre "Webbots, Spiders, and Screen Scrapers : Un guide pour le développement d'agents Internet avec PHP/CURL". sur ce sujet - voir une critique aquí

PHP-Architect l'a couvert dans un article très bien écrit dans la rubrique Numéro de décembre 2007 par Matthew Turland

15voto

SalmanPK Points 6649

Je recommande Goutte, un simple scraper Web PHP .

Exemple d'utilisation:-

Créer une instance de Client Goutte (qui étend Symfony\Component\BrowserKit\Client ):

use Goutte\Client;

$client = new Client();

Faites des demandes auprès de la request() méthode :

$crawler = $client->request('GET', 'http://www.symfony-project.org/');

El request renvoie un Crawler objet ( Symfony\Component\DomCrawler\Crawler ).

Cliquez sur les liens :

$link = $crawler->selectLink('Plugins')->link();
$crawler = $client->click($link);

Soumettre les formulaires :

$form = $crawler->selectButton('sign in')->form();
$crawler = $client->submit($form, array('signin[username]' => 'fabien', 'signin[password]' => 'xxxxxx'));

Extraire les données :

$nodes = $crawler->filter('.error_list');

if ($nodes->count())
{
  die(sprintf("Authentification error: %s\n", $nodes->text()));
}

printf("Nb tasks: %d\n", $crawler->filter('#nb_tasks')->text());

11voto

Joe N Points 399

ScraperWiki est un projet assez intéressant. Il vous aide à construire des scrapers en ligne en Python, Ruby ou PHP. J'ai pu mettre en place une tentative simple en quelques minutes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X