Passer au contenu

Introduction rapide à l'analyse de JSON avec JMESPath en Python

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 :

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 !

Prendre part à la conversation

Votre adresse email n'apparaitra pas. Les champs obligatoires sont marqués *