[{"data":1,"prerenderedAt":18},["ShallowReactive",2],{"article":3},{"id":4,"category":5,"slug":6,"title":7,"image":8,"page_image":9,"published_at":10,"updated_at":11,"meta_title":12,"meta_description":13,"meta_keywords":14,"content":15,"tags":16,"faqs":17},129,"blog","fr-php-for-data-harvesting-in-collaboration-with-a-trusted-proxy-website","PHP pour la collecte de données en collaboration avec un site web proxy de confiance","https://blog.dexodata.com/storage/uploads/previews/15-3-s-trusted-proxy-website-php-and-data-collection-cover-1032x491-058e15f3-9c89-4100-a80c-ca121dc343ea.webp","https://blog.dexodata.com/storage/uploads/covers/15-3-b-trusted-proxy-website-php-and-data-collection-cover-1032x491-accb4767-8ff9-4506-aa0e-4cf5aac6a61e.webp","2024/08/13","2024/07/31","Comment collecter des données en PHP avec un site web proxy de confiance","Exploration du potentiel de PHP pour le scraping sur Internet avec Dexodata, un site web proxy de confiance avec un pool de proxies géo-ciblés sur liste blanche.","trusted proxy website, geo targeted proxies, paid proxy free trial, proxies for social media","\u003C!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\" \"http://www.w3.org/TR/REC-html40/loose.dtd\">\n\u003C?xml encoding=\"utf-8\"?>\u003Chtml>\u003Cbody>\u003Cp>\u003Cem>\u003Cstrong>Contenu de l'article :\u003C/strong>\u003C/em>\u003C/p>\n\u003Cul>\n\u003Cli>\u003Ca href=\"#anchor1\">Scraping web avec PHP : bases et pr&eacute;requis\u003C/a>\u003C/li>\n\u003Cli>\u003Ca href=\"#anchor2\">Collecte de donn&eacute;es web avec PHP : sc&eacute;nario d'exemple\u003C/a>\u003C/li>\n\u003Cli>\u003Ca href=\"#anchor3\">&Eacute;volution. Biblioth&egrave;ques et outils\u003C/a>\n\u003Cul>\n\u003Cli>\u003Ca href=\"#anchor4\">Goutte\u003C/a>\u003C/li>\n\u003Cli>\u003Ca href=\"#anchor5\">Simple HTML DOM\u003C/a>\u003C/li>\n\u003Cli>\u003Ca href=\"#anchor6\">PHP Scraper\u003C/a>\u003C/li>\n\u003Cli>\u003Ca href=\"#anchor7\">PHP cURL pour les op&eacute;rations de scraping\u003C/a>\u003C/li>\n\u003C/ul>\n\u003C/li>\n\u003Cli>\u003Ca href=\"#anchor8\">Cr&eacute;ation d'un scraper : un sc&eacute;nario d'exemple\u003C/a>\u003C/li>\n\u003Cli>\u003Ca href=\"#anchor9\">Remarques finales\u003C/a>\u003C/li>\n\u003C/ul>\n\u003Cp>Le texte que vous &ecirc;tes en train de lire finalise notre long voyage &agrave; travers le domaine difficile du scraping web. Le \u003Ca href=\"https://dexodata.com/en/blog/10-credible-reasons-to-use-dexodata\" target=\"_blank\" rel=\"noopener\">site web proxy de confiance Dexodata avec des param&egrave;tres avanc&eacute;s et flexibles\u003C/a> a d&eacute;j&agrave; explor&eacute; le potentiel de Python, JavaScript et Java. Nous invitons maintenant les lecteurs &agrave; se concentrer sur une autre direction bien appr&eacute;ci&eacute;e pour r&eacute;colter des informations. Nous parlons du bon vieux PHP.\u003C/p>\n\u003Cp>Pourquoi les utilisateurs devraient-ils essayer si ils ont l'intention de r&eacute;cup&eacute;rer le contenu d'une pr&eacute;sence web et vont recourir &agrave; nos proxies g&eacute;o-cibl&eacute;s &agrave; cet effet ? Voici une r&eacute;ponse. Fondamentalement, PHP peut &ecirc;tre d&eacute;crit comme un langage de script c&ocirc;t&eacute; serveur &agrave; usage g&eacute;n&eacute;ral n&eacute; d&egrave;s 1995. En tant que tel, il est, par nature, destin&eacute; au d&eacute;veloppement web (la \u003Ca href=\"https://php.watch/versions/8.4\" target=\"_blank\" rel=\"noopener\">derni&egrave;re version de PHP est 8.4\u003C/a>). La part que PHP a gagn&eacute;e et conserv&eacute;e est encore &eacute;norme.&nbsp;&nbsp;\u003C/p>\n\u003Col>\n\u003Cli>Quiconque connaissant au moins un peu les aspects techniques d'Internet sait ce qu'est WordPress. Bas&eacute; sur PHP, ce CMS alimente et maintient environ 40 % de tous les sites web existants. Tous ne sont pas si populaires, 40 % des sites ne signifient pas n&eacute;cessairement 40 % du trafic ou 40 % des donn&eacute;es. Mais ce fait parle de lui-m&ecirc;me.\u003C/li>\n\u003Cli>En dehors de tout ce qui concerne la gestion de contenu, \u003Ca href=\"https://w3techs.com/technologies/details/pl-php\" target=\"_blank\" rel=\"noopener\">environ 80 % des sites web reposent sur PHP\u003C/a> (lorsque leur propri&eacute;t&eacute; c&ocirc;t&eacute; serveur peut &ecirc;tre identifi&eacute;e).\u003C/li>\n\u003Cli>Enfin, des produits v&eacute;ritablement avanc&eacute;s et tr&egrave;s demand&eacute;s peuvent &ecirc;tre con&ccedil;us avec PHP. Par exemple, ceux qui demandent notre essai gratuit de proxy payant en tant que nouveaux utilisateurs pour appliquer des adresses comme proxies pour les r&eacute;seaux sociaux devraient savoir que Slack repose sur du code PHP. Oui, ce n'est pas un r&eacute;seau social dans sa forme la plus pure, mais quand m&ecirc;me.\u003C/li>\n\u003C/ol>\n\u003Cp>En tant que langage \"pr&eacute;dispos&eacute;\" pour le Web, PHP est une option d&eacute;cente pour des sc&eacute;narios de faible &agrave; moyenne complexit&eacute;. Gr&acirc;ce &agrave; lui, les d&eacute;veloppeurs peuvent :\u003C/p>\n\u003Cul>\n\u003Cli>Initier des requ&ecirc;tes &agrave; transf&eacute;rer vers une page donn&eacute;e;&nbsp;&nbsp;\u003C/li>\n\u003Cli>R&eacute;cup&eacute;rer des informations;\u003C/li>\n\u003Cli>Enregistrer des informations sous une forme organis&eacute;e, par exemple dans des formats tels que CSV, JSON ou XML.\u003C/li>\n\u003C/ul>\n\u003Cp>Pour r&eacute;sumer : PHP est certainement une ressource &agrave; appliquer aux t&acirc;ches de scraping, car il est capable d'interagir avec des sites et de comprendre et manipuler HTML, ainsi que de r&eacute;cup&eacute;rer des informations &agrave; partir de pr&eacute;sences via une gamme de fonctions et de biblioth&egrave;ques adapt&eacute;es. En cette capacit&eacute;, PHP n'est pas si avanc&eacute; et flexible et ne devrait pas &ecirc;tre choisi pour du contenu dynamique, m&ecirc;me ainsi, c'est une option viable et fonctionnelle (dans une certaine mesure). Nous le disons en tant que site web proxy de confiance avec \u003Ca href=\"https://dexodata.com/en/data-gathering\" target=\"_blank\" rel=\"noopener\">des adresses pour le scraping web\u003C/a> connaissant bien ce m&eacute;tier de collecte de donn&eacute;es.\u003C/p>\n\u003Ch2>\u003Ca name=\"anchor1\">\u003C/a>Scraping web avec PHP : bases et pr&eacute;requis\u003C/h2>\n\u003Cp>Avant d'aller plus loin, validez si vous &ecirc;tes bien conscient des &eacute;l&eacute;ments ci-dessous.\u003C/p>\n\u003Col>\n\u003Cli>\u003Cspan style=\"color: #236fa1;\">\u003Cstrong>Requ&ecirc;tes HTTP\u003C/strong>\u003C/span>. Ici, nous entendons le protocole appliqu&eacute; par les serveurs pour envoyer et obtenir des informations. Pour obtenir des donn&eacute;es d'une pr&eacute;sence, un utilisateur doit diriger une requ&ecirc;te HTTP vers le serveur responsable de l'h&eacute;bergement de la page. PHP dispose de fonctions int&eacute;gr&eacute;es telles que \u003Ccode>cURL\u003C/code>, \u003Ccode>file_get_contents()\u003C/code>, ainsi que \u003Ccode>fopen()\u003C/code> permettant de diriger des requ&ecirc;tes HTTP et d'obtenir des informations &agrave; partir des pages.\u003C/li>\n\u003Cli>\u003Cspan style=\"color: #236fa1;\">\u003Cstrong>Analyse HTML\u003C/strong>\u003C/span>. En tant que langage con&ccedil;u pour \"construire\" des pages web, PHP offre des &eacute;l&eacute;ments int&eacute;gr&eacute;s tels que \u003Ccode>DOMDocument\u003C/code> ainsi que \u003Ccode>SimpleXMLElement\u003C/code> permettant aux utilisateurs d'analyser HTML pour r&eacute;cup&eacute;rer des informations.\u003C/li>\n\u003Cli>\u003Cspan style=\"color: #236fa1;\">\u003Cstrong>Expressions r&eacute;guli&egrave;res\u003C/strong>\u003C/span> servent d'outil fonctionnel et puissant pour faire correspondre des motifs et manipuler des textes. Encore une fois, PHP propose des fonctions int&eacute;gr&eacute;es, par exemple \u003Ccode>preg_match()\u003C/code> ainsi que \u003Ccode>preg_replace()\u003C/code> qui permettent d'appliquer des expressions r&eacute;guli&egrave;res pour r&eacute;cup&eacute;rer des informations provenant de sites.\u003C/li>\n\u003C/ol>\n\u003Cp>Ces notions de base suffiraient si les utilisateurs ont l'intention de cr&eacute;er un programme PHP simple capable de transf&eacute;rer des requ&ecirc;tes HTTP vers une pr&eacute;sence, de \"sauver\" le HTML, et finalement d'analyser le code ainsi que de r&eacute;cup&eacute;rer les informations recherch&eacute;es avec l'&eacute;cosyst&egrave;me de proxies g&eacute;o-cibl&eacute;s &eacute;thiques de Dexodata (avec essai gratuit de proxy payant, y compris des proxies pour les r&eacute;seaux sociaux).\u003C/p>\n\u003Cp style=\"line-height: 0.5;\">&nbsp;\u003C/p>\n\u003Ch3>\u003Ca name=\"anchor2\">\u003C/a>Collecte de donn&eacute;es web avec PHP : sc&eacute;nario d'exemple\u003C/h3>\n\u003Cp style=\"line-height: 0.1;\">&nbsp;\u003C/p>\n\u003Cp>Supposons qu'il soit n&eacute;cessaire de r&eacute;cup&eacute;rer des informations contenues par une pr&eacute;sence sous forme d'une liste d'articles &agrave; vendre (ce que nous allons montrer est un cas tr&egrave;s basique, il y aura des cas plus avanc&eacute;s dans les sections suivantes). Il est imp&eacute;ratif de r&eacute;cup&eacute;rer le nom, le co&ucirc;t et l'image de chaque article et d'enregistrer ces informations sous forme de fichier CSV. Voici la mani&egrave;re la plus simple de proc&eacute;der, c'est-&agrave;-dire lorsqu'il n'y a pas de sc&eacute;narios complexes et d'obstacles. Suivez simplement les &eacute;tapes de l'&eacute;cosyst&egrave;me Dexodata de proxies g&eacute;o-cibl&eacute;s sur liste blanche.\u003C/p>\n\u003Cp>\u003Ccode>&lt;?php\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>$url = 'https://sample.com/items';\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>$html = file_get_contents($url);\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>$dom = new DOMDocument();\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>$dom-&gt;loadHTML($html);\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>$products = $dom-&gt;getElementsByTagName('article');\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>$data = [];\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>foreach ($items as $items) {\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>&nbsp; &nbsp; $name = $item-&gt;getElementsByTagName('h2')[0]-&gt;textContent;\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>&nbsp; &nbsp; $price = $item-&gt;getElementsByTagName('span')[0]-&gt;textContent;\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>&nbsp; &nbsp; $image = $item-&gt;getElementsByTagName('img')[0]-&gt;getAttribute('src');\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>&nbsp; &nbsp; $data[] = [$name, $price, $image];\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>}\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>$fp = fopen('items.csv', 'w');\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>foreach ($data as $fields) {\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>&nbsp; &nbsp; fputcsv($fp, $fields);\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>}\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>fclose($fp);\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>?&gt;\u003C/code>\u003C/p>\n\u003Cp>Rien n'a jamais &eacute;t&eacute; aussi facile !\u003C/p>\n\u003Cp>Ce que les lecteurs voient ici, c'est que nous transf&eacute;rons d'abord une requ&ecirc;te HTTP vers la pr&eacute;sence par le biais de \u003Ccode>file_get_contents()\u003C/code>. Ensuite, nous passons &agrave; l'analyse du contenu HTML via la classe \u003Ccode>DOMDocument\u003C/code> et r&eacute;cup&eacute;rons des informations pertinentes via la technique \u003Ccode>getElementsByTagName()\u003C/code>. Ensuite, nous sommes libres d'enregistrer les informations r&eacute;cup&eacute;r&eacute;es dans un tableau multidimensionnel, qui est ensuite &eacute;crit dans un fichier CSV via \u003Ccode>fputcsv()\u003C/code>.\u003C/p>\n\u003Cp>Si vous pensez que tout est clair, passons &agrave; la suite. Le site web proxy de confiance Dexodata avec des options d'essai gratuit de proxy payant vous montrera le chemin vers les donn&eacute;es.\u003C/p>\n\u003Cp style=\"line-height: 0.5;\">&nbsp;\u003C/p>\n\u003Ch3>\u003Ca name=\"anchor3\">\u003C/a>&Eacute;volution. Biblioth&egrave;ques et outils\u003C/h3>\n\u003Cp style=\"line-height: 0.1;\">&nbsp;\u003C/p>\n\u003Cp>Depuis sa cr&eacute;ation, PHP a &eacute;volu&eacute; de mani&egrave;re significative. Probablement, ses biblioth&egrave;ques ne semblent pas si \"&agrave; la mode\" et \"&eacute;l&eacute;gantes\" (ce n'est pas Python), n&eacute;anmoins, ce langage dispose d'une &eacute;norme communaut&eacute; de participants soutenant des biblioth&egrave;ques fonctionnelles. Examinons-les dans le contexte du scraping web. Nous, en tant que site web proxy de confiance g&eacute;rant un &eacute;cosyst&egrave;me de proxies g&eacute;o-cibl&eacute;s (y compris \u003Ca href=\"https://dexodata.com/en/blog/dexodata-proxies-for-instagram-tools\" target=\"_blank\" rel=\"noopener\">des proxies pour les r&eacute;seaux sociaux, comme Instagram\u003C/a>) proposons l'&eacute;chelle suivante, &agrave; notre avis, des options les plus simples aux plus avanc&eacute;es.\u003C/p>\n\u003Cp style=\"line-height: 0.5;\">&nbsp;\u003C/p>\n\u003Ch3>\u003Ca name=\"anchor4\">\u003C/a>1. Goutte\u003C/h3>\n\u003Cp style=\"line-height: 0.1;\">&nbsp;\u003C/p>\n\u003Cp>\u003Ca href=\"https://github.com/FriendsOfPHP/Goutte\" target=\"_blank\" rel=\"noopener\">Goutte sert de biblioth&egrave;que enti&egrave;rement fonctionnelle\u003C/a> que l'on peut appliquer avec le framework PHP. Elle peut &ecirc;tre ma&icirc;tris&eacute;e m&ecirc;me par des d&eacute;butants pour r&eacute;cup&eacute;rer des donn&eacute;es provenant de HTML. La courbe d'apprentissage dans ce cas n'est pas non plus difficile, gr&acirc;ce &agrave; son design orient&eacute; objet compr&eacute;hensible. En ce qui concerne les autres avantages, ils incluent une communaut&eacute; visible, un volume impressionnant de documentation utile, et enfin, la vitesse. Gr&acirc;ce au fait qu'elle repose sur des connexions persistantes HTTP 1.1, cela implique qu'un navigateur n'a besoin que d'une connexion au serveur. Apr&egrave;s cela, la m&ecirc;me connexion sera utilis&eacute;e pour toutes les requ&ecirc;tes apr&egrave;s la premi&egrave;re.\u003C/p>\n\u003Cp>Il y a aussi quelques inconv&eacute;nients. Dans certains projets, des limitations insurmontables concernant le contenu dynamique peuvent &ecirc;tre rencontr&eacute;es. Essayons Goutte et PHP en action et cliquons sur la page d'int&eacute;r&ecirc;t (comme d'habitude, lorsque vous scrapez quoi que ce soit sur le web, n'oubliez pas les \u003Ca href=\"https://dexodata.com/en/pricing\" target=\"_blank\" rel=\"noopener\">proxies g&eacute;o-cibl&eacute;s r&eacute;sidentiels, de centre de donn&eacute;es et mobiles de Dexodata disponibles &agrave; des tarifs avantageux\u003C/a>).\u003C/p>\n\u003Cp>Pour commencer, il faut \u003Ca href=\"https://getcomposer.org/\" target=\"_blank\" rel=\"noopener\">installer Composer\u003C/a>. Ce dernier est utilis&eacute; pour g&eacute;rer les d&eacute;pendances en ce qui concerne PHP. Il permet de d&eacute;clarer les biblioth&egrave;ques importantes pour un projet.\u003C/p>\n\u003Cp>Tout ce qu'il faut faire est d'ex&eacute;cuter ce type de commande dans le terminal :\u003C/p>\n\u003Cp>\u003Ccode>composer require fabpot/goutte\u003C/code>\u003C/p>\n\u003Cp>Ensuite, g&eacute;n&eacute;rez un script PHP pour l'initiative. Donnez-lui le nom que vous voulez. Ensuite, ouvrez votre nouveau script et compl&eacute;tez ces lignes de code pour faire fonctionner Goutte :\u003C/p>\n\u003Cp>\u003Ccode>require 'vendor/autoload.php';\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>use Goutte\\Client;\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>$client = new Client();\u003C/code>\u003C/p>\n\u003Cp>Super, Goutte est en pleine action et initialis&eacute; ! Apr&egrave;s cela, fournissez ce couple de lignes ci-dessous &agrave; la fin du fichier pour r&eacute;cup&eacute;rer une URL par le biais de la fonction \u003Ccode>client-&gt;request()\u003C/code>.\u003C/p>\n\u003Cp>\u003Ccode>$url = \"http://instance.com/\";\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>$crawler = $client-&gt;request('GET', $url);\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>// Cliquez sur le lien \"Plus d'informations...\"\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>$link = $crawler-&gt;selectLink('Plus d'informations&hellip;')-&gt;link();\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>$crawler = $client-&gt;click($link);\u003C/code>\u003C/p>\n\u003Cp>Il nous a fallu juste quelques lignes de code pour nous retrouver dans la bonne position pour naviguer vers une pr&eacute;sence et faire des clics. Maintenant, il est temps de passer &agrave; la deuxi&egrave;me manche avec le site web proxy de confiance Dexodata.\u003C/p>\n\u003Cp style=\"line-height: 0.5;\">&nbsp;\u003C/p>\n\u003Ch3>\u003Ca name=\"anchor5\">\u003C/a>2. Simple HTML DOM\u003C/h3>\n\u003Cp style=\"line-height: 0.1;\">&nbsp;\u003C/p>\n\u003Cp>En tant que parseur, ce programme est con&ccedil;u pour travailler avec n'importe quel document HTML, y compris ceux qui sont d&eacute;finis comme invalides par les sp&eacute;cifications HTML correspondantes. Son grand avantage est qu'il est facile &agrave; ma&icirc;triser, et il ne contient aucun &eacute;l&eacute;ment JS externe &agrave; charger s&eacute;par&eacute;ment avant de commencer &agrave; travailler. D'autres avantages incluent la vitesse (les utilisateurs n'ont pas besoin de charger une page enti&egrave;re en m&eacute;moire, donc vous pouvez traiter un tas de pages HTML simultan&eacute;ment sans que votre performance soit affect&eacute;e) et le fait qu'il soit l&eacute;ger (c'est-&agrave;-dire qu'il n'est pas n&eacute;cessaire d'installer un logiciel ou des biblioth&egrave;ques suppl&eacute;mentaires, PHP seul suffira).\u003C/p>\n\u003Cp>Sans aucun doute, il existe des contraintes. Votre acc&egrave;s aux composants de la page sera limit&eacute; : on peut effectuer des manipulations avec la structure d'une page, mais son contenu sera hors de port&eacute;e. Il est &agrave; noter que Simple HTML DOM est assez rigide, donc &agrave; moins que vous ne soyez un dieu de HTML, le potentiel sera restreint.\u003C/p>\n\u003Cp>Assez de th&eacute;orie, passons &agrave; la pratique.\u003C/p>\n\u003Cp>Pour commencer, obtenez la derni&egrave;re version en visitant cet \u003Ca href=\"https://simplehtmldom.sourceforge.io/docs/1.9/index.html\" target=\"_blank\" rel=\"noopener\">espace de documentation Simple HTML DOM\u003C/a>. Cela vous donnera tout ce dont vous avez besoin.\u003C/p>\n\u003Cp>Tout d'abord, copiez le fichier \u003Ccode>simple_html_dom.php\u003C/code>. Ensuite, collez simplement ce dernier dans votre projet actif.\u003C/p>\n\u003Cp>G&eacute;n&eacute;rez votre fichier PHP (les noms n'ont pas d'importance). Par exemple, webscrapingstuff.php.\u003C/p>\n\u003Cp>Maintenant, ouvrez le fichier et \"armez\" votre projet avec la biblioth&egrave;que Simple HTML DOM en l'ajoutant. Utilisez le code propos&eacute; par le site web proxy de confiance Dexodata ci-dessous :\u003C/p>\n\u003Cp>\u003Ccode>include('simple_html_dom.php');\u003C/code>\u003C/p>\n\u003Cp>Entrez cette ligne de code. Elle est importante, car elle vous dirigera vers la page elle-m&ecirc;me :\u003C/p>\n\u003Cp>\u003Ccode>$html = file_get_html('http://instance.com/')\u003C/code>\u003C/p>\n\u003Cp>Le \u003Ccode>file_get_html\u003C/code>, &eacute;tant une partie de Simple HTML DOM, est capable de r&eacute;cup&eacute;rer le HTML associ&eacute; &agrave; l'URL sp&eacute;cifi&eacute;e. Plus tard, il livre un objet DOM stockant notre variable \u003Ccode>$html\u003C/code>.\u003C/p>\n\u003Cp>Disons que vous avez besoin du titre principal. Pour obtenir ce premier titre H1, appliquez ce code :\u003C/p>\n\u003Cp>\u003Ccode>echo $html-&gt;find('h1', 0)-&gt;plaintext;\u003C/code>\u003C/p>\n\u003Cp>Si vous ouvrez ce fichier r&eacute;sultant sur votre serveur web, vous trouverez ce dont vous avez besoin.\u003C/p>\n\u003Cp style=\"line-height: 0.5;\">&nbsp;\u003C/p>\n\u003Ch3>\u003Ca name=\"anchor6\">\u003C/a>3. PHP Scraper\u003C/h3>\n\u003Cp style=\"line-height: 0.1;\">&nbsp;\u003C/p>\n\u003Cp>En tant qu'&eacute;cosyst&egrave;me d'adresses IP sur liste blanche et &eacute;thiquement sourc&eacute;es ax&eacute;es sur la collecte de donn&eacute;es, nous ne pouvons pas ignorer \u003Ca href=\"https://phpscraper.de\" target=\"_blank\" rel=\"noopener\">PHP Scraper\u003C/a>. Ce dernier sert d'outil permettant aux collecteurs de scraper des informations via des scripts PHP. Cette approche implique qu'il n'est pas n&eacute;cessaire de coder beaucoup par vous-m&ecirc;me. Tout ce qui est n&eacute;cessaire est d'appliquer des commandes simples telles que \u003Ccode>find_element_by_class\u003C/code> ou \u003Ccode>find_element_by_id\u003C/code>. Elles suffiront pour des composants sp&eacute;cifiques sur une pr&eacute;sence particuli&egrave;re en tapant leur classe ou leur num&eacute;ro d'identification.\u003C/p>\n\u003Cp>Des probl&egrave;mes ? Bien s&ucirc;r, il existe quelques-uns. PHP Scraper peut ne pas correspondre &agrave; chaque cas d'utilisation possible, tant qu'il est, naturellement, bas&eacute; sur PHP. Ainsi, il est compatible avec des serveurs associ&eacute;s &agrave; Apache ou Nginx et configur&eacute;s via \u003Ccode>mod_rewrite\u003C/code> activ&eacute; par d&eacute;faut. PHP Scraper n'est pas votre direction &agrave; suivre si vous avez l'intention de r&eacute;cup&eacute;rer des informations d'une API ou d'analyser des pr&eacute;sences HTML sophistiqu&eacute;es.\u003C/p>\n\u003Cp>Quoi qu'il en soit, ex&eacute;cutons un sc&eacute;nario de base.\u003C/p>\n\u003Cp>Nos lecteurs doivent installer Composer, comme nous l'avons fait dans la section Goutte. Apr&egrave;s cela, compl&eacute;tez votre projet avec la biblioth&egrave;que discut&eacute;e, avec ce code via Composer :\u003C/p>\n\u003Cp>\u003Ccode>composer require spekulatius/phpscraper\u003C/code>\u003C/p>\n\u003Cp>Une fois l'&eacute;tape d'installation derri&egrave;re nous, l'autoloader de Composer prend en charge le package. Dans le cas o&ugrave; l'on travaille avec une biblioth&egrave;que VanillaPHP, il faut incorporer l'autoloader dans leur script, comme montr&eacute; ci-dessous :\u003C/p>\n\u003Cp>\u003Ccode>require 'vendor/autoload.php'\u003C/code>\u003C/p>\n\u003Cp>En guise d'exercice, g&eacute;n&eacute;rez un script qui acc&egrave;de &agrave; une pr&eacute;sence et &eacute;num&egrave;re le nombre de liens publi&eacute;s l&agrave;-bas. D&eacute;marrez le programme et donnez-lui une variable, comme montr&eacute; ici :\u003C/p>\n\u003Cp>\u003Ccode>$web = new \\spekulatius\\phpscraper();\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>Donnez l'ordre au programme de visiter l'URL :&nbsp;&nbsp;\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>$web-&gt;go(' [http://instance.com/](http://instance.com/) ');\u003C/code>\u003C/p>\n\u003Cp>Compl&eacute;tez cette section de code charg&eacute;e de prendre chaque lien contenu par la pr&eacute;sence et d'imprimer leur nombre.\u003C/p>\n\u003Cp>\u003Ccode>// Imprimer le nombre de liens.\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>echo \"Cette page contient \" . count($web-&gt;links) . \" liens.\n\n\";\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>// Boucle &agrave; travers les liens\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>foreach ($web-&gt;links as $link) {\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>echo \" - \" . $link . \"\n\";\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>}\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>/**\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>* Ce code imprimera :\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>*\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>* Cette page contient 1 lien.\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>*\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>* - https://www.iana.org/domains/instance\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>*/\u003C/code>\u003C/p>\n\u003Cp>Rappelez-vous juste : Nous utilisons une adresse fictive.\u003C/p>\n\u003Cp style=\"line-height: 0.5;\">&nbsp;\u003C/p>\n\u003Ch3>\u003Ca name=\"anchor7\">\u003C/a>4. PHP cURL pour les op&eacute;rations de scraping\u003C/h3>\n\u003Cp style=\"line-height: 0.1;\">&nbsp;\u003C/p>\n\u003Cp>Apr&egrave;s avoir revisit&eacute; une gamme d'options mises &agrave; disposition pour les activit&eacute;s de collecte par PHP, notre site web proxy de confiance Dexodata vous offre une option suppl&eacute;mentaire pratique et largement utilis&eacute;e. Nous parlons bien s&ucirc;r de \u003Ca href=\"https://www.php.net/manual/en/book.curl.php\" target=\"_blank\" rel=\"noopener\">\u003Ccode>cURL\u003C/code>, une biblioth&egrave;que et un outil en ligne de commande\u003C/a> (normalement disponible avec le langage par d&eacute;faut) permettant aux utilisateurs d'envoyer et de recevoir des fichiers via HTTP et FTP. En travaillant avec, on peut appliquer des proxies g&eacute;o-cibl&eacute;s (y compris ceux fournis avec notre essai gratuit de proxy payant), transmettre des donn&eacute;es via des connexions SSL, d&eacute;finir des cookies, et plus encore. Essayons-le en pratique.\u003C/p>\n\u003Cp>G&eacute;n&eacute;rez un nouveau script PHP et compl&eacute;tez ce code :\u003C/p>\n\u003Cp>\u003Ccode>// Initialiser curl\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>$ch = curl_init();\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>// URL pour le scraping\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>curl_setopt($ch, CURLOPT_URL,\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>'https://dexodata.com/en/blog');\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>// Retourner le transfert vrai\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>$output = curl_exec($ch);\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>// Fermeture de cURL\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>curl_close($ch);\u003C/code>\u003C/p>\n\u003Cp>D&eacute;finir \u003Ccode>CURLOPT_RETURNTRANSFER\u003C/code> comme \u003Ccode>TRUE \u003C/code>soumet la page sous forme de cha&icirc;ne au lieu de l'afficher directement. Ainsi, notre code prend les informations que nous devons r&eacute;colter sur le site.\u003C/p>\n\u003Cp>On peut jeter un &oelig;il &agrave; ces donn&eacute;es via un echo avec la variable de stockage des donn&eacute;es :\u003C/p>\n\u003Cp>\u003Ccode>echo $output\u003C/code>\u003C/p>\n\u003Cp>Notre prochaine &eacute;tape consiste &agrave; placer ces informations dans un document DOM, ce qui nous permettra d'y acc&eacute;der &agrave; des fins de scraping.\u003C/p>\n\u003Cp>\u003Ccode>$dom = new DOMDocument;\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>$dom-&gt;loadHTML($output);\u003C/code>\u003C/p>\n\u003Cp>Actuellement, nous avons nos informations sous forme de structure HTML &agrave; l'int&eacute;rieur d'une variable. G&eacute;n&eacute;rez un code suppl&eacute;mentaire pour imprimer chaque lien mis &agrave; disposition par la page HTML :\u003C/p>\n\u003Cp>\u003Ccode>$tags = $dom-&gt;getElementsByTagName('a');\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>for($I=0; $I &lt; $tags-&gt;length; $I++){\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>$link = $tags-&gt;item($i);\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>echo \" - \" . $link . \"\n\";\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>}\u003C/code>\u003C/p>\n\u003Cp>Au fait, en tant que source de proxies g&eacute;o-cibl&eacute;s avec des opportunit&eacute;s d'essai gratuit de proxy payant, nous exhortons les utilisateurs &agrave; ne pas oublier de prot&eacute;ger leurs initiatives de scraping avec les adresses que nous fournissons (par exemple, nos \u003Ca href=\"https://dexodata.com/en/residential-proxies\" target=\"_blank\" rel=\"noopener\">IP r&eacute;sidentielles de premier ordre des FAI\u003C/a> ou, alternativement, nos proxies mobiles de haute qualit&eacute;). L'&eacute;cosyst&egrave;me Dexodata montrera aux lecteurs comment proc&eacute;der via \u003Ccode>cURL\u003C/code>. Tout ce qu'ils doivent faire est de suivre la syntaxe.\u003C/p>\n\u003Cp>\u003Ccode>curl --proxy &lt;proxy-ip&gt;:&lt;proxy-port&gt; &lt;url&gt;\u003C/code>\u003C/p>\n\u003Cp>Tout d'abord, la section &lt;proxy-ip&gt; est destin&eacute;e &agrave; ins&eacute;rer l'IP, tandis que la seconde section &lt;proxy-port&gt; est destin&eacute;e, pr&eacute;visiblement, au num&eacute;ro de port. Finalement, cela ressemblera &agrave; :\u003C/p>\n\u003Cp>\u003Ccode>curl --proxy 193.191.56.12:7070 -k https://dexodata.com/en/blog\u003C/code>\u003C/p>\n\u003Cp>&Agrave; condition que l'adresse soit fonctionnelle et que la requ&ecirc;te soit r&eacute;ussie, notre script affichera le contenu de la pr&eacute;sence pour ensuite sortir.&nbsp;\u003C/p>\n\u003Cp style=\"line-height: 0.5;\">&nbsp;\u003C/p>\n\u003Ch3>\u003Ca name=\"anchor8\">\u003C/a>Cr&eacute;ation d'un scraper : un sc&eacute;nario d'exemple\u003C/h3>\n\u003Cp style=\"line-height: 0.1;\">&nbsp;\u003C/p>\n\u003Cp>Imaginons une pr&eacute;sence e-commerce avec une liste d'articles &agrave; vendre que nous voulons r&eacute;colter via PHP. Que devrions-nous faire ? Quelles alternatives devrions-nous utiliser ? Suivez notre site web proxy de confiance et examinez ce sc&eacute;nario d'exemple.\u003C/p>\n\u003Cp>Commencez par t&eacute;l&eacute;charger l'int&eacute;gralit&eacute; du HTML de la pr&eacute;sence e-commerce via le potentiel de PHP et le bon vieux \u003Cspan style=\"font-family: monospace; background-color: #b4d7ff;\">cURL\u003C/span>, comme ceci :\u003C/p>\n\u003Cp>\u003Ccode>// initialiser la requ&ecirc;te cURL&nbsp;\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>$curl = curl_init();&nbsp;\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>// d&eacute;finir l'URL &agrave; atteindre avec une requ&ecirc;te HTTP GET&nbsp;\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>curl_setopt($curl, CURLOPT_URL, \"https://scrapeme.live/shop/\");&nbsp;\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>// obtenir les donn&eacute;es retourn&eacute;es par la requ&ecirc;te cURL sous forme de cha&icirc;ne&nbsp;\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);&nbsp;\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>// faire en sorte que la requ&ecirc;te cURL suive d'&eacute;ventuelles redirections,&nbsp;\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>// et atteindre la page finale d'int&eacute;r&ecirc;t&nbsp;\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);&nbsp;\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>// ex&eacute;cuter la requ&ecirc;te cURL et&nbsp;\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>// obtenir le HTML de la page sous forme de cha&icirc;ne&nbsp;\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>$html = curl_exec($curl);&nbsp;\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>// lib&eacute;rer les ressources cURL&nbsp;\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>curl_close($curl);\u003C/code>\u003C/p>\n\u003Cp>Les &eacute;l&eacute;ments li&eacute;s au HTML sont &agrave; notre enti&egrave;re disposition, sous la forme de la variable \u003Ccode>$html\u003C/code>, comme le souligne Dexodata. Votre prochaine mesure est de charger \u003Ccode>$html\u003C/code> dans une instance \u003Ccode>HtmlDomParser\u003C/code> avec la fonction \u003Ccode>str_get_html()\u003C/code>. Voyez comment cela peut &ecirc;tre fait ci-dessous :\u003C/p>\n\u003Cp>\u003Ccode>require_once __DIR__ . \"../../vendor/autoload.php\";\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>use voku\\helper\\HtmlDomParser;&nbsp;\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>$curl = curl_init();&nbsp;\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>curl_setopt($curl, CURLOPT_URL, \"https://scrapeme.live/shop/\");&nbsp;\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);&nbsp;\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);&nbsp;\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>$html = curl_exec($curl);&nbsp;\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>curl_close($curl);&nbsp;\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>// initialiser HtmlDomParser&nbsp;\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>$htmlDomParser = HtmlDomParser::str_get_html($html);\u003C/code>\u003C/p>\n\u003Cp>Vous et notre site web proxy de confiance &ecirc;tes maintenant en bonne position pour appliquer \u003Ccode>HtmlDomParser\u003C/code> dans le but ultime de parcourir le DOM de la pr&eacute;sence HTML et d'initier efficacement le processus de collecte de donn&eacute;es.\u003C/p>\n\u003Cp>C'est ce que Dexodata est sur le point d'accomplir. Pour y parvenir, \"sauvez\" la liste compl&egrave;te de tous les liens li&eacute;s &agrave; la pagination dans notre sc&eacute;nario. Dans notre cas, cela nous donnera l'opportunit&eacute; de parcourir l'ensemble de la section de la pr&eacute;sence web. Faites un clic droit sur le composant HTML li&eacute; au chiffre de pagination et choisissez \"Inspecter\". Apr&egrave;s cela, nos DevTools nous montreront l'&eacute;l&eacute;ment DOM.\u003C/p>\n\u003Cp style=\"text-align: center;\">\u003Cimg src=\"https://blog.dexodata.com/storage/uploads/images/129/15-3-geo-targeted-proxies-php-and-data-collection-1032x491-d5d805e4-e80c-4dfc-a6e5-401c7a54a0fc.png\" alt=\"Comment collecter des donn&eacute;es en PHP avec un site web proxy de confiance\" width=\"1032\" height=\"491\">\u003C/p>\n\u003Cp>Passons &agrave; l'&eacute;cosyst&egrave;me de proxies g&eacute;o-cibl&eacute;s de Dexodata. On peut s'attendre &agrave; ce que le \u003Ccode>.page-numbers\u003C/code>, en tant que classe CSS, identifie les composants HTML li&eacute;s &agrave; la pagination. Cependant, l'&eacute;quipe de notre site web proxy de confiance nous rappellerait que une classe CSS peut ne pas n&eacute;cessairement identifier un composant HTML de mani&egrave;re unique. Plusieurs n&oelig;uds peuvent en fait &ecirc;tre li&eacute;s &agrave; la m&ecirc;me classe unique.\u003C/p>\n\u003Cp>Par cons&eacute;quent, si votre intention est d'appliquer un s&eacute;lecteur CSS pour r&eacute;cup&eacute;rer les composants dans le DOM, il est in&eacute;vitable d'appliquer la classe CSS avec d'autres s&eacute;lecteurs. Plus pr&eacute;cis&eacute;ment, les utilisateurs pourraient appliquer l'assistant HtmlDomParser, avec le s&eacute;lecteur CSS \u003Ccode>.page-numbers\u003C/code>, pour choisir tous les composants HTML li&eacute;s &agrave; la pagination. Ensuite, notre &eacute;cosyst&egrave;me de proxies g&eacute;o-cibl&eacute;s vous sugg&eacute;rerait d'it&eacute;rer &agrave; travers eux pour r&eacute;cup&eacute;rer chaque URL n&eacute;cessaire directement &agrave; partir de l'attribut href.\u003C/p>\n\u003Cp>V&eacute;rifiez cela :\u003C/p>\n\u003Cp>\u003Ccode>// r&eacute;cup&eacute;rer les &eacute;l&eacute;ments HTML de pagination avec&nbsp;\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>// le s&eacute;lecteur CSS \".page-numbers a\"&nbsp;\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>$paginationElements = $htmlDomParser-&gt;find(\".page-numbers a\");&nbsp;\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>$paginationLinks = [];&nbsp;\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>foreach ($paginationElements as $paginationElement) {&nbsp;\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>\u003Cspan style=\"white-space: normal;\">\u003Cspan style=\"white-space: pre;\"> \u003C/span>// peupler l'ensemble paginationLinks avec l'URL&nbsp;\u003C/span>\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>\u003Cspan style=\"white-space: normal;\">\u003Cspan style=\"white-space: pre;\"> \u003C/span>// extraite de l'attribut href de l'&eacute;l&eacute;ment HTML de pagination&nbsp;\u003C/span>\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>\u003Cspan style=\"white-space: normal;\">\u003Cspan style=\"white-space: pre;\"> \u003C/span>$paginationLink = $paginationElement-&gt;getAttribute(\"href\");&nbsp;\u003C/span>\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>\u003Cspan style=\"white-space: normal;\">\u003Cspan style=\"white-space: pre;\"> \u003C/span>// &eacute;viter les doublons dans la liste des URLs&nbsp;\u003C/span>\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>\u003Cspan style=\"white-space: normal;\">\u003Cspan style=\"white-space: pre;\"> \u003C/span>if (!in_array($paginationLink, $paginationLinks)) {&nbsp;\u003C/span>\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>\u003Cspan style=\"white-space: normal;\">\u003Cspan style=\"white-space: pre;\"> \u003C/span>$paginationLinks[] = $paginationLink;&nbsp;\u003C/span>\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>\u003Cspan style=\"white-space: normal;\">\u003Cspan style=\"white-space: pre;\"> \u003C/span>} &nbsp;\u003C/span>\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>}\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>// imprimer le tableau paginationLinks&nbsp;\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>print_r($paginationLinks);\u003C/code>\u003C/p>\n\u003Cp>Faites attention au fait que \u003Ccode>find()\u003C/code> permet aux utilisateurs de \u003Ca href=\"https://github.com/voku/simple_html_dom/blob/master/README_API.md#findstring-selector-intnull-idx-simplehtmldominterfacesimplehtmldominterfacesimplehtmldomnodeinterfacesimplehtmldominterface\" target=\"_blank\" rel=\"noopener\">r&eacute;cup&eacute;rer des composants DOM\u003C/a> sur la base d'un s&eacute;lecteur CSS. De plus, dans le sc&eacute;nario hypoth&eacute;tique de Dexodata, les composants li&eacute;s &agrave; la pagination sont pr&eacute;sents deux fois sur chaque page de la pr&eacute;sence e-commerce. Il faut fournir une astuce unique et ajust&eacute;e pour g&eacute;rer le probl&egrave;me des composants en double lorsque le tableau \u003Ccode>$paginationLinks\u003C/code> est en jeu.\u003C/p>\n\u003Cp>Voici ce que nous verrons si nous essayons d'ex&eacute;cuter notre script pour le sc&eacute;nario :\u003C/p>\n\u003Cp>\u003Ccode>Array (&nbsp;\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>\u003Cspan style=\"white-space: normal;\">\u003Cspan style=\"white-space: pre;\"> \u003C/span>[0] =&gt; https://scrapeme.live/shop/page/2/&nbsp;\u003C/span>\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>\u003Cspan style=\"white-space: normal;\">\u003Cspan style=\"white-space: pre;\"> \u003C/span>[1] =&gt; https://scrapeme.live/shop/page/3/&nbsp;\u003C/span>\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>\u003Cspan style=\"white-space: normal;\">\u003Cspan style=\"white-space: pre;\"> \u003C/span>[2] =&gt; https://scrapeme.live/shop/page/4/&nbsp;\u003C/span>\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>\u003Cspan style=\"white-space: normal;\">\u003Cspan style=\"white-space: pre;\"> \u003C/span>[3] =&gt; https://scrapeme.live/shop/page/46/&nbsp;\u003C/span>\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>\u003Cspan style=\"white-space: normal;\">\u003Cspan style=\"white-space: pre;\"> \u003C/span>[4] =&gt; https://scrapeme.live/shop/page/47/&nbsp;\u003C/span>\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>\u003Cspan style=\"white-space: normal;\">\u003Cspan style=\"white-space: pre;\"> \u003C/span>[5] =&gt; https://scrapeme.live/shop/page/50/&nbsp;\u003C/span>\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>)\u003C/code>\u003C/p>\n\u003Cp>Notez que toutes les adresses poss&egrave;dent une structure identique. C'est-&agrave;-dire qu'elles sont toutes marqu&eacute;es par le chiffre final responsable de la pagination. Si les lecteurs ont l'intention d'it&eacute;rer sur chacune d'elles, la seule chose dont ils ont besoin est le chiffre identifiant associ&eacute; &agrave; la derni&egrave;re page.\u003C/p>\n\u003Cp>Il est sujet &agrave; &ecirc;tre r&eacute;cup&eacute;r&eacute; comme montr&eacute; ci-dessous :\u003C/p>\n\u003Cp>\u003Ccode>// supprimer tous les caract&egrave;res non num&eacute;riques dans le dernier &eacute;l&eacute;ment de&nbsp;\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>// le tableau $paginationLinks pour r&eacute;cup&eacute;rer le plus grand num&eacute;ro de pagination&nbsp;\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>$highestPaginationNumber = preg_replace(\"/\\D/\", \"\", end($paginationLinks));\u003C/code>\u003C/p>\n\u003Cp>Disons que notre \u003Ccode>$highestPaginationNumber\u003C/code> sera \"50\".\u003C/p>\n\u003Cp>Il est donc temps de r&eacute;cup&eacute;rer les informations d&eacute;crivant un produit individuel avec l'&eacute;quipe Dexodata. Nous devons faire un clic droit sur un article et activer la fen&ecirc;tre DevTools, suivie de \"Inspecter\". On peut s'attendre &agrave; ce qu'un article soit \"compos&eacute; de\" un &eacute;l&eacute;ment HTML \u003Ccode>li.product\u003C/code> englobant une URL, une image, un titre et une &eacute;tiquette de prix. Ces informations proviennent des composants HTML \u003Ccode>a\u003C/code>, puis \u003Ccode>mg\u003C/code>, puis \u003Ccode>h2\u003C/code>, puis \u003Ccode>span\u003C/code>, respectivement.\u003C/p>\n\u003Cp>Le site web proxy de confiance Dexodata propose cette mani&egrave;re de r&eacute;cup&eacute;rer ces informations via HtmlDomParser :\u003C/p>\n\u003Cp>\u003Ccode>$productDataLit = array();&nbsp;\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>// r&eacute;cup&eacute;rer la liste des produits sur la page&nbsp;\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>$productElements = $htmlDomParser-&gt;find(\"li.product\");&nbsp;\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>foreach ($productElements as $productElement) {&nbsp;\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>\u003Cspan style=\"white-space: normal;\">\u003Cspan style=\"white-space: pre;\"> \u003C/span>// extraire les donn&eacute;es du produit&nbsp;\u003C/span>\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>\u003Cspan style=\"white-space: normal;\">\u003Cspan style=\"white-space: pre;\"> \u003C/span>$url = $productElement-&gt;findOne(\"a\")-&gt;getAttribute(\"href\");&nbsp;\u003C/span>\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>\u003Cspan style=\"white-space: normal;\">\u003Cspan style=\"white-space: pre;\"> \u003C/span>$image = $productElement-&gt;findOne(\"img\")-&gt;getAttribute(\"src\");&nbsp;\u003C/span>\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>\u003Cspan style=\"white-space: normal;\">\u003Cspan style=\"white-space: pre;\"> \u003C/span>$name = $productElement-&gt;findOne(\"h2\")-&gt;text;&nbsp;\u003C/span>\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>\u003Cspan style=\"white-space: normal;\">\u003Cspan style=\"white-space: pre;\"> \u003C/span>$price = $productElement-&gt;findOne(\".price span\")-&gt;text;&nbsp;\u003C/span>\u003C/code>\u003C/p>\n\u003Cp>\u003Cspan style=\"white-space: normal;\">\u003Cspan style=\"white-space: pre;\"> \u003C/span>// transformer les donn&eacute;es du produit en un tableau associatif&nbsp;\u003C/span>\u003C/p>\n\u003Cp>\u003Ccode>$productData = array(&nbsp;\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>\u003Cspan style=\"white-space: normal;\">\u003Cspan style=\"white-space: pre;\"> \u003C/span>\"url\" =&gt; $url,&nbsp;\u003C/span>\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>\u003Cspan style=\"white-space: normal;\">\u003Cspan style=\"white-space: pre;\"> \u003C/span>\"image\" =&gt; $image,&nbsp;\u003C/span>\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>\u003Cspan style=\"white-space: normal;\">\u003Cspan style=\"white-space: pre;\"> \u003C/span>\"name\" =&gt; $name,&nbsp;\u003C/span>\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>\u003Cspan style=\"white-space: normal;\">\u003Cspan style=\"white-space: pre;\"> \u003C/span>\"price\" =&gt; $price&nbsp;\u003C/span>\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>\u003Cspan style=\"white-space: normal;\">\u003Cspan style=\"white-space: pre;\"> \u003C/span>);&nbsp;\u003C/span>\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>$productDataList[] = $productData;&nbsp;\u003C/code>\u003C/p>\n\u003Cp>}\u003C/p>\n\u003Cp>Une fois notre logique ayant r&eacute;ussi &agrave; r&eacute;cup&eacute;rer tous les morceaux d'informations sur les articles d'une seule page et &agrave; les enregistrer ensuite sous forme de tableau \u003Ccode>$productDataList\u003C/code>. Appliquez cette logique &agrave; chaque page.\u003C/p>\n\u003Cp>\u003Ccode>// it&eacute;rer sur toutes les pages \"/shop/page/X\" et r&eacute;cup&eacute;rer toutes les donn&eacute;es des produits&nbsp;\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>for ($paginationNumber = 1; $paginationNumber &lt;= $highestPaginationNumber; $paginationNumber++) {&nbsp;\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>\u003Cspan style=\"white-space: normal;\">\u003Cspan style=\"white-space: pre;\"> \u003C/span>$curl = curl_init();&nbsp;\u003C/span>\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>\u003Cspan style=\"white-space: normal;\">\u003Cspan style=\"white-space: pre;\"> \u003C/span>curl_setopt($curl, CURLOPT_URL, \"https://scrapeme.live/shop/page/$paginationNumber/\");&nbsp;\u003C/span>\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>\u003Cspan style=\"white-space: normal;\">\u003Cspan style=\"white-space: pre;\"> \u003C/span>curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);&nbsp;\u003C/span>\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>\u003Cspan style=\"white-space: normal;\">\u003Cspan style=\"white-space: pre;\"> \u003C/span>$pageHtml = curl_exec($curl);&nbsp;\u003C/span>\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>\u003Cspan style=\"white-space: normal;\">\u003Cspan style=\"white-space: pre;\"> \u003C/span>curl_close($curl);&nbsp;\u003C/span>\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>\u003Cspan style=\"white-space: normal;\">\u003Cspan style=\"white-space: pre;\"> \u003C/span>$paginationHtmlDomParser = HtmlDomParser::str_get_html($pageHtml);&nbsp;\u003C/span>\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>\u003Cspan style=\"white-space: normal;\">\u003Cspan style=\"white-space: pre;\"> \u003C/span>// logique de scraping...&nbsp;\u003C/span>\u003C/code>\u003C/p>\n\u003Cp>}\u003C/p>\n\u003Cp>Super ! Nous sommes arriv&eacute;s &agrave; la situation o&ugrave; nous pouvons extraire des donn&eacute;es comme pr&eacute;vu.\u003C/p>\n\u003Cp style=\"line-height: 0.5;\">&nbsp;\u003C/p>\n\u003Ch3>\u003Ca name=\"anchor9\">\u003C/a>Remarques finales&nbsp;\u003C/h3>\n\u003Cp style=\"line-height: 0.1;\">&nbsp;\u003C/p>\n\u003Cp>En g&eacute;rant un &eacute;cosyst&egrave;me de proxies g&eacute;o-cibl&eacute;s, nous aimerions finaliser ce guide avec quelques remarques. Essayez d'&eacute;viter d'&ecirc;tre d&eacute;tect&eacute; et restreint en tant que scraper. Pour cela, nous vous rappelons les proxies que nous avons d&eacute;j&agrave; mentionn&eacute;s.\u003C/p>\n\u003Cp>Voici un autre rappel sur la mani&egrave;re dont on peut ajouter leurs identifiants de proxy :\u003C/p>\n\u003Cp>\u003Ccode>curl_setopt($curl, CURLOPT_PROXY, \"&lt;PROXY_URL&gt;\");&nbsp;\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>curl_setopt($curl, CURLOPT_PROXYPORT, \"&lt;PROXY_PORT&gt;\");&nbsp;\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>curl_setopt($curl, CURLOPT_PROXYTYPE, \"&lt;PROXY_TYPE&gt;\");\u003C/code>\u003C/p>\n\u003Cp>1. Une couche suppl&eacute;mentaire de protection peut &ecirc;tre constitu&eacute;e par un en-t&ecirc;te HTTP user-agent. Par d&eacute;finition,&nbsp;\u003Cspan style=\"font-family: monospace; background-color: #b4d7ff;\">cURL\u003C/span>&nbsp;d&eacute;finirait toujours quelque chose comme \u003Ccode>curl/XX.YY.ZZ\u003C/code>. Ce ne sera pas un gros probl&egrave;me de d&eacute;tecter un utilisateur avec un tel en-t&ecirc;te. Au lieu de cela, essayez de \"jouer\" avec l'en-t&ecirc;te ici.\u003C/p>\n\u003Cp>\u003Ccode>curl_setopt($curl, CURLOPT_USERAGENT, \"&lt;USER_AGENT_STRING&gt;\");\u003C/code>\u003C/p>\n\u003Cp>En cons&eacute;quence, vous placerez quelque chose comme ceci, un exemple trouv&eacute; sur Internet :\u003C/p>\n\u003Cp>\u003Ccode>curl_setopt($curl, CURLOPT_USERAGENT, \"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6\")\u003C/code>\u003C/p>\n\u003Cp>2. Une autre remarque de Dexodata est ax&eacute;e sur le contenu dynamique. Nous avons soulign&eacute; que la requ&ecirc;te \u003Ccode>GET cURL\u003C/code> habituelle ne vous aidera pas avec cela, des techniques plus avanc&eacute;es seront n&eacute;cessaires. Revenez &agrave; notre \u003Ca href=\"https://dexodata.com/en/blog/using-java-for-data-scraping-and-harvesting-on-the-web\" target=\"_blank\" rel=\"noopener\">guide d&eacute;di&eacute; &agrave; JS\u003C/a> et apprenez-en plus sur les navigateurs sans t&ecirc;te, c'est-&agrave;-dire des packages logiciels de navigation sans interface utilisateur. Cela vous aidera &agrave; construire un scraper interagissant avec une pr&eacute;sence comme un v&eacute;ritable utilisateur et extrayant du contenu dynamique simultan&eacute;ment.\u003C/p>\n\u003Cp>3. Notre troisi&egrave;me remarque est d&eacute;di&eacute;e au scraping parall&egrave;le. Le multi-threading en PHP est difficile mais parfois in&eacute;vitable. Voici comment vous pouvez relever ce d&eacute;fi avec le site web proxy de confiance Dexodata. Notre concept est de permettre &agrave; votre script de scraping d'&ecirc;tre ex&eacute;cut&eacute; sur plusieurs instances en appliquant des param&egrave;tres \u003Ccode>HTTP GET\u003C/code>.\u003C/p>\n\u003Cp>Modifiez le script afin qu'il n'it&egrave;re pas sur toutes les pages et se concentre plut&ocirc;t sur des morceaux parall&egrave;les plus petits. Voici comment on peut modifier le script et d&eacute;finir les limites d'un \"morceau\". Il suffit de d&eacute;finir quelques param&egrave;tres GET, comme soulign&eacute; ci-dessous :\u003C/p>\n\u003Cp>\u003Ccode>$from = null;&nbsp;\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>$to = null;&nbsp;\u003C/code>\u003C/p>\n\u003Cp>&nbsp;\u003C/p>\n\u003Cp>\u003Ccode>if (isset($_GET[\"from\"]) &amp;&amp; is_numeric($_GET[\"from\"])) {&nbsp;\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>\u003Cspan style=\"white-space: normal;\">\u003Cspan style=\"white-space: pre;\"> \u003C/span>$from = $_GET[\"from\"];&nbsp;\u003C/span>\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>}&nbsp;\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>if (isset($_GET[\"to\"]) &amp;&amp; is_numeric($_GET[\"to\"])) {&nbsp;\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>\u003Cspan style=\"white-space: normal;\">\u003Cspan style=\"white-space: pre;\"> \u003C/span>$to = $_GET[\"to\"];&nbsp;\u003C/span>\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>}&nbsp;\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>if (is_null($from) || is_null($to) || $from &gt; $to) {&nbsp;\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>\u003Cspan style=\"white-space: normal;\">\u003Cspan style=\"white-space: pre;\"> \u003C/span>die(\"Param&egrave;tres from et to invalides !\");&nbsp;\u003C/span>\u003C/code>\u003C/p>\n\u003Cp>}&nbsp;\u003C/p>\n\u003Cp>// scrape uniquement les pages de pagination dont le num&eacute;ro va&nbsp;\u003C/p>\n\u003Cp>// de \"$from\" &agrave; \"$to\"&nbsp;\u003C/p>\n\u003Cp>\u003Ccode>for ($paginationNumber = $from; $paginationNumber &lt;= $to; $paginationNumber++) {&nbsp;\u003C/code>\u003C/p>\n\u003Cp>\u003Ccode>\u003Cspan style=\"white-space: normal;\">\u003Cspan style=\"white-space: pre;\"> \u003C/span>// logique de scraping...&nbsp;\u003C/span>\u003C/code>\u003C/p>\n\u003Cp>}\u003C/p>\n\u003Cp>// &eacute;crire les donn&eacute;es extraites dans une base de donn&eacute;es/fichier\u003C/p>\n\u003Cp>Cela vous pr&eacute;parera &agrave; initier plusieurs instances en activant plusieurs liens dans le navigateur :\u003C/p>\n\u003Cp>\u003Ccode>https://instance.com/scripts/scrapeme.live/scrape-products.php?from=1&amp;to=5&nbsp;\u003C/code>\u003C/p>\n\u003Cp>et similaires.\u003C/p>\n\u003Cp>Ils seront ex&eacute;cut&eacute;s simultan&eacute;ment et scraperont la pr&eacute;sence en parall&egrave;le. C'est tout. Merci de rester avec Dexodata, votre &eacute;cosyst&egrave;me &eacute;thique de proxies mobiles, de centre de donn&eacute;es et r&eacute;sidentiels \u003Ca href=\"https://dexodata.com/en/blog/why-dexodata-implements-aml-and-kyc-policies\" target=\"_blank\" rel=\"noopener\">avec toutes les normes KYC et AML appliqu&eacute;es\u003C/a>.\u003C/p>\u003C/body>\u003C/html>\n",[],[],1783936367240]