Guide de grattage Web avec Python à l'aide d'une belle soupe

Publié: 2020-06-23
Table des matières afficher
Introduction au Web Scraping avec Python :
Comment fonctionne BeautifulSoup ?
Comment extraire des données de pages Web à l'aide de BeautifulSoup ?
Processus de grattage Web :
Conclusion:

Introduction au Web Scraping avec Python :

En matière de scraping Web, certains langages de programmation sont préférés à d'autres. L'un des plus populaires parmi ceux-ci est Python. En plus d'être l'un des langages les plus faciles à apprendre en raison de sa courbe d'apprentissage plus douce, il a également l'avantage d'être un langage avec un support massif pour les développeurs, ce qui a conduit à de nombreux packages tiers. Ces packages peuvent être utilisés pour plusieurs fonctionnalités, ce qui peut être difficile à réaliser avec le noyau Python. Quelques exemples courants sont- pour le traitement d'image ou la vision par ordinateur, nous utilisons OpenCV, pour l'apprentissage automatique, nous utilisons TensorFlow et pour tracer des graphiques, nous utilisons MatplotLib. En ce qui concerne le web scraping, l'une des bibliothèques les plus couramment utilisées est BeautifulSoup. Cette bibliothèque ne récupère pas spécifiquement les données d'Internet, mais si vous pouvez obtenir le fichier HTML d'une page Web, elle peut aider à en extraire des points de données spécifiques. En général, la bibliothèque est utilisée pour extraire des points de données à partir de documents XML et HTML.

Comment fonctionne BeautifulSoup ?

Avant de continuer à écrire du code en Python, vous devez comprendre le fonctionnement de BeautifulSoup. Une fois que vous avez extrait le contenu HTML d'une page Web et que vous l'avez stocké dans une variable, disons html_obj, vous pouvez ensuite le convertir en un objet BeautifulSoup avec une seule ligne de code.

soup_obj = BeautifulSoup(html_obj, 'html.parser')

Où html_obj est les données HTML, le soup_obj est l'objet bs qui a été obtenu et le "html.parser" est l'analyseur qui a été utilisé pour effectuer la conversion. Une fois que vous avez l'objet bs, appelé soup_obj, il est très facile de le parcourir, et comme le parcourir est assez simple, l'extraction de données devient également simple. Prenons un exemple. Supposons que vous deviez récupérer un point de données appelé le titre du produit, qui est présent sur chaque page d'un site Web de commerce électronique. Maintenant, vous avez téléchargé une seule page de produit HTML à partir de ce site Web et réalisé que chaque page a le nom du produit mentionné sur un élément de type span ayant id comme productTitle. Alors, comment allez-vous récupérer ces données à partir de 1 000 pages de produits ? Eh bien, vous obtiendrez les données HTML pour chaque page et récupérerez le point de données de cette manière-

pour les étendues dans soup.findAll('span', attrs={'id': 'productTitle'}):
nom_du_produit = spans.text.strip()

Bien qu'il s'agisse d'un moyen d'obtenir des données textuelles présentes entre un certain élément de balise, vous pouvez également récupérer des données à partir des attributs d'une balise.

Grattage Web

Comment extraire des données de pages Web à l'aide de BeautifulSoup ?

Maintenant que nous avons une compréhension de base de la façon dont un objet bs est parcouru, écrivons du code et voyons comment cela fonctionne. À l'aide de l'extrait de code ci-dessous, vous pouvez très facilement récupérer les données de Zillow, l'un des principaux marchés immobiliers basé aux États-Unis. Vous pouvez exécuter ce code et entrer l'URL d'une liste, pour obtenir les données de sortie au format JSON. Comprenons le code, ligne par ligne. Tout d'abord, assurez-vous que Python 3.7 ou supérieur est installé sur votre machine. Utilisez pip pour installer BeautifulSoup. Tous les autres packages sont pré-groupés avec Python, vous n'aurez donc pas besoin d'en installer aucun. Une fois cela fait, installez un éditeur de code comme Atom ou VS Code, et vous êtes prêt à partir. Comprendre le code est important et nous allons donc commencer par la toute première ligne. Vous avez besoin des quatre instructions d'importation pour des fonctionnalités spécifiques. Ensuite, vous avez trois lignes commençant par "ctx". Celles-ci sont spécifiquement destinées à ignorer les erreurs de certificat SSL que vous pourriez rencontrer lors de l'accès à des sites Web via votre code. Ensuite, nous prenons l'URL du site Web comme entrée de l'utilisateur. Ici, vous pouvez également coder l'URL en dur, ou même avoir un tableau de plusieurs URL.

Processus de grattage Web :

Ensuite, nous accédons à la page Web en utilisant la fonction Request de urllib. Assurez-vous d'ajouter l'agent utilisateur dans l'en-tête pour faire croire au site Web que vous utilisez un navigateur. La raison derrière cela est que les sites Web sont destinés à être accessibles par des navigateurs et non par du code, et par conséquent, ils peuvent bloquer votre adresse IP s'ils vous attrapent. Une fois cela fait, nous avons terminé toutes les étapes de base et ensuite, nous allons convertir l'objet HTML en un objet bs, puis l'embellir au format utf-8, pour gérer les caractères spéciaux et les symboles dans la page Web. Une fois cela fait, nous extrayons le titre, les détails courts et d'autres propriétés en analysant l'objet bs. Comme vous pouvez le voir, dans la balise de script avec l'attribut type = application/ld+json, il existe plusieurs points de données tous stockés au format JSON. De plus, vous pouvez voir que nous utilisons une vérification i==0 et i==1. C'est parce qu'il y a deux balises de script (avec le même attribut) comme celle-ci dans une page. La première balise nous donne quelques points de données, tandis que la seconde donne le reste. Une fois que nous avons extrait tous les points de données, vous pouvez les stocker dans un fichier JSON et les enregistrer tels quels. Vous pouvez également enregistrer, télécharger sur un site ou même utiliser une API avec les données si vous le souhaitez.

importer json
importer SSL
à partir de urllib.request demande d'importation, urlopen
depuis bs4 importer BeautifulSoup

# Ignorer les erreurs de certificat SSL
ctx = ssl.create_default_context()
ctx.check_hostname=Faux
ctx.verify_mode = ssl.CERT_NONE

# Prenez l'URL de la liste Zillow en entrée
url = input('Entrez l'URL de la liste des maisons Zillow- ')

# Faire croire au site Web que vous utilisez un navigateur
req = Request(url, headers={'User-Agent': 'Mozilla/5.0'})
page Web = urlopen(req).read()

# Page HTML -> BeautifulSoup Object soup = BeautifulSoup(webpage, 'html.parser')
html = soup.prettify('utf-8')
propriété_details = {'details_long' : {}, 'adresse' : {}}

# Extraire différents points de données de la liste des propriétés
pour le titre dans soup.findAll('title'):
property_details['Title'] = title.text.strip()
Pause

for meta in soup.findAll('meta', attrs={'name': 'description'}):
property_details['details_short'] = meta['content'].strip()

for div in soup.findAll('div', attrs={'class': 'character-count-truncated'}):
property_details['details_long']['Description'] = div.text.strip()

pour (i, script) dans enumerate(soup.findAll('script',
attrs={'type' : 'application/ld+json'})) :
si je == 0 :
json_data = json.loads(script.text)
property_details['details_long']['no_of_rooms'] = json_data['numberOfRooms']
property_details['details_long']['floor_size_in_sqrft'] = json_data['floorSize']['value']
property_details['address']['street'] = json_data['address']['streetAddress']
property_details['adresse']['localité'] = json_data['adresse']['adresselocalité']
property_details['address']['region'] = json_data['address']['addressRegion']
property_details['address']['postal_code'] = json_data['address']['postalCode']
si je == 1 :
json_data = json.loads(script.text)
property_details['price_in_dollars'] = json_data['offers']['price']
property_details['inage'] = json_data['image']
Pause

avec open('house_listing_data.json', 'w') comme fichier de sortie :
json.dump(property_details, outfile, indent=4)

avec open('house_listing_data.html', 'wb') comme fichier :
fichier.write(html)

print('———-L'extraction des données est terminée. Vérifier le fichier json.———-')

La sortie JSON devrait ressembler un peu à ceci-

{
"détails_long": {
"no_of_rooms": 3,
« floor_size_in_sqrft » : « 1 392 »
},
"adresse": {
"rue": "22516 Joan Dr",
"localité": "Californie",
"région": "MD",
"code_postal": "20619"
},
"Titre": "22516 Joan Dr, Californie, MD 20619 | MLS #MDSM167670",
"details_short": "22516 Joan Dr, Californie, MD 20619-3175 est une maison unifamiliale mise en vente à 150 000 $. La maison de 1 392 pieds carrés est une propriété de 3 chambres et 2,0 salles de bain. Retrouvez 40 photos de la maison 22516 Joan Dr sur Zillow. Affichez plus de détails sur la propriété, l'historique des ventes et les données Zestimate sur Zillow. MLS # MDSM167670 »,
"prix_en_dollars": 150000,
"inagé": "https://photos.zillowstatic.com/p_h/ISn2oi3glpvdv10000000000.jpg"
}

Conclusion:

Utiliser BeautifulSoup pour vos besoins de grattage Web peut être facile tant que vous pouvez d'abord analyser les pages HTML manuellement et décider des balises qui doivent être ciblées. Il peut fonctionner sur des pages qui n'ont pas de contenu dynamique et qui ne se trouvent pas derrière une page de connexion. Pour les pages Web plus complexes, vous aurez besoin d'outils plus complexes. Notre équipe de PromptCloud aide les entreprises qui cherchent à exploiter les données et à prendre des décisions fondées sur les données. Non seulement nous aidons à mettre en place des moteurs de grattage Web entièrement automatisés qui s'exécutent à intervalles fréquents, sur le cloud, mais nous aidons également les entreprises à analyser les données pour extraire les tendances et d'autres informations utiles.