Web Scraping avec PHP : Le guide ultime du Web Scraping
Sorin-Gabriel Marica le 14 janvier 2023
L'internet est un vaste espace qui compte plus de 4,7 milliards d'utilisateurs et qui ne cesse de croître. Pour donner un ordre d'idée, plus de 50 % de la population mondiale utilise l'internet en 2018.
Bien entendu, plus d'utilisateurs signifie aussi plus de données. À l'heure actuelle, l'internet est tellement vaste qu'on estime que Google, Amazon, Microsoft et Facebook stockent à eux seuls environ 1,2 million de téraoctets.
Même une fraction de ces informations peut créer de nouvelles opportunités commerciales. Il n'est donc pas étonnant que le web scraping soit devenu si populaire.
Comprendre le web scraping
La richesse des données de l'internet est malheureusement disséminée sur des milliards de sites web. Les développeurs ont donc besoin d'un moyen de les collecter et de les traiter, afin de fournir aux utilisateurs de nouveaux produits innovants. Cependant, la collecte manuelle d'informations n'est certainement pas une bonne idée, car le volume est souvent trop important et les données changent continuellement.
La solution consiste à l'extraire automatiquement. C'est ce que fait le web scraping en quelques mots.
Pourquoi vous devriez rechercher des données
Plus il y a d'informations, plus il y a d'idées, d'opportunités et d'avantages. Une fois traitées, ces informations peuvent s'avérer inestimables pour vous ou vos clients. Voici quelques exemples d'utilisation du web scraping :
- Outils de comparaison des prix - Scraping de plusieurs sites web pour obtenir une vue d'ensemble de la tarification d'un type de produit.
- Étude de marché - savoir qui sont vos principaux concurrents et ce qu'ils font.
- Apprentissage automatique - Collecte d'ensembles de données d'entraînement et de test pour un modèle d'apprentissage automatique.
- Toute idée nécessitant l'accès à une quantité considérable de données.
Par exemple, un cas d'utilisation possible est la création d'une application nutritionnelle qui permet aux utilisateurs d'ajouter leurs repas. Dans l'idéal, les utilisateurs n'auront qu'à ouvrir l'application, rechercher les produits qu'ils ont mangés, les ajouter à l'outil et suivre le nombre de calories supplémentaires qu'ils peuvent consommer par la suite.
Toutefois, l'outil doit fournir une liste exhaustive de tous les produits possibles et de leurs valeurs nutritionnelles. Cette liste peut être créée et mise à jour automatiquement en récupérant les informations nutritionnelles de plusieurs sites web.
Les défis du web scraping
Bien que le web scraping soit très pratique pour celui qui utilise le robot, il arrive que les sites web ne soient pas ravis de partager leur contenu et qu'ils essaient de vous en empêcher. Voici quelques-uns des moyens qu'ils peuvent choisir pour ce faire :
- Codes captcha - Toute page peut utiliser des codes captcha, même s'ils ne s'affichent pas. Lorsque vous effectuez plusieurs requêtes, un code captcha peut s'afficher et perturber votre scraper web.
- Blocage de l'IP - Certains sites web choisissent de bloquer votre IP lorsqu'ils constatent un trafic excessif en provenance de votre côté.
- Blocage géographique - Certains contenus peuvent n'être disponibles que dans certains pays, ou vous pouvez recevoir des données spécifiques à une région lorsque vous souhaitez obtenir des informations sur une autre.
- Javascript - La plupart des sites web actuels utilisent javascript d'une manière ou d'une autre. Certains affichent leur contenu de manière dynamique, ce qui complique les choses puisque la source de la page n'est pas la même que le contenu de la page rendue.
Surmonter ces défis peut demander beaucoup de travail, mais il y a des options. Pour vous aider, nous avons créé WebscrapingAPI, qui prend en charge tous ces problèmes tout en vous aidant à construire votre solution plus rapidement et avec moins de maux de tête.
Comprendre le web
Lorsqu'un internaute accède à un site web, son navigateur crée une requête HTTP (Hypertext Transfer Protocol). Une requête est un message envoyé par le client (l'ordinateur de l'utilisateur) au serveur (l'ordinateur où se trouve le site web), dans lequel le client spécifie ce qu'il souhaite recevoir.
Pour chaque demande envoyée, vous recevrez une réponse. Cette réponse peut être un succès ou une erreur, comme le fameux code d'erreur "404 page not found". Le contenu d'un site web se trouve généralement dans le corps de la réponse reçue du serveur.

Les requêtes et les réponses contiennent toutes deux un en-tête et un corps utilisés pour échanger des informations. En outre, les requêtes peuvent avoir plusieurs méthodes, la plus courante étant GET (utilisée lors de l'accès à une page web). Ces méthodes indiquent l'action que le client souhaite effectuer.
Par exemple, lors de l'enregistrement ou de la mise à jour de votre mot de passe sur un site web, vous souhaitez que vos données soient cachées dans le navigateur, et les sites web peuvent utiliser la méthode POST ou PUT pour ce type de requête.
L'en-tête d'une requête contient de nombreuses propriétés. Passons en revue les plus importantes :
- Hôte - Le nom de domaine du serveur.
- User-Agent - Détails sur le client qui a fait la demande, tels que le navigateur et le système d'exploitation.
- Cookie - Ensemble de propriétés associées au client.
- Accept - Paramètre utilisé pour recevoir la réponse du serveur dans un type spécifique tel que text/plain ou application/json.
Les requêtes ne concernent toutefois que les pages web. Elles concernent également les images, les styles et le code javascript, indépendamment de la page. Vous pouvez avoir un aperçu de toutes les requêtes effectuées par votre navigateur Google Chrome lors de l'accès à une page web en appuyant sur F12 sur une page, en choisissant l'onglet "Réseau" et en actualisant la page sur laquelle vous vous trouvez. Vous devriez voir à la fin quelque chose comme ceci :

Comprendre PHP
PHP est l'un des langages de programmation web les plus anciens et les plus populaires, utilisé pour les applications dorsales. Il existe depuis 1995 et en est aujourd'hui à sa 8e version.
Les programmeurs choisissent ce langage de programmation en raison de sa syntaxe simple et de sa facilité d'exécution, car tout ce dont vous avez besoin pour exécuter le code PHP est une machine sur laquelle PHP est installé. De plus, comme il existe depuis longtemps, il y a beaucoup de ressources et de support pour résoudre et déboguer les erreurs de PHP.
PHP a également de nombreux frameworks et CMS (Content Management System) populaires construits sur ce langage de programmation. Les exemples les plus connus sont WordPress, Drupal, Magento et Laravel.
Mais il y a aussi des inconvénients. Par exemple, il est plus difficile de récupérer du contenu dynamique que Python ou Javascript. Cependant, si vous n'avez besoin que d'informations provenant de pages simples, PHP est certainement une bonne solution, et il peut vous aider à sauvegarder ou à stocker les données récupérées beaucoup plus facilement.
Ce dont vous avez besoin
Tout va bien jusqu'à présent ? Prêt à créer votre premier scraper web ? Avant de commencer, vous devez disposer d'un moyen d'exécuter votre code PHP. Vous pouvez choisir un serveur Apache/Nginx avec PHP installé et exécuter le code directement depuis votre navigateur, ou vous pouvez exécuter le code depuis votre ligne de commande.
Simplifions-nous la vie en utilisant une bibliothèque pour traiter le contenu scrappé. Parmi les bibliothèques de scraping PHP les plus populaires, on trouve Goutte, Simple HTML DOM, Panther et htmlSQL. Vous pouvez également choisir de traiter le contenu à l'aide d'expressions régulières.
Pour ce guide, nous utiliserons Simple HTML DOM. Cependant, pour des requêtes plus avancées, nous utiliserons également la bibliothèque PHP appelée CURL.
Utilisation de HTML Dom simple
Simple HTML Dom est une bibliothèque développée pour les versions de PHP à partir de la 5.6, et elle nous permet d'accéder au contenu de la page d'une manière beaucoup plus facile - avec des sélecteurs. Vous pouvez télécharger la bibliothèque ici, et vous devriez également lire la documentation.
Dans le fichier zip du lien de téléchargement, vous n'aurez besoin que du fichier simple_html_dom.php, que vous devrez placer dans le même dossier que celui où vous écrirez le code du scraper.
Pour inclure la bibliothèque dans le code, vous n'avez besoin que de cette ligne de code :
include 'simple_html_dom.php' ; // Si la bibliothèque se trouve dans un autre dossier, il faut faire include 'path_to_library/simple_html_dom.php'
Installation de PHP-CURL
Bien que cela ne soit pas toujours nécessaire, vous devrez envoyer des en-têtes différents pour les requêtes plus avancées. L'utilisation de la bibliothèque PHP-CURL vous aidera.
Pour l'installer sur une machine Ubuntu, vous pouvez utiliser la commande suivante :
sudo apt-get install php-curl
Après avoir installé la bibliothèque, n'oubliez pas de redémarrer votre serveur Apache/Nginx.
Fabriquer son propre scraper web
Maintenant que nous avons tout ce qu'il nous faut, il est temps d'extraire les données ! Tout d'abord, vous devez choisir le site web et le contenu que vous souhaitez extraire. Pour cet article, nous allons extraire le contenu de la liste des films les mieux notés d'IMDB.
1. Inspecter le contenu du site
La plupart des contenus web sont affichés en HTML. Comme nous devons extraire un contenu spécifique de la source HTML, il est également nécessaire de la comprendre. Nous devons d'abord inspecter l'aspect de la source de la page pour savoir quels éléments extraire de la page.
Vous pouvez le faire dans Google Chrome en faisant un clic droit sur l'élément que vous souhaitez extraire et en choisissant "Inspecter l'élément". Cela devrait ouvrir une fenêtre dans votre navigateur avec la source de la page et les styles rendus des éléments. Dans cette fenêtre, le seul onglet que nous devons vérifier est "Elements", qui nous montrera comment le dom HTML de la page est structuré.

Par exemple, la page contient un tableau avec les classes "chart" et "full-width" dans l'image ci-dessus. Dans ce tableau, chaque cellule possède sa propre classe (posterColumn, titleColumn, etc.), que nous pouvons utiliser pour créer un sélecteur. Nous pouvons alors accéder uniquement aux données nécessaires.
Vous êtes confus ? Ne vous inquiétez pas, les étapes suivantes vous aideront à y voir plus clair.
2. Envoyer une requête depuis PHP
Envoyer une requête, dans ce cas, signifie essentiellement accéder au code HTML d'une page directement avec du code PHP. Il y a deux façons de le faire.
Tout d'abord, nous pouvons utiliser la bibliothèque PHP-CURL, qui nous permet également de modifier les en-têtes et le corps que nous envoyons dans notre requête.
<?php
header("Content-Type: text/plain"); // We choose to display the content as plain text
$ch = curl_init("https://www.imdb.com/chart/top/");
curl_setopt($ch, CURLOPT_HEADER, 0);
$response = curl_exec($ch); // Running the request
if (curl_error($ch)) {
echo curl_error($ch); // Displaying possible errors from the request
} else {
echo $response; // Displaying the content of the response
}
curl_close($ch);
?>
Une autre option consiste à utiliser la méthode file_get_contents($url) , mais cela peut s'avérer insuffisant dans certains cas. Pour envoyer des en-têtes à cette requête, vous devez utiliser un contexte créé avec la méthode stream_context_create.
<?php
header("Content-Type: text/plain"); // We choose to display the content as plain text
echo file_get_contents('https://www.imdb.com/chart/top/'); // We retrieve and display the contents of the response in a single line
?>
Vous devez décider de la méthode à utiliser en fonction de la complexité du racleur que vous souhaitez construire.
Les deux morceaux de code ci-dessus afficheront la source HTML de la page que nous scrappons, la même que celle qui est visible lorsque vous inspectez le site web. Nous utiliserons la première ligne du code pour afficher les résultats sous forme de texte/plain. Dans le cas contraire, les résultats seront affichés directement au format html.
S'il y a des différences dans la structure HTML, c'est qu'un code javascript s'exécute sur le site web et en modifie le contenu dès qu'un utilisateur y accède. Nous avons préparé une astuce pour résoudre ce problème dans la suite de l'article.
3. Extraire les données
De la page choisie, nous n'extrairons que le titre des films et la note associée à chacun d'entre eux. Comme nous l'avons vu précédemment, le contenu est affiché dans un tableau où chaque cellule a sa classe.
Nous pouvons ainsi choisir d'extraire toutes les lignes du tableau. Ensuite, nous recherchons dans chaque ligne les cellules qui nous intéressent.
C'est ce que devrait faire le morceau de code suivant :
<?php
header("Content-Type: text/plain"); // We choose to display the content as plain text
include 'simple_html_dom.php';
$html_dom = file_get_html('https://www.imdb.com/chart/top/'); // We retrieve the contents using file_get_html from simple_html_dom
$table_rows = $html_dom->find('table.chart tbody tr'); // Getting all of the table rows
foreach($table_rows as $table_row) {
$title_element = $table_row->find('.titleColumn a', 0);
$rating_element = $table_row->find('.ratingColumn strong', 0);
if (!is_null($title_element) && !is_null($rating_element)) { // Checking if the row has a title and a rating column
echo $title_element->innertext . ' has rating ' . $rating_element->innertext . PHP_EOL; // If it does then we print it
}
}
?>
Vous pouvez remarquer que nous avons utilisé le sélecteur "table.chart tbody tr" pour extraire toutes les lignes du tableau. Il est bon d'utiliser des sélecteurs aussi spécifiques que possible afin de pouvoir différencier les éléments dont vous avez besoin du reste.
Après avoir récupéré les lignes, nous les avons parcourues en boucle, à la recherche d'éléments de la classe titleColumn ou ratingColumn. Si le code en trouve, il affiche leur propriété innerText.
Il est important de noter que nous avons utilisé file_get_html au lieu de file_get_contents dans cet exemple. C'est parce que cette fonction provient de la bibliothèque simple_html_dom et qu'elle fonctionne comme une enveloppe pour la fonction file_get_contents.
4. Exporter les données
Dans les exemples ci-dessus, nous avons collecté les données du site et les avons affichées directement à l'écran. Cependant, vous pouvez également enregistrer les données en PHP assez facilement.
Vous pouvez enregistrer les données récupérées dans un fichier .txt, JSON, CSV, ou même les envoyer directement à une base de données. PHP est très doué pour cela. Il suffit de les stocker dans un tableau et de placer le contenu du tableau dans un nouveau fichier.
<?php
include 'simple_html_dom.php';
$scraped_data = [];
$html_dom = file_get_html('https://www.imdb.com/chart/top/'); // We retrieve the contents using file_get_html from simple_html_dom
$table_rows = $html_dom->find('table.chart tbody tr'); // Getting all of the table rows
foreach($table_rows as $table_row) {
$title_element = $table_row->find('.titleColumn a', 0);
$rating_element = $table_row->find('.ratingColumn strong', 0);
if (!is_null($title_element) && !is_null($rating_element)) { // Checking if the row has a title and a rating column
$scraped_data[] = [
'title' => $title_element->innertext,
'rating' => $rating_element->innertext,
];
}
}
file_put_contents('file.json', json_encode($scraped_data)); // Saving the scraped data in a .json file
// Saving the scraped data as a csv
$csv_file = fopen('file.csv', 'w');
fputcsv($csv_file, array_keys($scraped_data[0]));
foreach ($scraped_data as $row) {
fputcsv($csv_file, array_values($row));
}
fclose($csv_file);
?>
Le code ci-dessus prend le même contenu que celui que nous avons extrait précédemment et crée deux fichiers, un csv et un json, avec tous les films les mieux notés et leurs notes.
Conseils et astuces
1. Gestion des erreurs
Lorsque l'on code en PHP et que l'on récupère des données sur des sites web susceptibles de changer à tout moment, il est normal que des erreurs apparaissent. Les trois lignes suivantes, placées au début de tout script PHP, constituent un bon morceau de code que vous pouvez utiliser pour le débogage :
ini_set('display_errors', '1') ;
ini_set('display_startup_errors', '1') ;
error_reporting(E_ALL) ;
Ils vous aideront à identifier plus rapidement les problèmes dans votre code et à mettre à jour votre script si nécessaire.
2. Définition des en-têtes dans les requêtes pour PHP
Parfois, lorsque vous faites une demande, vous pouvez avoir besoin d'envoyer des en-têtes. Par exemple, lorsque vous travaillez avec une API, un jeton d'autorisation peut être nécessaire, ou vous pouvez vouloir que le contenu soit envoyé au format JSON plutôt qu'en texte brut. Vous pouvez ajouter des en-têtes à la fois avec curl et file_get_contents. Voici comment procéder avec curl :
$ch = curl_init("http://httpbin.org/ip") ;
curl_setopt($ch, CURLOPT_HEADER, [
'accept : application/json'
]) ;
$response = curl_exec($ch) ; // Exécution de la requête
Et pour file_get_contents :
$opts = [
"http" => [
"method" => "GET",
"header" => "accept : application/json\r\n"
]
] ;
$context = stream_context_create($opts) ;
$result = file_get_contents("http://httpbin.org/ip", false, $context) ;
3. Utiliser curl ou file_get_contents avec simple_html_dom
Lorsque nous avons extrait le contenu d'IMDB, nous avons utilisé la fonction file_get_html de simple_html_dom pour récupérer le contenu. Cette approche fonctionne pour les requêtes simples, mais pas nécessairement pour les requêtes plus complexes. Si vous devez envoyer des en-têtes, il est préférable d'utiliser l'une des méthodes décrites dans l'astuce précédente.
Pour les utiliser à la place de file_get_html, il suffit d'extraire le contenu et d'utiliser str_get_html pour le convertir en objet dom, comme ceci :
$opts = [
"http" => [
"method" => "GET",
"header" => "accept : text/html\r\n"
]
] ;
$context = stream_context_create($opts) ;
$result = file_get_contents("https://www.imdb.com/chart/top/", false, $context) ;
$html_dom = str_get_html($result) ;
Par ailleurs, il faut garder à l'esprit que simple_html_dom a par défaut certaines limites (qui se trouvent dans le fichier simple_html_dom.php). Par exemple, le contenu du site web peut contenir jusqu'à 600 000 caractères. Si vous souhaitez modifier cette limite, il vous suffit de la définir en haut de votre code avant d'inclure la bibliothèque simple_html_dom :
define('MAX_FILE_SIZE', 999999999);
4. Récupération de contenu dynamique
Si vous scrapez un site web dynamique, vous devez y accéder comme le ferait un navigateur. Sinon, vous ne pourrez pas extraire les données réelles et obtiendrez du code js à la place.
Vous devrez installer un pilote de navigateur, tel que chromium-chromedriver ou firefox-geckodriver. Extraire le contenu dynamique en PHP est une leçon plus avancée, mais si vous êtes intéressé, vous pouvez essayer de le faire en lisant la documentation de la bibliothèque panther.
Une autre solution beaucoup plus simple consiste à utiliser WebScrapingAPI, qui permet de résoudre la plupart des problèmes. L'API surmonte les blocages d'IP et les Captchas en utilisant notre réseau proxy tout en rendant le javascript. Résultat : vous disposez immédiatement d'un scraper avancé, ce qui réduit les temps de développement et d'attente.
Voici un exemple de code qui affichera le contenu de https://httpbin.org/ip directement en PHP, via notre API :
$content =
file_get_contents("https://api.webscrapingapi.com/v1?pi_key=YOUR_API_KEY&url=". urlencode('https://httpbin.org/ip')) ;
echo $content ;
Conclusion
Félicitations pour avoir atteint la fin ! Vous devriez maintenant avoir tout ce dont vous avez besoin pour construire votre Web Scraper avec PHP. Bien que nous n'ayons exploré que la bibliothèque simple_html_dom dans cet article, vous pouvez essayer d'autres bibliothèques populaires et voir par vous-même laquelle vous convient le mieux.
N'oubliez pas que les sites web sont en constante évolution et que leurs données peuvent être mises à jour du jour au lendemain. Pour y remédier, vous pouvez utiliser des sélecteurs plus spécifiques. Bien sûr, cela ne garantit pas que votre scraper fonctionnera éternellement, mais c'est un début. C'est la raison pour laquelle les scrapeurs de sites web nécessitent des mises à jour continues et fastidieuses.
Si vous n'avez pas envie de passer tout ce temps à rechercher et à adapter votre code, vous pouvez toujours essayer la version d'essai gratuite de WebScrapingAPI !
Nouvelles et mises à jour
Restez au courant des derniers guides et nouvelles sur le web scraping en vous inscrivant à notre lettre d'information.
We care about the protection of your data. Read our <l>Privacy Policy</l>.Privacy Policy.

Articles connexes

Explorez les complexités du scraping des données de produits Amazon avec notre guide approfondi. Des meilleures pratiques aux outils tels que l'API Amazon Scraper, en passant par les considérations juridiques, apprenez à relever les défis, à contourner les CAPTCHA et à extraire efficacement des informations précieuses.


Explorez le pouvoir de transformation du web scraping dans le secteur financier. Des données sur les produits à l'analyse des sentiments, ce guide donne un aperçu des différents types de données web disponibles pour les décisions d'investissement.


Plongez dans le rôle transformateur des données financières dans la prise de décision des entreprises. Comprendre les données financières traditionnelles et l'importance émergente des données alternatives.
