Salut! JSON est rapidement devenu le format de données le plus populaire sur le Web moderne. En tant qu'expert en web scraping avec plus de 5 ans d'expérience, j'ai vu JSON passer d'un format de données de niche à la lingua franca pour les API Web et les sites Web.
Dans cet article, je souhaite vous présenter JMESPath – une bibliothèque Python pratique pour analyser et traiter les données JSON. Avec l'essor de JSON, JMESPath est devenu un outil essentiel dans ma boîte à outils de web scraping.
Jetons un coup d'œil pratique au fonctionnement de JMESPath afin que vous puissiez commencer à l'utiliser dans vos scripts Python et vos web scrapers !
L'essor rapide de JSON
Tout d'abord, discutons brièvement pourquoi JSON est devenu si populaire sur le Web. JSON signifie JavaScript Object Notation et n'a cessé de gagner en popularité depuis sa première formalisation au début des années 2000.
Voici quelques statistiques sur l'adoption de JSON :
- infos 70 % des API Web modernes utiliser JSON pour le transfert de données
- Environ 60% de sites Web sert désormais les données JSON dans une certaine mesure
- Les sites populaires comme Twitter, Reddit et Facebook proposent tous API basées sur JSON
- JSON est à la hauteur 4x plus populaire que XML pour les données Web en général
JSON est devenu le format incontournable pour les données Web en raison de sa prise en charge intégrée de JavaScript, de sa syntaxe simple, de sa petite taille de fichier et de sa facilité d'analyse.
Pour nous, les web scrapers, cela signifie que les données dont nous avons besoin sont de plus en plus disponibles dans des documents JSON bruts et structurés. Cependant, la récolte de ces données utiles n’est pas toujours simple.
Bien que JSON soit partout, le JSON brut extrait des sites est souvent :
- Énorme – contenant des tonnes de données excédentaires dont nous n'avons pas besoin
- Niché – avec des données enfouies dans des objets et des tableaux complexes
- Lourd – manque de champs et de valeurs facilement extractibles
C'est là que JMESPath vient à la rescousse !
Qu’est-ce que JMESPath ?
JMESPath (prononcé « James Path ») est un langage de requête spécialement conçu pour analyser les données JSON.
Avec JMESPath, vous écrivez des expressions dans :
- Sélectionnez facilement les champs JSON imbriqués
- Filtrer les tableaux JSON
- Remodeler le JSON complexe en structures plus simples
- Trier, limiter et transformer JSON par programmation
JMESPath a été développé par Amazon (qui s'y connaît en traitement JSON !) et implémenté pour divers langages de programmation.
Pour Python, nous utilisons le jmespath
module qui fournit une API propre pour utiliser JMESPath pour analyser JSON.
Quelques exemples de ce que vous pouvez faire :
- Sélectionnez champs spécifiques des documents JSON
- Filtre tableaux d'objets JSON
- Aplatir JSON imbriqué dans des listes et des valeurs simples
- Reshape Données JSON dans des formulaires adaptés à Python
- Sort ainsi que limite tableaux de données JSON
JMESPath permet de travailler facilement avec du JSON même très complexe en Python.
Installation de JMESPath en Python
JMESPath peut être installé facilement en utilisant pip :
pip install jmespath
Après l'installation, importez-le dans vos scripts Python :
import jmespath
Et vous êtes prêt à commencer à analyser JSON !
Interroger JSON avec les bases de JMESPath
Le cœur de JMESPath exprime chemins pour explorer les documents JSON.
Quelques exemples d'expressions JMESPath de base :
Sélectionnez le name
champ à partir d'un objet JSON :
data = {‘name‘: ‘John‘, ‘age‘: 30}
jmespath.search(‘name‘, data)
# ‘John‘
Obtenez tous les noms d'une liste d'objets JSON :
data = [
{‘name‘: ‘John‘, ‘age‘: 30},
{‘name‘: ‘Sarah‘, ‘age‘: 25}
]
jmespath.search(‘[*].name‘, data)
# [‘John‘, ‘Sarah‘]
Récupérez le premier élément d'un tableau JSON :
data = {‘hobbies‘: [‘hiking‘, ‘reading‘, ‘coding‘]}
jmespath.search(‘hobbies[0]‘, data)
# ‘hiking‘
Comme vous pouvez le constater, JMESPath utilise une syntaxe similaire à JavaScript avec une notation par points et une indexation de tableau.
Examinons maintenant quelques fonctionnalités plus avancées.
Filtrage de tableaux d'objets JSON
Une tâche courante consiste à filtrer des tableaux d'objets JSON en fonction de conditions.
JMESPath facilite le filtrage des tableaux JSON.
Par exemple, nous pouvons filtrer les utilisateurs en fonction de leur âge :
data = [
{‘name‘: ‘Sarah‘, ‘age‘: 25},
{‘name‘: ‘Mark‘, ‘age‘: 19},
{‘name‘: ‘John‘, ‘age‘: 30}
]
jmespath.search(‘[?age > `28`].name‘, data)
# [‘John‘]
La [?age >
28]
le filtre sélectionne les éléments dont l’âge est supérieur à 28 ans.
Vous pouvez filtrer sur des chaînes, des nombres, des objets imbriqués – à peu près tout ce qui se trouve dans vos données JSON.
Aplatir et projeter des données JSON
Une autre fonctionnalité extrêmement utile de JMESPath consiste à aplatir et à projeter JSON dans d'autres formes.
Par exemple, nous pouvons « aplatir » le JSON imbriqué en une simple liste en utilisant []
projection :
data = {
‘product‘: {
‘id‘: 123,
‘name‘: ‘Widget‘,
‘colors‘: [‘blue‘,‘green‘]
}
}
jmespath.search(‘product.[id, name, colors[]]‘, data)
# [123, ‘Widget‘, ‘blue‘, ‘green‘]
De même, nous pouvons remodeler les objets JSON en d'autres objets JSON en utilisant {}
projection :
data = {
‘product‘: {
‘id‘: 123,
‘name‘: ‘Super Widget‘,
‘price‘: 9.99,
‘dimensions‘: {
‘length‘: 10,
‘width‘: 5
}
}
}
jmespath.search("""
product.{
id: id,
name: name,
price_usd: price,
length_cm: dimensions.length,
width_cm: dimensions.width
}
""", data)
# {‘id‘: 123,
# ‘name‘: ‘Super Widget‘,
# ‘price_usd‘: 9.99,
# ‘length_cm‘: 10,
# ‘width_cm‘: 5}
Les projections permettent de remodeler facilement même des JSON imbriqués complexes dans des formats simples comme des listes et des dicts utiles pour Python.
Trier, limiter et découper des tableaux JSON
JMESPath fournit quelques moyens utiles pour gérer les tableaux de données JSON :
data = [
{‘name‘: ‘Sarah‘, ‘age‘: 25},
{‘name‘: ‘Mark‘, ‘age‘: 19},
{‘name‘: ‘John‘, ‘age‘: 30}
]
# Sort by age
jmespath.search(‘[*].age | sort(@)‘, data)
# [19, 25, 30]
# Slice first 2 elements
jmespath.search(‘[*][:2]‘, data)
# [{‘name‘: ‘Sarah‘, ‘age‘: 25}, {‘name‘: ‘Mark‘, ‘age‘: 19}]
# Limit to 2 elements
jmespath.search(‘[*][0:2]‘, data)
# [{‘name‘: ‘Sarah‘, ‘age‘: 25}, {‘name‘: ‘Mark‘, ‘age‘: 19}]
Cela nous permet d'extraire de grands tableaux de documents JSON et d'extraire uniquement les bits dont nous avons besoin.
JMESPath pour le grattage Web
Maintenant que nous avons couvert les bases de l'interrogation de JSON avec JMESPath, voyons-le en action pour le web scraping.
Pour cet exemple, nous extrairons les données des annonces immobilières de Realtor.com. Les données que nous voulons se trouvent dans une balise de script JSON sur chaque page de liste.
Voici un exemple de liste :
https://www.realtor.com/realestateandhomes-detail/335-30th-Ave_San-Francisco_CA_94121_M17833-49194
Nous allons d'abord gratter la page et récupérer le script JSON :
import requests
from parsel import Selector
url = "https://www.realtor.com/realestateandhomes-detail/335-30th-Ave_San-Francisco_CA_94121_M17833-49194"
response = requests.get(url)
selector = Selector(text=response.text)
json_data = selector.css(‘script#__NEXT_DATA__::text‘).get()
Cela nous donne un objet JSON avec milliers de lignes contenant toutes les données du listing.
Voici un aperçu d'une petite partie :
{
"building": {
"rooms": {
"baths": 4,
"beds": 4,
"total_rooms": null,
"room_type": null
},
"building_size": {
"size": 3066,
"units": null
},
"parking": {
"spaces": null,
"description": null,
"parking_type": null
}
}
// and lots more!
}
Plutôt que d'analyser cet énorme objet, nous pouvons utiliser JMESPath pour interroger uniquement ce que nous voulons réellement :
import json
import jmespath
data = json.loads(json_data)
result = jmespath.search("""
{
id: listing_id,
facts: {
beds: building.rooms.beds,
baths: building.rooms.baths,
sqft: building.building_size.size
},
price: list_price
}
""", data)
print(result)
Cela imprime uniquement les champs que nous voulons :
{‘id‘: ‘2950457253‘,
‘facts‘: {‘beds‘: 4, ‘baths‘: 4, ‘sqft‘: 3066},
‘price‘: 2995000}
Avec JMESPath, nous avons pu analyser des milliers de lignes de JSON dans un dictionnaire Python propre avec uniquement les champs souhaités.
Nous pourrions désormais facilement collecter des données sur toutes les listes en parcourant les URL et en extrayant JSON avec JMESPath à chaque itération.
Comparaison avec d'autres analyseurs JSON
Il existe quelques autres options d'analyse JSON populaires en Python :
- Chemin JSON – Langage de requête similaire à JMESPath mais moins complet
- jq – Processeur JSON puissant mais nécessite l’apprentissage d’une syntaxe unique
- json.load() – Analyseur Python JSON intégré mais nécessite beaucoup de code
D'après mon expérience, JMESPath offre le meilleur équilibre pour une analyse JSON simple mais puissante en Python.
Quelques avantages clés de JMESPath :
- Syntaxe de requête concise
- Performances rapides pour les documents JSON volumineux
- Expressions faciles à apprendre
- Excellents documents et soutien de la communauté
- Projection d'objets sophistiquée
- Spécialement conçu pour JSON
Pour analyser rapidement du JSON récupéré sur le Web, JMESPath est mon choix privilégié.
Plus de ressources JMESPath
Voici quelques autres ressources intéressantes pour maîtriser JMESPath :
- Exemples JMESPath – Dépôt officiel avec plus d'extraits de code
- Tutoriels JMESPath – Présentation vidéo des expressions
- Spécification JMESPath – Grammaire complète du langage
- Bibliothèques d'extensions JMESPath – Outils qui étendent les fonctionnalités de JMESPath
En particulier, je recommande de jouer avec le Terminal JMESPath où vous pouvez rapidement essayer des expressions avec des exemples de données JSON.
Analysons tout le JSON !
Merci de vous joindre à moi pour cette introduction rapide à l'analyse de JSON avec JMESPath en Python. J'espère que vous l'avez trouvé utile !
Voici un bref récapitulatif de ce que nous avons couvert :
- Qu’est-ce que JMESPath ? – Un langage de requête pour filtrer, aplatir et transformer les données JSON.
- Pourquoi il importe – JSON est devenu le format de données Web dominant.
- Comment installer -
pip install jmespath
- Notions de base sur les requêtes – Notation par points, indexation de tableaux, filtres, etc.
- Aplatissement/projection – Remodelage du JSON imbriqué complexe.
- Trier/trancher – Gestion des tableaux JSON.
- Exemple de scraping Web – Extraire des données de realtor.com avec JMESPath.
Avec l'essor de JSON, disposer d'un outil comme JMESPath peut considérablement simplifier l'extraction de données utiles à partir de sites Web et d'API récupérés.
Faites-moi savoir si vous avez d'autres questions ! Je suis toujours heureux d'aider d'autres web scrapers.
Maintenant, sortez et utilisez JMESPath pour récolter tout ce JSON juteux sur le Web !