Introduction à Python Web Stracing et la belle bibliothèque de soupe

Introduction à Python Web Stracing et la belle bibliothèque de soupe

Objectif

Apprendre à extraire les informations d'une page HTML à l'aide de Python et de la belle bibliothèque de soupe.

Exigences

  • Compréhension des bases du python et de la programmation orientée objet

Conventions

  • # - exige que la commande Linux soit exécutée avec des privilèges racine
    directement en tant qu'utilisateur racine ou en utilisant Sudo commande
  • $ - Étant donné la commande Linux à exécuter en tant qu'utilisateur non privilégié régulier

Introduction

Le grattage Web est une technique qui consiste à l'extraction des données d'un site Web via l'utilisation de logiciels dédiés. Dans ce tutoriel, nous verrons comment effectuer un grattage Web de base à l'aide de Python et de la belle bibliothèque de soupe. Nous utiliserons python3 ciblant la page d'accueil de Rotten Tomatoes, le célèbre agrégateur de critiques et d'actualités pour les films et les émissions de télévision, comme source d'informations pour notre exercice.

Installation de la belle bibliothèque de soupe

Pour effectuer notre grattage, nous utiliserons la belle bibliothèque de soupe Python, donc la première chose que nous devons faire est de l'installer. La bibliothèque est disponible dans les référentiels de toutes les principales distributions GNU \ Linux, nous pouvons donc l'installer en utilisant notre gestionnaire de packages préféré, ou en utilisant pépin, La voie native Python pour installer des packages.

Si l'utilisation du gestionnaire de packages de distribution est préférée et que nous utilisons Fedora:

$ sudo dnf installer python3-beautifulSoup4

Sur Debian et ses dérivés, le package s'appelle BeautifulSoup4:

$ sudo apt-get install BeautifulSoup4

Sur Archilinux, nous pouvons l'installer via Pacman:

$ sudo pacman -s python-beecufilulusoup4

Si nous voulons utiliser pépin, Au lieu de cela, nous pouvons simplement courir:

Installation de Pip3 $ - User BeautifulSoup4

En exécutant la commande ci-dessus avec le --utilisateur Flag, nous allons installer la dernière version de la belle bibliothèque de soupe uniquement pour notre utilisateur, donc aucune autorisation racine nécessaire. Bien sûr, vous pouvez décider d'utiliser PIP pour installer le package à l'échelle mondiale, mais personnellement, j'ai tendance à préférer les installations par utilisateur lorsque je n'utilise pas le gestionnaire de package de distribution.



L'objet BeautifulSoup

Commençons: la première chose que nous voulons faire est de créer un objet BeautifulSoup. Le constructeur BeautifulSoup accepte soit un chaîne ou une poignée de fichier comme premier argument. Ce dernier est ce qui nous intéresse: nous avons l'URL de la page que nous voulons gratter, donc nous utiliserons le urlopen Méthode de la Urllib.demande bibliothèque (installée par défaut): Cette méthode renvoie un objet de type fichier:

De BS4 Import BeautifulSoup depuis Urllib.Demandez d'importation URLOpen avec URLOpen ('http: // www.tomates pourries.com ') comme page d'accueil: Soup = BeautifulSoup (page d'accueil) 
Copie

À ce stade, notre soupe c'est prêt: le soupe L'objet représente le document dans son intégralité. Nous pouvons commencer à les naviguer et à extraire les données que nous souhaitons en utilisant les méthodes et les propriétés intégrées. Par exemple, disons que nous voulons extraire tous les liens contenus dans la page: nous savons que les liens sont représentés par le un Tag dans HTML et le lien réel est contenu dans le href attribut de la balise, afin que nous puissions utiliser le Trouver tout Méthode de l'objet que nous venons de construire pour accomplir notre tâche:

pour un lien dans la soupe.find_all ('a'): imprimer (lien.get ('href')) 
Copie

En utilisant le Trouver tout Méthode et spécification un En tant que premier argument, qui est le nom de la balise, nous avons recherché tous les liens de la page. Pour chaque lien, nous avons ensuite récupéré et imprimé la valeur du href attribut. Dans BeautifulSoup, les attributs d'un élément sont stockés dans un dictionnaire, donc les récupérer est très facile. Dans ce cas, nous avons utilisé le obtenir Méthode, mais nous aurions pu accéder à la valeur de l'attribut HREF même avec la syntaxe suivante: lien ['href']. Le dictionnaire d'attributs complet lui-même est contenu dans le attribution propriété de l'élément. Le code ci-dessus produira le résultat suivant:

[…] Https: // éditorial.tomates pourries.com / https: // éditorial.tomates pourries.com / 24 cadres / https: // éditorial.tomates pourries.com / binge-guide / https: // éditorial.tomates pourries.com / box-office-guru / https: // éditorial.tomates pourries.com / critiques-consensus / https: // éditorial.tomates pourries.com / cinq films préférés / https: // éditorial.tomates pourries.com / streaming / https: // éditorial.tomates pourries.com / parental-guidance / https: // éditorial.tomates pourries.com / red-carpet-rounup / https: // éditorial.tomates pourries.com / rt-on-dvd / https: // éditorial.tomates pourries.com / the-simpons-décennie / https: // éditorial.tomates pourries.com / sous-culte / https: // éditorial.tomates pourries.com / tech-talk / https: // éditorial.tomates pourries.com / total-recall / […] 

La liste est beaucoup plus longue: ce qui précède n'est qu'un extrait de la sortie, mais vous donne une idée. Le Trouver tout la méthode renvoie tout Étiqueter objets qui correspondent au filtre spécifié. Dans notre cas, nous venons de spécifier le nom de la balise qui devrait être apparié, et aucun autre critère, donc tous les liens sont retournés: nous verrons dans un instant comment restreindre davantage notre recherche.



Un cas de test: récupérer tous les titres «top box office»

Performons un grattage plus restreint. Disons que nous voulons récupérer tous les titres des films qui apparaissent dans la section «Top Box Office» de la page d'accueil Rotten Tomatoes. La première chose que nous voulons faire est d'analyser la page HTML pour cette section: le faisant, nous pouvons observer que l'élément dont nous avons besoin est tous contenus à l'intérieur d'un tableau élément avec le «bureau supérieur» identifiant:

À billetterie supérieure

Nous pouvons également observer que chaque ligne de la table contient des informations sur un film: les scores du titre sont contenus comme texte à l'intérieur d'un portée élément avec la classe «TMeterscore» à l'intérieur de la première cellule de la ligne, tandis que la chaîne représentant le titre du film est contenue dans la deuxième cellule, comme le texte du un étiqueter. Enfin, la dernière cellule contient un lien avec le texte qui représente les résultats du box-office du film. Avec ces références, nous pouvons facilement récupérer toutes les données que nous voulons:

De BS4 Import BeautifulSoup depuis Urllib.Demandez d'importation URLOpen avec URLOpen ('https: // www.tomates pourries.com ') comme page d'accueil: Soup = BeautifulSoup (page d'accueil.lire (), 'html.Parser ') # Nous utilisons d'abord la méthode Find pour récupérer le tableau avec un id-office' top-office 'top_box_office_table = Soup.find ('table', 'id': 'top-box-office') # que nous itéré sur chaque ligne et extraire des informations sur les films pour la ligne dans top_box_office_table.find_all ('tr'): cellules = ligne.find_all ('td') title = cellules [1].trouver un').get_text () Money = cellules [2].trouver un').get_text () score = ligne.find ('span', 'class': 'tMeterscore').get_text () print ('0 - 1 (tomatomètre: 2)'.format (titre, argent, score)) 
Copie

Le code ci-dessus produira le résultat suivant:

Crazy Rich Asiatiques - 24 $.9m (tomatomètre: 93%) Le MEG - 12 $.9m (tomatomètre: 46%) Les meurtres de Happytime - \ 9 $.6m (Tomatomètre: 22%) Mission: impossible - Fallout - 8 $.2m (tomatomètre: 97%) mile 22 - 6 $.5m (Tomatomètre: 20%) Christopher Robin - 6 $.4m (tomatomètre: 70%) Alpha - 6 $.1m (tomatomètre: 83%) Blackkklansman - 5 $.2m (tomatomètre: 95%) Homme mince - 2 $.9m (tomatomètre: 7%) A.X.L. -- 2 $.8m (tomatomètre: 29%) 


Nous avons introduit quelques nouveaux éléments, voyons-les. La première chose que nous avons faite est de récupérer le tableau avec un identifiant de bureau supérieur ", en utilisant le trouver méthode. Cette méthode fonctionne de manière similaire à Trouver tout, Mais alors que ce dernier renvoie une liste qui contient les correspondances trouvées, ou est vide s'il n'y a pas de correspondance, le premier renvoie toujours le premier résultat ou Aucun Si un élément avec les critères spécifiés n'est pas trouvé.

Le premier élément fourni au trouver La méthode est le nom de la balise à considérer dans la recherche, dans ce cas tableau. En tant que deuxième argument, nous avons passé un dictionnaire dans lequel chaque clé représente un attribut de la balise avec sa valeur correspondante. Les paires de valeurs clés fournies dans le dictionnaire représentent les critères qui doivent être satisfaits pour que notre recherche produise une correspondance. Dans ce cas, nous avons recherché le identifiant Attribut à la valeur «Top-Box Office». Remarquez que depuis chacun identifiant Doit être unique dans une page HTML, nous aurions pu simplement omettre le nom de la balise et utiliser cette syntaxe alternative:

top_box_office_table = soupe.find (id = 'top-box-office') 
Copie

Une fois que nous avons récupéré notre table Étiqueter objet, nous avons utilisé le Trouver tout Méthode pour trouver toutes les lignes et itérer sur eux. Pour récupérer les autres éléments, nous avons utilisé les mêmes principes. Nous avons également utilisé une nouvelle méthode, get_text: il ne renvoie que la partie texte contenue dans une balise, ou si aucune n'est spécifiée, dans toute la page. Par exemple, sachant que le pourcentage de score du film est représenté par le texte contenu dans le portée élément avec le tmetterscore classe, nous avons utilisé le get_text Méthode sur l'élément pour le récupérer.

Dans cet exemple, nous venons d'afficher les données récupérées avec un formatage très simple, mais dans un scénario du monde réel, nous aurions peut-être voulu effectuer d'autres manipulations ou les stocker dans une base de données.

Conclusions

Dans ce tutoriel, nous venons de gratter la surface de ce que nous pouvons faire en utilisant Python et une belle bibliothèque de soupe pour effectuer le grattage Web. La bibliothèque contient de nombreuses méthodes que vous pouvez utiliser pour une recherche plus raffinée ou pour mieux naviguer sur la page: pour cela, je recommande fortement de consulter les documents officiels très bien écrits.

Tutoriels Linux connexes:

  • Choses à installer sur Ubuntu 20.04
  • Une introduction à l'automatisation Linux, des outils et des techniques
  • Choses à faire après l'installation d'Ubuntu 20.04 Focal Fossa Linux
  • Masterring Bash Script Loops
  • Mint 20: Mieux que Ubuntu et Microsoft Windows?
  • Commandes Linux: les 20 meilleures commandes les plus importantes que vous devez…
  • Commandes Linux de base
  • Comment créer une application Tkinter à l'aide d'un objet orienté…
  • Ubuntu 20.04 WordPress avec installation Apache
  • Comment monter l'image ISO sur Linux