Salta al contenuto

Introduzione rapida all'analisi JSON con JMESPath in Python

Ehilà! JSON è rapidamente diventato il formato dati più popolare nel Web moderno. In qualità di esperto di web scraping con oltre 5 anni di esperienza, ho visto JSON passare da un formato dati di nicchia alla lingua franca per API web e siti Web.

In questo post voglio presentarti JMESPath, una pratica libreria Python per l'analisi e l'elaborazione dei dati JSON. Con l'avvento di JSON, JMESPath è diventato uno strumento essenziale nella mia cassetta degli attrezzi per il web scraping.

Diamo uno sguardo pratico a come funziona JMESPath in modo che tu possa iniziare a usarlo nei tuoi script Python e nei web scraper!

La rapida ascesa di JSON

Per prima cosa, discutiamo brevemente perché JSON è diventato così popolare In rete. JSON sta per JavaScript Object Notation e ha guadagnato costantemente popolarità da quando è stato formalizzato per la prima volta all'inizio degli anni 2000.

Ecco alcune statistiche sull'adozione di JSON:

  • Al di sopra Il 70% delle API Web moderne utilizzare JSON per il trasferimento dei dati
  • Art Around 60% di siti Web ora servono dati JSON in qualche modo
  • Siti popolari come Twitter, Reddit e Facebook offrono tutti API basate su JSON
  • JSON spetta a 4 volte più popolare rispetto a XML per i dati web in generale

JSON è diventato il formato di riferimento per i dati web grazie al supporto integrato in JavaScript, alla sintassi semplice, alle dimensioni ridotte dei file e alla facilità di analisi.

Per noi web scraper, ciò significa che i dati che desideriamo sono sempre più disponibili in documenti JSON grezzi e strutturati. Tuttavia, la raccolta di questi dati utili non è sempre semplice.

Sebbene JSON sia ovunque, il JSON grezzo estratto dai siti è spesso:

  • Enorme – contenente tonnellate di dati in eccesso di cui non abbiamo bisogno
  • Annidati – con dati sepolti in oggetti e array complessi
  • Poco maneggevole – privi di campi e valori facilmente estraibili

È qui che JMESPath viene in soccorso!

Cos'è JMESPath?

JMESPath (pronunciato "james path") è un linguaggio di query progettato specificamente per l'analisi dei dati JSON.

Con JMESPath puoi scrivere espressioni in:

  • Seleziona facilmente campi JSON nidificati
  • Filtra gli array JSON
  • Rimodella il JSON complesso in strutture più semplici
  • Ordina, limita e trasforma JSON in modo programmatico

JMESPath è stato sviluppato da Amazon (che sa una o due cose sull'elaborazione JSON!) e implementato per vari linguaggi di programmazione.

Per Python, usiamo il jmespath modulo che fornisce un'API pulita per l'utilizzo di JMESPath per analizzare JSON.

Alcuni esempi di cosa puoi fare:

  • Seleziona campi specifici da documenti JSON
  • Filtro array di oggetti JSON
  • Appiattire nidificati JSON in elenchi e valori semplici
  • rimodellare Dati JSON in moduli adatti a Python
  • Riordina ed Limitare array di dati JSON

JMESPath consente di lavorare facilmente anche con JSON molto complessi in Python.

Installazione di JMESPath in Python

JMESPath può essere installato facilmente utilizzando pip:

pip install jmespath

Dopo l'installazione, importalo nei tuoi script Python:

import jmespath

E sei pronto per iniziare ad analizzare JSON!

Interrogazione di JSON con JMESPath Nozioni di base

Il nucleo di JMESPath è l'espressione percorsi per approfondire i documenti JSON.

Alcuni esempi di espressioni JMESPath di base:

Seleziona il name campo da un oggetto JSON:

data = {‘name‘: ‘John‘, ‘age‘: 30}

jmespath.search(‘name‘, data)
# ‘John‘

Ottieni tutti i nomi da un elenco di oggetti JSON:

data = [
  {‘name‘: ‘John‘, ‘age‘: 30},
  {‘name‘: ‘Sarah‘, ‘age‘: 25}
]

jmespath.search(‘[*].name‘, data)
# [‘John‘, ‘Sarah‘] 

Ottieni il primo elemento da un array JSON:

data = {‘hobbies‘: [‘hiking‘, ‘reading‘, ‘coding‘]}  

jmespath.search(‘hobbies[0]‘, data)
# ‘hiking‘

Come puoi vedere, JMESPath utilizza una sintassi simile a JavaScript con notazione di punti e indicizzazione di array.

Ora diamo un'occhiata ad alcune funzionalità più avanzate.

Filtraggio di array di oggetti JSON

Un'attività comune è filtrare array di oggetti JSON in base alle condizioni.

JMESPath semplifica il filtraggio degli array JSON.

Ad esempio possiamo filtrare gli utenti in base all'età:

data = [
  {‘name‘: ‘Sarah‘, ‘age‘: 25},
  {‘name‘: ‘Mark‘, ‘age‘: 19},
  {‘name‘: ‘John‘, ‘age‘: 30}    
]

jmespath.search(‘[?age > `28`].name‘, data) 
# [‘John‘]

I [?age >28] il filtro seleziona gli elementi in cui l'età è maggiore di 28 anni.

Puoi filtrare stringhe, numeri, oggetti nidificati e praticamente qualsiasi cosa nei tuoi dati JSON.

Appiattimento e proiezione dei dati JSON

Un'altra funzionalità JMESPath estremamente utile è l'appiattimento e la proiezione di JSON in altre forme.

Ad esempio, possiamo "appiattire" JSON nidificato in un semplice elenco utilizzando [] proiezioni:

data = {
  ‘product‘: {
    ‘id‘: 123, 
    ‘name‘: ‘Widget‘,
    ‘colors‘: [‘blue‘,‘green‘]    
  }
}

jmespath.search(‘product.[id, name, colors[]]‘, data) 

# [123, ‘Widget‘, ‘blue‘, ‘green‘]

Allo stesso modo, possiamo rimodellare gli oggetti JSON in altri oggetti JSON utilizzando {} proiezioni:

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}

Le proiezioni consentono di rimodellare facilmente anche JSON nidificati complessi in formati semplici come elenchi e dict utili per Python.

Ordinamento, limitazione e suddivisione di array JSON

JMESPath fornisce alcuni modi utili per gestire array di dati 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}]

Questo ci consente di prendere array di grandi dimensioni da documenti JSON ed estrarre solo i bit di cui abbiamo bisogno.

JMESPath per Web Scraping

Ora che abbiamo trattato le nozioni di base per eseguire query su JSON con JMESPath, vediamolo in azione per il web scraping.

Per questo esempio, estrarremo i dati delle inserzioni immobiliari da Realtor.com. I dati che desideriamo risiedono in un tag script JSON su ciascuna pagina dell'elenco.

Ecco un esempio di elenco:

https://www.realtor.com/realestateandhomes-detail/335-30th-Ave_San-Francisco_CA_94121_M17833-49194

Per prima cosa raschieremo la pagina e prenderemo lo 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()

Questo ci dà un oggetto JSON con migliaia di righe contenenti tutti i dati dell'elenco.

Ecco uno sguardo solo ad una piccola parte:

{
  "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!   
}

Invece di analizzare questo enorme oggetto, possiamo utilizzare JMESPath per interrogare solo ciò che realmente desideriamo:

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)

Questo stampa solo i campi che vogliamo:

{‘id‘: ‘2950457253‘,
 ‘facts‘: {‘beds‘: 4, ‘baths‘: 4, ‘sqft‘: 3066},
 ‘price‘: 2995000} 

Con JMESPath siamo stati in grado di analizzare migliaia di righe di JSON in un dizionario Python pulito con solo i campi che desideriamo.

Ora potremmo raccogliere facilmente dati su tutti gli elenchi eseguendo il looping degli URL ed estraendo JSON con JMESPath a ogni iterazione.

Confronto con altri parser JSON

Ci sono alcune altre popolari opzioni di analisi JSON in Python:

  • Percorso JSON – Linguaggio di query simile a JMESPath ma meno completo
  • jq – Potente processore JSON ma richiede l'apprendimento della sintassi unica
  • json.load() – Parser JSON Python integrato ma richiede molto codice

Nella mia esperienza, JMESPath fornisce il miglior equilibrio per l'analisi JSON semplice ma potente in Python.

Alcuni vantaggi chiave di JMESPath:

  • Sintassi concisa della query
  • Prestazioni veloci per documenti JSON di grandi dimensioni
  • Espressioni facili da imparare
  • Documenti eccellenti e supporto della comunità
  • Proiezione di oggetti sofisticati
  • Progettato appositamente per JSON

Per analizzare rapidamente JSON web-scraping, JMESPath è la mia scelta preferita.

Altre risorse JMESPath

Ecco alcune altre ottime risorse per padroneggiare JMESPath:

In particolare, consiglio di giocare con il Terminale JMESPath dove puoi provare rapidamente le espressioni rispetto a dati JSON di esempio.

Analizziamo tutto il JSON!

Grazie per esserti unito a me in questa rapida introduzione all'analisi di JSON con JMESPath in Python. Spero che tu lo abbia trovato utile!

Ecco un breve riepilogo di ciò che abbiamo trattato:

  • Cos'è JMESPath? – Un linguaggio di query per filtrare, appiattire e trasformare i dati JSON.
  • Perché è importante – JSON è diventato il formato di dati web dominante.
  • Come installare - pip install jmespath
  • Nozioni di base sulle query – Notazione del punto, indicizzazione degli array, filtri, ecc.
  • Appiattimento/proiezione – Rimodellamento del JSON nidificato complesso.
  • Ordinamento/affettamento – Gestione degli array JSON.
  • Esempio di web scraping – Estrazione dei dati da realtor.com con JMESPath.

Con l'avvento di JSON, disporre di uno strumento come JMESPath può semplificare enormemente l'estrazione di dati utili da siti Web e API recuperati.

Fatemi sapere se avete altre domande! Sono sempre felice di aiutare gli altri web scraper.

Ora esci e usa JMESPath per raccogliere tutto quel succoso JSON sul web!

Partecipa alla conversazione

L'indirizzo email non verrà pubblicato. I campi obbligatori sono contrassegnati con *