FRFAM.COM >> Famille >> Technologie &Innovation >> Informatique

Grattez un site Web avec ce magnifique tutoriel Soup Python

Beautiful Soup est une bibliothèque Python open-source. Il utilise des analyseurs de navigation pour récupérer le contenu des fichiers XML et HTML. Vous avez besoin de données à plusieurs fins analytiques. Cependant, si vous débutez avec Python et le web scraping, la bibliothèque Beautiful Soup de Python vaut la peine d'être essayée pour un projet de web scraping.

Avec la bibliothèque open source Beautiful Soup de Python, vous pouvez obtenir des données en grattant n'importe quelle partie ou élément d'une page Web avec un contrôle maximal sur le processus. Dans cet article, nous examinons comment vous pouvez utiliser Beautiful Soup pour gratter un site Web.

Comment installer Beautiful Soup et démarrer avec

Avant de continuer, dans cet article du didacticiel Beautiful Soup, nous utiliserons Python 3 et beautifulsoup4 , la dernière version de Beautiful Soup. Assurez-vous de créer un environnement virtuel Python pour isoler votre projet et ses packages de ceux de votre machine locale.

Pour commencer, vous devez installer la bibliothèque Beautiful Soup dans votre environnement virtuel. Beautiful Soup est disponible sous forme de package PyPi pour tous les systèmes d'exploitation, vous pouvez donc l'installer avec le pip install beautifulsoup4 commande via le terminal.

Cependant, si vous êtes sous Debian ou Linux, la commande ci-dessus fonctionne toujours, mais vous pouvez l'installer avec le gestionnaire de paquets en exécutant apt-get install python3-bs4 .

Beautiful Soup ne récupère pas directement les URL. Il ne fonctionne qu'avec des fichiers HTML ou XML prêts à l'emploi. Cela signifie que vous ne pouvez pas lui transmettre directement une URL. Pour résoudre ce problème, vous devez obtenir l'URL du site Web cible avec la bibliothèque de requêtes de Python avant de l'envoyer à Beautiful Soup.

Pour rendre cette bibliothèque disponible pour votre scraper, exécutez les requêtes d'installation pip commande via le terminal.

Pour utiliser la bibliothèque d'analyseur XML, exécutez pip install lxml pour l'installer.

Inspectez la page Web que vous souhaitez supprimer

Avant de supprimer un site Web que vous ne connaissez pas, une bonne pratique consiste à inspecter ses éléments. Vous pouvez le faire en basculant votre navigateur en mode développeur. Il est assez facile d'utiliser Chrome DevTools si vous utilisez Google Chrome.

Cependant, il est nécessaire d'inspecter une page Web pour en savoir plus sur ses balises HTML, ses attributs, ses classes et ses identifiants. Cela expose les éléments de base d'une page Web et ses types de contenu.

Il vous aide également à développer les meilleures stratégies que vous pouvez utiliser pour obtenir les données exactes que vous souhaitez à partir d'un site Web et comment vous pouvez les obtenir.

Comment gratter les données d'un site Web avec une belle soupe

Maintenant que tout est prêt, ouvrez un éditeur de code préféré et créez un nouveau fichier Python, en lui donnant un nom choisi. Cependant, vous pouvez également utiliser des IDE Web tels que Jupyter Notebook si vous n'êtes pas familiarisé avec l'exécution de Python via la ligne de commande.

Ensuite, importez les bibliothèques nécessaires :

à partir de bs4 import BeautifulSoup 
demandes d'importation

Tout d'abord, voyons comment fonctionne la bibliothèque de requêtes :

à partir de bs4 import BeautifulSoup 
demandes d'importation
site Web =demandes.get('http://somewebpages.com')
imprimer (site web)

Lorsque vous exécutez le code ci-dessus, il renvoie un statut 200, indiquant que votre demande a abouti. Sinon, vous obtenez un statut 400 ou d'autres statuts d'erreur indiquant l'échec de la requête GET.

N'oubliez pas de toujours remplacer l'URL du site Web entre parenthèses par votre URL cible.

Une fois que vous obtenez le site Web avec le get demande, vous la transmettez ensuite à Beautiful Soup, qui peut désormais lire le contenu sous forme de fichiers HTML ou XML à l'aide de son analyseur XML ou HTML intégré, selon le format choisi.

Jetez un œil à cet extrait de code suivant pour voir comment procéder avec l'analyseur HTML :

à partir de bs4 import BeautifulSoup 
demandes d'importation
site Web =demandes.get('http://somewebpages.com')
soupe =BeautifulSoup(website.content, 'html.parser')
imprimer (soupe)

Le code ci-dessus renvoie l'intégralité du DOM d'une page Web avec son contenu.

Vous pouvez également obtenir une version plus alignée du DOM en utilisant le prettify méthode. Vous pouvez essayer ceci pour voir son résultat :

à partir de bs4 import BeautifulSoup 
demandes d'importation
site Web =demandes.get('http://somewebpages.com/')
soupe =BeautifulSoup(website.content, 'html.parser')
print(soupe.prettify())

Vous pouvez également obtenir le contenu pur d'une page Web sans charger son élément avec le .text méthode :

à partir de bs4 import BeautifulSoup 
demandes d'importation
site Web =demandes.get('http://somewebpages.com/')
soupe =BeautifulSoup(website.content, 'html.parser')
print(soupe.texte)

Comment récupérer le contenu d'une page Web par le nom de la balise

Vous pouvez également gratter le contenu d'une balise particulière avec Beautiful Soup. Pour ce faire, vous devez inclure le nom du tag cible dans votre demande de scraper Beautiful Soup.

Par exemple, voyons comment vous pouvez obtenir le contenu dans le h2 balises d'une page Web.

à partir de bs4 import BeautifulSoup 
demandes d'importation
site Web =demandes.get('http://somewebpages.com/')
soupe =BeautifulSoup(website.content, 'html.parser')
print(soupe.h2)

Dans l'extrait de code ci-dessus, soup.h2 renvoie le premier h2 élément de la page Web et ignore le reste. Pour charger tous les h2 éléments, vous pouvez utiliser le find_all fonction intégrée et pour boucle de Python :

à partir de bs4 import BeautifulSoup 
demandes d'importation
site Web =demandes.get('http://somewebpages.com/')
soupe =BeautifulSoup(website.content, 'html.parser')
h2tags =soupe.find_all('h2')
pour les soupes en h2tags :
imprimer (soupes)

Ce bloc de code renvoie tous les h2 éléments et leur contenu. Cependant, vous pouvez obtenir le contenu sans charger la balise en utilisant le .string méthode :

à partir de bs4 import BeautifulSoup 
demandes d'importation
site Web =demandes.get('http://somewebpages.com/')
soupe =BeautifulSoup(website.content, 'html.parser')
h2tags =soupe.find_all('h2')
pour les soupes en h2tags :
print(soupes.string)

Vous pouvez utiliser cette méthode pour n'importe quelle balise HTML. Tout ce que vous avez à faire est de remplacer le h2 tag avec celui que vous aimez.

Cependant, vous pouvez également récupérer plus de balises en transmettant une liste de balises dans find_all méthode. Par exemple, le bloc de code ci-dessous récupère le contenu de a , h2 , et titre balises :

à partir de bs4 import BeautifulSoup 
demandes d'importation
site Web =demandes.get('http://somewebpages.com/')
soupe =BeautifulSoup(website.content, 'html.parser')
tags =soup.find_all(['a', 'h2', 'title'])
pour les soupes dans les balises :
print(soupes.string)

Comment gratter une page Web à l'aide de l'ID et du nom de la classe

Après avoir inspecté un site Web avec les DevTools, il vous permet d'en savoir plus sur les attributs id et class contenant chaque élément dans son DOM. Une fois que vous avez cette information, vous pouvez gratter cette page Web en utilisant cette méthode. C'est utile lorsque le contenu d'un composant cible sort en boucle de la base de données.

Vous pouvez utiliser la recherche méthode pour les scrapers d'id et de classe. Contrairement à find_all méthode qui retourne un objet itérable, le find la méthode fonctionne sur une seule cible non itérable, qui est l'id dans ce cas. Ainsi, vous n'avez pas besoin d'utiliser le pour boucle avec elle.

Regardons un exemple de la façon dont vous pouvez récupérer le contenu d'une page ci-dessous en utilisant l'identifiant :

à partir de bs4 import BeautifulSoup 
demandes d'importation
site Web =demandes.get('http://somewebpages.com/')
soupe =BeautifulSoup(website.content, 'html.parser')
id =soup.find(id ='entrez l'id cible ici')
print(id.text)

Pour ce faire pour un nom de classe, remplacez le id avec classe . Cependant, écrire class entraîne directement une confusion de syntaxe car Python le considère comme un mot-clé. Pour contourner cette erreur, vous devez écrire un trait de soulignement devant la classe comme ceci :class_ .

Essentiellement, la ligne contenant l'identifiant devient :

my_classes =soup.find(class_ ='entrez le nom de la classe cible ici') 
print(my_classes.text)

Cependant, vous pouvez également scraper une page Web en appelant un nom de balise particulier avec son identifiant ou sa classe correspondante :

data =soup.find_all('div', class_ ='entrez le nom de la classe cible ici') 
imprimer (données)

Comment faire un grattoir réutilisable avec une belle soupe

Vous pouvez créer une classe et rassembler tout le code précédent dans une fonction de cette classe pour créer un grattoir réutilisable qui récupère le contenu de certaines balises et leurs identifiants. Nous pouvons le faire en créant une fonction qui accepte cinq arguments :une URL, deux noms de balises et leurs identifiants ou classes correspondants.

Supposons que vous vouliez gratter le prix des chemises d'un site Web de commerce électronique. L'exemple de classe de scraper ci-dessous extrait les balises price et shirt avec leurs identifiants ou classes correspondants, puis les renvoie sous la forme d'un cadre de données Pandas avec "Price" et Shirt_name comme noms de colonne.

Assurez-vous que vous installez pandas par pip via le terminal si vous ne l'avez pas déjà fait.

importer des pandas en tant que pd 
scrapeit de classe :
essayer:
def scrape(website=Aucun, tag1=Aucun, id1=Aucun, tag2=Aucun, id2=Aucun):
sinon (site web et tag1 et id1 et tag2 et id2)==Aucun :
essayer:
page =demandes.get(site web)
soupe =BeautifulSoup(page.content, 'html.parser')
infotag1 =soupe.find_all(tag1, id1)
infotag2 =soupe.find_all(tag2, id2)
priced =[prices.text pour les prix dans l'infotag1]
shirt =[shirts.text pour les chemises dans l'infotag2]
données ={
'Prix' :tarifé,
'Nom_chemise' :chemise}
info =pd.DataFrame(data, columns=['Price', 'Shirt_name'])
imprimer (infos)
à l'exception:
print('Pas réussi')
autre:
print('Oups ! Veuillez entrer un site Web, deux balises et leurs identifiants correspondants')
à l'exception:
print('Pas réussi !')

Le scraper que vous venez de créer est un module réutilisable et vous pouvez l'importer et l'utiliser dans un autre fichier Python. Pour appeler le grattage fonction de sa classe, vous utilisez scrapeit.scrape('URL du site Web', 'price_tag', 'price_id', 'shirt_tag', 'shirt_id') . Si vous ne fournissez pas l'URL et d'autres paramètres, le else l'instruction vous invite à le faire.

Pour utiliser ce scaper dans un autre fichier Python, vous pouvez l'importer comme ceci :

à partir de scraper_module importer scrapeit 
scrapeit.scrape('URL', 'price_tag', 'price_id', 'shirt_tag', 'shirt_id')

Remarque : scraper_module est le nom du fichier Python contenant la classe scraper.

Vous pouvez également consulter la documentation Beautiful Soup si vous souhaitez approfondir la manière dont vous pouvez en tirer le meilleur parti.

Beautiful Soup est un précieux outil de scraping Web

Beautiful Soup est un puissant grattoir d'écran Python qui vous permet de contrôler la façon dont vos données apparaissent pendant le grattage. Il s'agit d'un outil commercial précieux, car il peut vous donner accès aux données Web des concurrents, telles que les prix, les tendances du marché, etc.

Bien que nous ayons créé un grattoir de balises dans cet article, vous pouvez toujours jouer avec cette puissante bibliothèque Python pour créer des outils de grattage plus utiles.


[]