Grattez un site Web avec ce magnifique tutoriel de soupe Python

Beautiful Soup est une bibliothèque Python open source. Il utilise des analyseurs de navigation pour extraire le contenu des fichiers XML et HTML. Vous avez besoin de données à plusieurs fins analytiques. Cependant, si vous êtes nouveau dans 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 commencer à l'utiliser

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 la commande pip install beautifulsoup4 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 gratte 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 y passer d'URL directement. 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 le transmettre à Beautiful Soup.

Pour rendre cette bibliothèque disponible pour votre scraper, exécutez la commande pip install requests 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 gratter

Avant de gratter 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 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:

 from bs4 import BeautifulSoup
import requests

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

 from bs4 import BeautifulSoup
import requests
website = requests.get('http://somewebpages.com')
print(website)

Lorsque vous exécutez le code ci-dessus, il renvoie un statut 200, indiquant que votre demande a abouti. Sinon, vous obtenez un état 400 ou d'autres états d'erreur indiquant une demande GET ayant échoué.

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 la demande d' obtention , vous le transmettez à Beautiful Soup, qui peut maintenant lire le contenu sous forme de fichiers HTML ou XML à l'aide de son analyseur XML ou HTML intégré, en fonction du format choisi.

Jetez un œil à cet extrait de code suivant pour voir comment faire cela avec l'analyseur HTML:

 from bs4 import BeautifulSoup
import requests
website = requests.get('http://somewebpages.com')
soup = BeautifulSoup(website.content, 'html.parser')
print(soup)

Le code ci-dessus renvoie le DOM entier d'une page Web avec son contenu.

Vous pouvez également obtenir une version plus alignée du DOM en utilisant la méthode prettify . Vous pouvez essayer ceci pour voir sa sortie:

 from bs4 import BeautifulSoup
import requests
website = requests.get('http://somewebpages.com/')
soup = BeautifulSoup(website.content, 'html.parser')
print(soup.prettify())

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

 from bs4 import BeautifulSoup
import requests
website = requests.get('http://somewebpages.com/')
soup = BeautifulSoup(website.content, 'html.parser')
print(soup.text)

Comment gratter le contenu d'une page Web par le nom de la balise

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

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

 from bs4 import BeautifulSoup
import requests
website = requests.get('http://somewebpages.com/')
soup = BeautifulSoup(website.content, 'html.parser')
print(soup.h2)

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

 from bs4 import BeautifulSoup
import requests
website = requests.get('http://somewebpages.com/')
soup = BeautifulSoup(website.content, 'html.parser')
h2tags = soup.find_all('h2')
for soups in h2tags:
print(soups)

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

 from bs4 import BeautifulSoup
import requests
website = requests.get('http://somewebpages.com/')
soup = BeautifulSoup(website.content, 'html.parser')
h2tags = soup.find_all('h2')
for soups in h2tags:
print(soups.string)

Vous pouvez utiliser cette méthode pour n'importe quelle balise HTML. Tout ce que vous avez à faire est de remplacer la balise h2 par celle que vous aimez.

Cependant, vous pouvez également gratter plus de balises en passant une liste de balises dans la méthode find_all . Par exemple, le bloc de code ci – dessous écorchures le contenu d'un, h2 et balises de titre:

 from bs4 import BeautifulSoup
import requests
website = requests.get('http://somewebpages.com/')
soup = BeautifulSoup(website.content, 'html.parser')
tags = soup.find_all(['a', 'h2', 'title'])
for soups in tags:
print(soups.string)

Comment gratter une page Web à l'aide de l'ID et du nom de 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 est en boucle depuis la base de données.

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

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

 from bs4 import BeautifulSoup
import requests
website = requests.get('http://somewebpages.com/')
soup = BeautifulSoup(website.content, 'html.parser')
id = soup.find(id = 'enter the target id here')
print(id.text)

Pour ce faire pour un nom de classe, remplacez l' id par class . Cependant, l'écriture d'une classe entraîne directement une confusion de syntaxe car Python la voit comme un mot-clé. Pour contourner cette erreur, vous devez écrire un trait de soulignement devant la classe comme ceci: class_ .

En substance, la ligne contenant l'identifiant devient:

 my_classes = soup.find(class_ = 'enter the target class name here')
print(my_classes.text)

Cependant, vous pouvez également gratter une page Web en appelant un nom de tag particulier avec son identifiant ou sa classe correspondant:

 data = soup.find_all('div', class_ = 'enter the target class name here')
print(data)

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 souhaitiez gratter le prix des chemises d'un site Web de commerce électronique. L'exemple de classe grattoir ci-dessous extrait les étiquettes de prix et de chemise avec leurs identifiants ou classes correspondants, puis la renvoie sous forme de bloc de données Pandas avec 'Price' et Shirt_name comme noms de colonne.

Assurez-vous d' installer les pandas via le terminal si vous ne l'avez pas déjà fait.

 import pandas as pd
class scrapeit:
try:
def scrape(website=None, tag1=None, id1=None, tag2=None, id2=None):
if not (website and tag1 and id1 and tag2 and id2)==None:
try:
page = requests.get(website)
soup = BeautifulSoup(page.content, 'html.parser')
infotag1 = soup.find_all(tag1, id1)
infotag2 = soup.find_all(tag2, id2)
priced = [prices.text for prices in infotag1]
shirt = [shirts.text for shirts in infotag2]
data = {
'Price':priced,
'Shirt_name':shirt}
info = pd.DataFrame(data, columns=['Price', 'Shirt_name'])
print(info)
except:
print('Not successful')
else:
print('Oops! Please enter a website, two tags and thier corresponding ids')
except:
print('Not successful!')

Le grattoir 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 la fonction de éraflure sa classe, vous utilisez scrapeit.scrape ( 'URL Site', 'price_tag', 'price_id', 'shirt_tag', 'shirt_id'). Si vous ne fournissez pas l'URL et d'autres paramètres, l'instruction else vous invite à le faire.

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

 from scraper_module import 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 de Beautiful Soup si vous souhaitez approfondir la manière dont vous pouvez en tirer le meilleur parti.

Beautiful Soup est un outil de raclage Web précieux

Beautiful Soup est un puissant grattoir d'écran Python qui vous permet de contrôler la manière dont vos données sont transmises pendant le grattage. C'est un outil commercial précieux, car il peut vous donner accès aux données Web de vos 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.