Comment créer un explorateur Web de base pour extraire des informations d'un site Web

Comment créer un explorateur Web de base pour extraire des informations d'un site Web / La programmation

Avez-vous déjà voulu capturer par programme des informations spécifiques d'un site Web pour un traitement ultérieur? Dites quelque chose comme les scores sportifs, les tendances boursières ou les dernières lubies, bitcoins et autres prix cryptographiques? Si les informations dont vous avez besoin sont disponibles sur un site Web, vous pouvez écrire un robot (également appelé grattoir ou araignée) pour naviguer sur le site et extraire ce dont vous avez besoin. Voyons comment faire cela en python.

Veuillez noter que plusieurs sites Web découragent l'utilisation d'un robot d'exploration pour accéder aux informations fournies par le site. Alors s'il vous plaît vérifier les termes et conditions du site Web avant de déployer un robot sur n'importe quel site Web.

Installation de Scrapy

Nous utilisons un module python appelé Scrapy pour gérer l’exploration proprement dite. Il est rapide, simple et permet de naviguer sur plusieurs pages Web, comme avec un navigateur..

Notez cependant que scrapy ne dispose d'aucun moyen de traitement de javascript lors de la navigation sur le site. Ainsi, les sites Web et les applications qui utilisent JavaScript pour manipuler l'interface utilisateur ne peuvent pas être analysés correctement avec cette approche..

Laissez-nous maintenant installer scrapy. Nous utilisons virtualenv Apprenez à utiliser l'environnement virtuel Python Apprenez à utiliser l'environnement virtuel Python Que vous soyez un développeur Python expérimenté ou que vous débutiez, apprendre à configurer un environnement virtuel est essentiel pour tout projet Python. Lisez plus pour installer scrapy. Cela nous permet d'installer scrapy dans un répertoire sans affecter les autres modules installés sur le système..

Créer un répertoire et initialiser un environnement virtuel dans ce répertoire.

mkdir crawler cd crawler virtualenv venv. venv / bin / activate 

Vous pouvez maintenant installer scrapy dans ce répertoire.

pip installer scrapy 

Vérifiez que scrapy est installé correctement.

scrapy # prints Scrapy 1.4.0 - pas de projet actif Utilisation: scrapy  [options] [args] Commandes disponibles: bench Exécuter un test de test de référence rapide Récupération d'une URL à l'aide de Scrapy downloader genspider Générer un nouveau spider à l'aide de modèles prédéfinis runspider Exécuter un spider autonome (sans créer de projet)… 

Construire un robot de site Web (aussi appelé une araignée)

Écrivons maintenant un robot pour le chargement de certaines informations. Nous commençons par gratter des informations d'une page Wikipedia sur une batterie de https://en.wikipedia.org/wiki/Battery_(electricity).

La première étape de l'écriture d'un robot consiste à définir une classe python qui s'étend de scrapy.Spider. Appelons cette classe araignée1.

Au minimum, une classe d'araignée nécessite les éléments suivants:

  • une prénom pour identifier l'araignée, “Wikipédia” dans ce cas.
  • une start_urls variable contenant une liste d’URL à partir desquelles commencer l’exploration. Nous utilisons l'URL Wikipedia ci-dessus pour notre première exploration..
  • une parse () méthode qui, même si elle n’est pas opérationnelle pour le moment, est utilisée pour traiter la page Web afin d’extraire ce que nous voulons..
import scrapy class spider1 (scrapy.Spider): name = 'Wikipedia' start_urls = ['https://en.wikipedia.org/wiki/Battery_(electricity)'] def parse (auto, réponse): réussite 

Nous pouvons maintenant exécuter cette araignée pour s'assurer que tout fonctionne correctement. Il est exécuté comme suit.

scrapy runspider spider1.py # imprime 2017-11-23 09:09:21 [scrapy.utils.log] INFO: Scrapy 1.4.0 a commencé (bot: scrapybot) 2017-11-23 09:09:21 [scrapy.utils .log] INFO: paramètres ignorés: 'SPIDER_LOADER_WARN_ONLY': True 2017-11-23 09:09:21 [scrapy.middleware] INFO: extensions activées: ['scrapy.extensions.memusage.MemoryUsage', 'scrapy.extensions .logstats.LogStats ',… 

Désactiver la journalisation

Comme vous pouvez le constater, le fait de fonctionner avec notre classe minimale génère une quantité de sorties qui n’a pas beaucoup de sens pour nous. Définissons le niveau de journalisation sur Attention et réessayez. Ajouter les lignes suivantes au début du fichier.

import logging logging.getLogger ('scrapy'). setLevel (logging.WARNING) 

Lors de la réexécution de l'araignée, nous devrions voir un minimum de messages de journal.

Utiliser Chrome Inspector

Extraire des informations d’une page Web consiste à déterminer la position de l’élément HTML à partir duquel nous voulons des informations. Un moyen simple et agréable de trouver la position d'un élément Problèmes de site Web avec les outils de développement Chrome ou Firebug Problèmes de site Web avec les outils de développement Chrome ou Firebug Si vous avez suivi mes didacticiels jQuery jusqu'à présent, vous avez peut-être déjà rencontré certains problèmes de code et ne sait pas comment les résoudre. Lorsqu'il est confronté à un morceau de code non fonctionnel, il… En savoir plus sur le navigateur Web Chrome: utiliser l'inspecteur.

  • Accédez à la page correcte dans Chrome.
  • Placez la souris sur l'élément pour lequel vous voulez l'information.
  • Faites un clic droit pour afficher le menu contextuel.
  • Sélectionner Inspecter du menu.

Cela devrait apparaître la console de développeur avec le Éléments onglet sélectionné. En bas de l'onglet, vous devriez voir la barre d'état avec la position de l'élément comme suit:

html body div # content.mw-body h1 # firstHeading.firstHeading.

Comme nous l'expliquons ci-dessous, vous avez besoin de tout ou partie de ce poste..

Extraire le titre

Ajoutons maintenant du code à la parse () méthode pour extraire le titre de la page.

… Def parse (self, response): print response.css ('h1 # firstHeading :: text'). Extract ()… 

le réponse l'argument de la méthode prend en charge une méthode appelée css () qui sélectionne des éléments de la page en utilisant l’emplacement donné. Pour notre cas, l'élément est h1.firstHeading. Nous avons besoin du contenu textuel de l'élément pour que nous ajoutions ::texte à la sélection. Finalement, le extrait() méthode retourne l'élément sélectionné.

En exécutant une fois de plus du papier peint sur cette classe, nous obtenons le résultat suivant:

[u'Battery (électricité) '] 

Cela montre que le titre a été extrait dans une liste de chaînes unicode.

Comment sur la description?

Pour illustrer certains aspects supplémentaires de l'extraction de données à partir de pages Web, obtenons le premier paragraphe de la description à partir de la page Wikipedia ci-dessus..

Lors de l'inspection à l'aide de la Chrome Developer Console, nous constatons que l'emplacement de l'élément est (Le crochet à angle droit (>) indique une relation parent-enfant entre les éléments):

div # mw-content-text> div> p

Cet endroit retourne tout la p éléments correspondants, qui comprend la description complète. Puisque nous voulons juste le premier p élément, nous utilisons l'extracteur suivant:

response.css ('div # mw-contenu-texte> div> p') [0] 

Pour extraire uniquement le contenu du texte, nous ajoutons un extracteur CSS ::texte:

response.css ('div # mw-contenu-texte> div> p') [0] .css (':: text') 

L'expression finale utilise extrait() qui retourne une liste de chaînes unicode. Nous utilisons le python joindre() fonction pour rejoindre la liste.

 def parse (self, response): print ".join (response.css ('div # mw-contenu-text> div> p') [0] .css (':: text'). extrait ()) 

Nous cherchons le résultat obtenu avec cette classe:

Une batterie électrique est un dispositif constitué d'une ou de plusieurs cellules électrochimiques avec des connexions externes fournies pour alimenter des appareils électriques tels que des lampes de poche, des smartphones et des voitures électriques. [1] Quand une batterie fournit de l'énergie électrique, sa borne positive est… 

Collecte de données en utilisant rendement

Le code ci-dessus imprime les données extraites sur la console. Lorsque vous devez collecter des données au format JSON, vous pouvez utiliser le rendement déclaration. Le chemin rendement fonctionne comme suit - en exécutant une fonction qui contient un rendement instruction renvoie ce qui est appelé un générateur à l'appelant. Le générateur est une fonction que l'appelant peut exécuter à plusieurs reprises jusqu'à ce qu'il se termine.

Voici un code similaire au précédent, mais qui utilise le rendement instruction pour retourner la liste des p éléments dans le code HTML.

… Def parse (self, response): for e dans response.css ('div # mw-contenu-text> div> p'): return 'para': ". Join (e.css (':: text' ) .extract ()). strip ()… 

Vous pouvez maintenant exécuter l'araignée en spécifiant un fichier JSON de sortie comme suit:

raclante runspider spider3.py -o joe.json 

La sortie générée est la suivante:

["para": "Une batterie électrique est un dispositif composé d'une ou plusieurs cellules électrochimiques avec des connexions externes fournies pour alimenter des appareils électriques tels que des lampes de poche, des smartphones et des voitures électriques. [1] Lorsqu'une batterie fournit de l'énergie électrique, son la borne positive correspond à la cathode et la borne négative à l’anode. [2] La borne marquée négative est la source d’électrons qui, lorsqu’elles sont connectées à un circuit externe, circulent et fournissent de l’énergie à un dispositif externe. circuit, les électrolytes sont capables de se déplacer en tant qu’ions à l’intérieur, ce qui permet d’achever les réactions chimiques aux bornes et ainsi de fournir de l’énergie au circuit externe. C’est le mouvement de ces ions dans la batterie qui permet au courant de sortir de la batterie. [3] Historiquement, le terme "batterie" faisait spécifiquement référence à un dispositif composé de plusieurs cellules, mais son utilisation a évolué de manière à inclure les dispositifs gle cell. [4] ", " para ":" Les piles primaires (à usage unique ou "jetables") sont utilisées une seule fois et sont jetées au rebut; les matériaux d'électrode sont changés de façon irréversible pendant la décharge. Des exemples courants sont la pile alcaline utilisée pour les lampes de poche et une multitude d’appareils électroniques portables. Les piles secondaires (rechargeables) peuvent être déchargées et rechargées plusieurs… 

Traitement de plusieurs bits d'information

Voyons maintenant comment extraire plusieurs bits d’information. Pour cet exemple, nous allons extraire les meilleurs hits IMDb Box Office pour le week-end en cours. Ces informations sont disponibles à l'adresse http://www.imdb.com/chart/boxoffice, dans un tableau avec une rangée d'informations pour chaque hit..

Nous extrayons divers champs dans chaque ligne en utilisant ce qui suit parse () méthode. De nouveau, les emplacements CSS des éléments ont été déterminés à l'aide de la console pour développeur Chrome, comme expliqué ci-dessus:

… Def parse (self, response): for e dans response.css ('div # boxoffice> table> tbody> tr'): return 'title': ". Join (e.css ('td.titleColumn> a: : text '). extract ()). strip (),' weekend ': ". join (e.css (' td.ratingColumn ') [0] .css (' :: text '). extract ()). strip (), 'gross': ". join (e.css ('td.ratingColumn') [1] .css ('span.secondaryInfo :: text'). extract ()). strip (), 'semaines' : ". join (e.css ('td.weeksColumn :: text'). extract ()). strip (), 'image': e.css ('td.posterColumn img :: attr (src)'). extract_first (),… 

Notez que le image le sélecteur ci-dessus spécifie que img est un descendant de td.posterColumn, et nous extrayons l'attribut appelé src en utilisant l'expression :: attr (src).

L'exécution de l'araignée renvoie maintenant le JSON suivant:

["brut": "93,8 M $", "semaines": "1", "fin de semaine": "93,8 M $", "image": "https://images-na.ssl-images-amazon.com/images , ",4 ,4 ,4 ,4 ,4 ,4 ,4 ,4 ,4 ,4 ,4 Bande-de-Paris , "brut": "247,3 millions de dollars", "semaines": "3", "week-end": "21,7 millions de dollars", "image": "https://images-na.ssl-images-amazon.com/ images / M / MV5BMjMyNDkzMzI1OF5BMl5BanBnXkFtZTgwODcxODg5MjI @ ._ V1_UY67_CR0,0,45,67_AL_.jpg "," titre ":" Thor: Ragnarok ",…] 

Utiliser votre robot

Terminons maintenant cet article par quelques points saillants:

  • L'utilisation de python avec scrapy facilite l'écriture de robots d'exploration de sites Web pour extraire les informations dont vous avez besoin.
  • Chrome Developer Console (ou l’outil Firebug de Firefox) permet de localiser les emplacements des éléments à extraire..
  • De python rendement instruction aide à extraire des éléments de données répétés.

Avez-vous des projets spécifiques en tête pour le raclage de sites Web? Et quels problèmes avez-vous rencontrés en essayant de le faire avancer? Veuillez nous en informer dans les commentaires ci-dessous.

Crédit d'image: dxinerz / Depositphotos | Lulzmango / Wikimedia Commons

En savoir plus sur: Programmation, Python, Outils pour les webmasters.