Commençons par une petite section sur ce que signifie réellement le scraping Web. Nous utilisons tous le web scraping dans notre vie de tous les jours. Il décrit simplement le processus d'extraction d'informations à partir d'un site Web. Par conséquent, si vous copiez et collez une recette de votre plat de nouilles préféré depuis Internet vers votre cahier personnel, vous effectuez un «web scraping». Lors de l'utilisation de ce terme dans l'industrie du logiciel, nous nous référons généralement à l'automatisation de cette tâche manuelle en utilisant un logiciel. Pour reprendre notre exemple précédent de «plat de nouilles», ce processus comporte généralement deux étapes:
- Récupération de la page
Nous devons d'abord télécharger la page dans son ensemble. Cette étape revient à ouvrir la page dans votre navigateur Web lors du scraping manuellement. - Analyse des données
Maintenant, nous devons extraire la recette dans le HTML du site Web et la convertir en un format lisible par machine comme JSON ou XML.
Dans le passé, j'ai travaillé pour de nombreuses entreprises en tant que consultant en données. J'ai été étonné de voir combien de tâches d'extraction de données, d'agrégation et d'enrichissement sont encore effectuées manuellement et pourraient être automatisées avec seulement quelques lignes de code. C'est exactement ce que représente pour moi le web scraping: extraire et normaliser des informations précieuses d'un site Web pour alimenter un autre processus commercial générateur de valeur.
Pendant ce temps, j'ai vu des entreprises utiliser le web scraping pour toutes sortes de cas d'utilisation. Les entreprises d'investissement se sont principalement concentrées sur la collecte de données alternatives, telles que des critiques de produits, des informations sur les prix ou des publications sur les réseaux sociaux pour soutenir leurs investissements financiers. Un exemple: un client m'a contacté pour collecter les données d'évaluation des produits pour une liste complète de produits de plusieurs sites Web de commerce électronique, y compris la note, l'emplacement de l'évaluateur et le texte de l'avis pour chaque avis soumis. Les données de résultat ont permis au client d'identifier les tendances concernant la popularité du produit sur différents marchés. Ceci est un excellent exemple de la façon dont une seule information apparemment «inutile» peut devenir précieuse par rapport à une plus grande quantité.
D'autres entreprises accélèrent leur processus de vente en utilisant le web scraping pour générer des leads. Ce processus implique généralement l'extraction d'informations de contact telles que le numéro de téléphone, l'adresse e-mail et le nom du contact pour une liste donnée de sites Web. L'automatisation de cette tâche donne aux équipes commerciales plus de temps pour approcher les prospects. Par conséquent, l'efficacité du processus de vente augmente.
Stick To The Rules
En général, le web scraping de données accessibles au public est légal, comme le confirme la compétence de l'affaire Linkedin vs. HiQ . Cependant, je me suis fixé un ensemble de règles éthiques que j'aime respecter lors du démarrage d'un nouveau projet de web scraping. Cela inclut:
- Vérification du fichier robots.txt.
Il contient généralement des informations claires sur les parties du site auxquelles le propriétaire de la page peut accéder et met en évidence les sections qui ne doivent pas être consultées. [19659005] Lecture des termes et conditions.
Par rapport au robots.txt, cette information n'est pas disponible moins souvent, mais indique généralement comment ils traitent les grattoirs de données. - Grattage à vitesse modérée.
Le grattage crée charge du serveur sur l'infrastructure du site cible. En fonction de ce que vous récupérez et du niveau de concurrence auquel votre scraper fonctionne, le trafic peut entraîner des problèmes pour l’infrastructure serveur du site cible. Bien sûr, la capacité du serveur joue un grand rôle dans cette équation. Par conséquent, la vitesse de mon grattoir est toujours un équilibre entre la quantité de données que je cherche à gratter et la popularité du site cible. Pour trouver cet équilibre, il suffit de répondre à une seule question: "La vitesse prévue va-t-elle modifier de manière significative le trafic organique du site?". Dans les cas où je ne suis pas sûr de la quantité de trafic naturel d'un site, j'utilise des outils comme ahrefs pour avoir une idée approximative.
Sélection de la bonne technologie
En fait, gratter avec un headless Le navigateur est l'une des technologies les moins performantes que vous puissiez utiliser, car elle a un impact important sur votre infrastructure. Un cœur du processeur de votre machine peut gérer approximativement une instance de chrome.
Faisons un rapide exemple de calcul pour voir ce que cela signifie pour un projet de scraping Web réel.
Szenario
- Vous voulez supprimer 20 000 URL.
- Le temps de réponse moyen du site cible est de 6 secondes.
- Votre serveur dispose de 2 cœurs de processeur.
Le projet prendra 16 heures pour se terminer.
Par conséquent, j'essaie toujours d'éviter d'utiliser un navigateur lors d'un test de faisabilité de grattage pour un site Web dynamique.
Voici une petite liste de contrôle que je passe toujours en revue:
☐ Puis-je forcer l'état de la page requis via les paramètres GET dans l'URL? Si oui, nous pouvons simplement exécuter une requête HTTP avec les paramètres ajoutés.
☐ Les informations dynamiques font-elles partie de la source de la page et sont-elles disponibles via un objet javascript quelque part dans le DOM? Si oui, nous pouvons à nouveau utiliser une requête HTTP normale et analyser les données de l'objet stringifié.
☐ Les données sont-elles récupérées via une requête XHR? Si tel est le cas, puis-je accéder directement au point de terminaison avec un client HTTP? Si oui, nous pouvons envoyer une requête HTTP directement au point de terminaison. Souvent, la réponse est même formatée en JSON, ce qui nous facilite beaucoup la vie.
Si toutes les questions sont répondues par un «NON» définitif, nous manquons officiellement d'options possibles pour utiliser un client HTTP. Bien sûr, il peut y avoir plus de réglages spécifiques au site que nous pourrions essayer, mais généralement, le temps nécessaire pour les comprendre est trop long, par rapport aux performances plus lentes d'un navigateur sans tête. La beauté du grattage avec un navigateur est que vous pouvez gratter tout ce qui est soumis à la règle de base suivante:
Si vous pouvez le voir avec un navigateur, vous pouvez le gratter.
Prenons le site suivant comme exemple pour notre grattoir: https://quotes.toscrape.com/search.aspx . Il présente des citations d'une liste d'auteurs donnés pour une liste de sujets. Toutes les données sont récupérées via XHR.
Quiconque a examiné de près le fonctionnement du site et a parcouru la liste de contrôle ci-dessus s'est probablement rendu compte que les citations pouvaient en fait être récupérées à l'aide d'un client HTTP, car elles peuvent être récupérées en faisant une POST-request sur le point de terminaison de devis directement. Mais puisque ce didacticiel est censé couvrir comment gratter un site Web à l'aide de Puppeteer, nous allons prétendre que c'était impossible.
Installation des prérequis
Puisque nous allons tout construire en utilisant Node.js, ouvrons d'abord un nouveau dossier et créer un nouveau projet de nœud à l'intérieur, en exécutant la commande suivante:
mkdir js-webscraper
cd js-webscraper
npm init
Veuillez vous assurer d'avoir préalablement installé le gestionnaire d'empaquetage npm.
L'installateur nous posera quelques questions sur les méta-informations sur ce projet, que nous pouvons tous ignorer en appuyant sur Entrée.
Installer Puppeteer
Nous avons déjà parlé de scraping avec un navigateur. Puppeteer est une API NodeJS qui nous permet de parler à une instance de chrome headless par programmation.
Installons-le en utilisant npm:
npm install puppeteer
Building Our Scraper
Maintenant, commençons à construire notre grattoir en création d'un nouveau fichier, appelé scraper.js.
Tout d'abord, nous importons la bibliothèque précédemment installée, Puppeteer:
const puppeteer = require ('puppeteer');
Comme étape suivante, nous demandons à Puppeteer d'ouvrir une nouvelle instance de navigateur dans une fonction asynchrone et auto-exécutable:
(async function scrape () {
navigateur const = attendre puppeteer.launch ({headless: false});
// La logique de raclage arrive ici…
}) ();
Remarque : Par défaut, le mode sans tête est désactivé, car cela augmente les performances. Cependant, lors de la construction d'un nouveau grattoir, j'aime désactiver le mode sans tête. Cela nous permet de suivre le processus que traverse le navigateur et de voir tout le contenu rendu. Cela nous aidera à déboguer notre script plus tard.
Dans notre instance de navigateur ouverte, nous ouvrons maintenant une nouvelle page et nous dirigeons vers notre URL cible:
const page = wait browser.newPage ();
wait page.goto ('https://quotes.toscrape.com/search.aspx');
Dans le cadre de la fonction asynchrone, nous utiliserons l'instruction await
pour attendre la commande suivante à exécuter avant de passer à la ligne de code suivante.
Maintenant que nous avons réussi à ouvrir une fenêtre de navigateur et à naviguer vers la page, nous devons créer l'état du site Web, de sorte que les informations souhaitées deviennent visibles pour le grattage. [19659008] Les rubriques disponibles sont générées dynamiquement pour un auteur sélectionné. Par conséquent, nous allons d'abord sélectionner «Albert Einstein» et attendre la liste de sujets générée. Une fois la liste entièrement générée, nous sélectionnons «apprentissage» comme sujet et le sélectionnons comme deuxième paramètre de formulaire. Nous cliquons ensuite sur soumettre et extrayons les citations récupérées du conteneur qui contient les résultats.
Comme nous allons maintenant convertir cela en logique javascript, faisons d'abord une liste de tous les sélecteurs d'élément dont nous avons parlé dans le précédent paragraphe:
author select-field | #author |
tag select-field | #tag |
submit button | input [type=”submit”] |
quote-container | .quote [19659066] Avant de commencer à interagir avec la page, nous nous assurerons que tous les éléments auxquels nous accéderons sont visibles, en ajoutant les lignes suivantes à notre script:
|