Meteen naar de inhoud

Snelle introductie tot het parseren van JSON met JMESPath in Python

Hallo daar! JSON is snel het populairste gegevensformaat op het moderne internet geworden. Als webscraping-expert met meer dan 5 jaar ervaring heb ik JSON zien evolueren van een nichedataformaat naar de lingua franca voor web-API's en websites.

In dit bericht wil ik je kennis laten maken met JMESPath – een handige Python-bibliotheek voor het parseren en verwerken van JSON-gegevens. Met de opkomst van JSON is JMESPath een essentieel hulpmiddel geworden in mijn webscraping-toolbox.

Laten we eens praktisch bekijken hoe JMESPath werkt, zodat u het kunt gaan gebruiken in uw Python-scripts en webschrapers!

De snelle opkomst van JSON

Laten we eerst kort bespreken waarom JSON zo populair is geworden op internet. JSON staat voor JavaScript Object Notation en wint gestaag aan populariteit sinds het voor het eerst werd geformaliseerd in het begin van de jaren 2000.

Hier zijn enkele statistieken over de adoptie van JSON:

  • Over 70% van de moderne web-API's gebruik JSON voor gegevensoverdracht
  • Rond 60% websites serveren nu JSON-gegevens in een bepaalde hoedanigheid
  • Populaire sites zoals Twitter, Reddit en Facebook bieden allemaal Op JSON gebaseerde API's
  • JSON is aan het werk 4x populairder dan XML voor webgegevens in het algemeen

JSON is het go-to-formaat voor webgegevens geworden vanwege de ingebouwde ondersteuning in JavaScript, de eenvoudige syntaxis, de kleine bestandsgrootte en het gemak van parseren.

Voor ons webschrapers betekent dit dat de gewenste gegevens steeds vaker beschikbaar zijn in onbewerkte en gestructureerde JSON-documenten. Het verzamelen van deze nuttige gegevens is echter niet altijd eenvoudig.

Hoewel JSON overal aanwezig is, is onbewerkte JSON die van sites wordt geschraapt vaak:

  • Reusachtig – met tonnen overtollige gegevens die we niet nodig hebben
  • Genesteld – met gegevens begraven in complexe objecten en arrays
  • Onhandig – zonder gemakkelijk extraheerbare velden en waarden

Dit is waar JMESPath te hulp komt!

Wat is JMESPath?

JMESPath (uitgesproken als "james path") is een querytaal die speciaal is ontworpen voor het parseren van JSON-gegevens.

Met JMESPath schrijft u expressies naar:

  • Selecteer eenvoudig geneste JSON-velden
  • JSON-arrays filteren
  • Vorm complexe JSON om in eenvoudigere structuren
  • Sorteer, beperk en transformeer JSON programmatisch

JMESPath is ontwikkeld door Amazon (die het een en ander weet over het verwerken van JSON!) en geïmplementeerd voor verschillende programmeertalen.

Voor Python gebruiken we de jmespath module die een schone API biedt voor het gebruik van JMESPath om JSON te parseren.

Enkele voorbeelden van wat u kunt doen:

  • kies specifieke velden uit JSON-documenten
  • FILTER arrays van JSON-objecten
  • Maak plat geneste JSON in eenvoudige lijsten en waarden
  • Hervorm JSON-gegevens in formulieren die geschikt zijn voor Python
  • Sorteer en Begrenzing arrays met JSON-gegevens

JMESPath maakt het gemakkelijk om met zelfs zeer complexe JSON in Python te werken.

JMESPath installeren in Python

JMESPath kan eenvoudig worden geïnstalleerd met behulp van pip:

pip install jmespath

Importeer het na de installatie in uw Python-scripts:

import jmespath

En u bent klaar om JSON te gaan parseren!

Query's uitvoeren op JSON met JMESPath Basics

De kern van JMESPath is uiten paden om in JSON-documenten te boren.

Enkele voorbeelden van standaard JMESPath-expressies:

Selecteer het name veld uit een JSON-object:

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

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

Haal alle namen op uit een lijst met JSON-objecten:

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

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

Haal het eerste element uit een JSON-array:

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

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

Zoals u kunt zien, gebruikt JMESPath een syntaxis die lijkt op JavaScript, met puntnotatie en array-indexering.

Laten we nu eens kijken naar enkele meer geavanceerde functies.

Arrays van JSON-objecten filteren

Een veel voorkomende taak is het filteren van arrays van JSON-objecten op basis van voorwaarden.

JMESPath maakt het filteren van JSON-arrays een fluitje van een cent.

We kunnen gebruikers bijvoorbeeld filteren op basis van leeftijd:

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

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

De [?age >28] filter selecteert elementen waarvan de leeftijd ouder is dan 28.

U kunt filteren op tekenreeksen, getallen en geneste objecten – vrijwel alles in uw JSON-gegevens.

JSON-gegevens afvlakken en projecteren

Een andere uiterst nuttige JMESPath-functie is het afvlakken en projecteren van JSON in andere vormen.

We kunnen bijvoorbeeld geneste JSON "afvlakken" in een eenvoudige lijst met behulp van [] projecties:

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

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

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

Op dezelfde manier kunnen we JSON-objecten omvormen tot andere JSON-objecten met behulp van {} projecties:

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}

Projecties maken het mogelijk om zelfs complexe geneste JSON eenvoudig om te vormen tot eenvoudige formaten zoals lijsten en dictaten die handig zijn voor Python.

JSON-arrays sorteren, beperken en segmenteren

JMESPath biedt een paar handige manieren om arrays met JSON-gegevens te bewerken:

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}]

Hierdoor kunnen we grote arrays uit JSON-documenten halen en precies de bits extraheren die we nodig hebben.

JMESPath voor webscraping

Nu we de basisprincipes van het bevragen van JSON met JMESPath hebben besproken, gaan we het in actie zien voor webscraping.

Voor dit voorbeeld extraheren we gegevens over vastgoedvermeldingen van Realtor.com. De gegevens die we willen, staan ​​in een JSON-scripttag op elke vermeldingspagina.

Hier is een voorbeeldlijst:

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

Eerst schrapen we de pagina en pakken we het JSON-script:

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()

Dit geeft ons een JSON-object met duizenden kosten van regels die alle lijstgegevens bevatten.

Hier is een voorproefje van slechts een klein deel:

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

In plaats van dit enorme object te ontleden, kunnen we JMESPath gebruiken om alleen te vragen wat we eigenlijk willen:

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)

Hiermee worden alleen de velden afgedrukt die we willen:

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

Met JMESPath konden we duizenden regels JSON parseren in een schoon Python-woordenboek met alleen de velden die we wilden.

We kunnen nu eenvoudig gegevens over alle vermeldingen verzamelen door URL's te herhalen en bij elke iteratie JSON te extraheren met JMESPath.

Vergelijking met andere JSON-parsers

Er zijn een paar andere populaire JSON-parseeropties in Python:

  • JSON-pad – Soortgelijke zoektaal als JMESPath, maar minder volledig uitgerust
  • jq – Krachtige JSON-processor, maar vereist het leren van een unieke syntaxis
  • json.load() – Ingebouwde Python JSON-parser maar vereist veel code

In mijn ervaring biedt JMESPath de beste balans voor eenvoudige maar krachtige JSON-parsing in Python.

Enkele belangrijke voordelen van JMESPath:

  • Beknopte querysyntaxis
  • Snelle prestaties voor grote JSON-documenten
  • Gemakkelijk te leren uitdrukkingen
  • Uitstekende documenten en community-ondersteuning
  • Geavanceerde objectprojectie
  • Speciaal gebouwd voor JSON

Voor het snel parseren van web-scraped JSON is JMESPath mijn beste keuze.

Meer JMESPath-bronnen

Hier zijn enkele andere geweldige bronnen voor het beheersen van JMESPath:

In het bijzonder raad ik aan om met de JMESPath-terminal waar u snel expressies kunt uitproberen op basis van voorbeeld-JSON-gegevens.

Laten we alle JSON analyseren!

Bedankt voor je deelname aan deze snelle introductie tot het parseren van JSON met JMESPath in Python. Ik hoop dat je het nuttig vond!

Hier is een korte samenvatting van wat we hebben besproken:

  • Wat is JMESPath? – Een querytaal voor het filteren, afvlakken en transformeren van JSON-gegevens.
  • Waarom dit zo belangrijk is – JSON is het dominante webgegevensformaat geworden.
  • Hoe te installeren - pip install jmespath
  • Basisprincipes van het opvragen – Puntnotatie, array-indexering, filters, enz.
  • Afvlakken/projecteren – Het opnieuw vormgeven van complexe geneste JSON.
  • Sorteren/snijden – JSON-arrays ruzie maken.
  • Voorbeeld van webscraping – Gegevens extraheren van realtor.com met JMESPath.

Met de opkomst van JSON kan het hebben van een tool als JMESPath het extraheren van nuttige gegevens uit geschraapte websites en API's enorm vereenvoudigen.

Laat het me weten als je nog vragen hebt! Ik ben altijd blij om andere webschrapers te helpen.

Ga nu naar buiten en gebruik JMESPath om al die sappige JSON op internet te verzamelen!

Doe mee aan het gesprek

Uw e-mailadres wordt niet gepubliceerd. Verplichte velden zijn gemarkeerd *