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 ?
Réponses
Trop de publicités?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);
}
}
?>
J'aimerais recommander ce cours que j'ai découvert récemment. Analyseur DOM HTML simple
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
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());
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.