Ir al contenido

Introducción rápida al análisis de JSON con JMESPath en Python

¡Hola! JSON se ha convertido rápidamente en el formato de datos más popular en la web moderna. Como experto en web scraping con más de 5 años de experiencia, he visto a JSON pasar de un formato de datos especializado a la lengua franca para API web y sitios web.

En esta publicación, quiero presentarles JMESPath, una práctica biblioteca de Python para analizar y procesar datos JSON. Con el auge de JSON, JMESPath se ha convertido en una herramienta esencial en mi caja de herramientas de web scraping.

¡Echemos un vistazo práctico a cómo funciona JMESPath para que pueda comenzar a usarlo en sus scripts Python y web scrapers!

El rápido ascenso de JSON

Primero, analicemos brevemente por qué JSON se ha vuelto tan popular En la red. JSON significa notación de objetos JavaScript y ha ido ganando popularidad constantemente desde que se formalizó por primera vez a principios de la década de 2000.

Aquí hay algunas estadísticas sobre la adopción de JSON:

  • Mas de 70% de las API web modernas utilizar JSON para la transferencia de datos
  • Aproximadamente 60% de sitios web ahora sirve datos JSON de alguna manera
  • Sitios populares como Twitter, Reddit y Facebook ofrecen API basadas en JSON
  • JSON está a la altura 4 veces más popular que XML para datos web en general

JSON se ha convertido en el formato preferido para datos web debido a su soporte integrado en JavaScript, sintaxis simple, tamaño de archivo pequeño y facilidad de análisis.

Para nosotros, los web scrapers, esto significa que los datos que queremos están cada vez más disponibles en documentos JSON sin formato y estructurados. Sin embargo, recopilar estos datos útiles no siempre es sencillo.

Si bien JSON está en todas partes, el JSON sin formato extraído de los sitios suele ser:

  • Enorme – que contiene toneladas de datos sobrantes que no necesitamos
  • Anidado – con datos enterrados en objetos y matrices complejos
  • Pesado – falta de campos y valores fácilmente extraíbles

¡Aquí es donde JMESPath viene al rescate!

¿Qué es JMES Path?

JMESPath (pronunciado "james path") es un lenguaje de consulta diseñado específicamente para analizar datos JSON.

Con JMESPath, escribes expresiones para:

  • Seleccione fácilmente campos JSON anidados
  • Filtrar matrices JSON
  • Transforme JSON complejo en estructuras más simples
  • Ordenar, limitar y transformar JSON mediante programación

JMESPath fue desarrollado por Amazon (¡que saben un par de cosas sobre el procesamiento de JSON!) e implementado para varios lenguajes de programación.

Para Python, usamos el jmespath módulo que proporciona una API limpia para usar JMESPath para analizar JSON.

Algunos ejemplos de lo que puedes hacer:

  • Seleccione campos específicos de documentos JSON
  • Filtrar matrices de objetos JSON
  • Aplanar JSON anidado en listas y valores simples
  • Cambiar la forma de Datos JSON en formularios adecuados para Python
  • Ordenar y Límite matrices de datos JSON

JMESPath permite trabajar fácilmente incluso con JSON muy complejo en Python.

Instalación de JMESPath en Python

JMESPath se puede instalar fácilmente usando pip:

pip install jmespath

Después de la instalación, impórtelo en sus scripts de Python:

import jmespath

¡Y ya está listo para comenzar a analizar JSON!

Consultar JSON con conceptos básicos de JMESPath

El núcleo de JMESPath es expresar caminos para profundizar en documentos JSON.

Algunos ejemplos de expresiones JMESPath básicas:

Seleccione name campo de un objeto JSON:

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

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

Obtenga todos los nombres de una lista de objetos JSON:

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

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

Obtenga el primer elemento de una matriz JSON:

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

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

Como puede ver, JMESPath utiliza una sintaxis similar a JavaScript con notación de puntos e indexación de matrices.

Ahora veamos algunas funciones más avanzadas.

Filtrado de matrices de objetos JSON

Una tarea común es filtrar matrices de objetos JSON según condiciones.

JMESPath facilita el filtrado de matrices JSON.

Por ejemplo, podemos filtrar usuarios según la edad:

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

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

La [?age >28] El filtro selecciona elementos cuya edad es mayor a 28 años.

Puede filtrar por cadenas, números, objetos anidados, casi cualquier cosa en sus datos JSON.

Aplanamiento y proyección de datos JSON

Otra característica de JMESPath extremadamente útil es aplanar y proyectar JSON en otras formas.

Por ejemplo, podemos "aplanar" JSON anidado en una lista simple usando [] proyecciones:

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

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

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

De manera similar, podemos remodelar objetos JSON en otros objetos JSON usando {} proyecciones:

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}

Las proyecciones permiten remodelar fácilmente incluso JSON anidado complejo en formatos simples como listas y dictados útiles para Python.

Ordenar, limitar y dividir matrices JSON

JMESPath proporciona algunas formas útiles de organizar matrices de datos 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}]

Esto nos permite tomar grandes matrices de documentos JSON y extraer solo los bits que necesitamos.

JMESPath para raspado web

Ahora que hemos cubierto los conceptos básicos de la consulta JSON con JMESPath, veámoslo en acción para el web scraping.

Para este ejemplo, extraeremos datos de listados de bienes raíces de Realtor.com. Los datos que queremos se encuentran en una etiqueta de script JSON en cada página del listado.

Aquí hay una lista de ejemplo:

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

Primero, rasparemos la página y tomaremos el 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()

Esto nos da un objeto JSON con miles de líneas que contienen todos los datos del listado.

He aquí un vistazo a sólo una pequeña 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!   
}

En lugar de analizar este enorme objeto, podemos usar JMESPath para consultar solo lo que realmente queremos:

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)

Esto imprime solo los campos que queremos:

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

Con JMESPath, pudimos analizar miles de líneas de JSON en un diccionario Python limpio con solo los campos que queríamos.

Ahora podríamos recopilar datos fácilmente en todos los listados recorriendo las URL y extrayendo JSON con JMESPath en cada iteración.

Comparación con otros analizadores JSON

Hay algunas otras opciones populares de análisis JSON en Python:

  • Ruta JSON – Lenguaje de consulta similar a JMESPath pero con menos funciones
  • jq – Potente procesador JSON pero requiere aprender una sintaxis única
  • json.cargar() – Analizador Python JSON incorporado pero requiere mucho código

En mi experiencia, JMESPath proporciona el mejor equilibrio para un análisis JSON sencillo pero potente en Python.

Algunas ventajas clave de JMESPath:

  • Sintaxis de consulta concisa
  • Rendimiento rápido para documentos JSON de gran tamaño
  • Expresiones fáciles de aprender.
  • Excelentes documentos y apoyo de la comunidad.
  • Proyección de objetos sofisticados
  • Diseñado específicamente para JSON

Para analizar rápidamente JSON extraído de la web, JMESPath es mi opción preferida.

Más recursos de JMESPath

Aquí hay otros recursos excelentes para dominar JMESPath:

En particular, recomiendo jugar con el Terminal JMESPath donde puede probar rápidamente expresiones con datos JSON de muestra.

¡Analicemos todo el JSON!

Gracias por acompañarme en esta rápida introducción al análisis de JSON con JMESPath en Python. ¡Espero que lo haya encontrado util!

Aquí hay un resumen rápido de lo que cubrimos:

  • ¿Qué es JMES Path? – Un lenguaje de consulta para filtrar, aplanar y transformar datos JSON.
  • Por qué es importante – JSON se ha convertido en el formato de datos web dominante.
  • Cómo instalarpip install jmespath
  • Conceptos básicos de consulta – Notación de puntos, indexación de matrices, filtros, etc.
  • Aplanamiento/proyección – Remodelación de JSON anidado complejo.
  • Clasificar/rebanar – Manejo de matrices JSON.
  • Ejemplo de raspado web – Extracción de datos de realtor.com con JMESPath.

Con el auge de JSON, tener una herramienta como JMESPath puede simplificar enormemente la extracción de datos útiles de sitios web y API extraídos.

¡Déjame saber si tienes alguna otra pregunta! Siempre estaré feliz de ayudar a otros web scrapers.

¡Ahora sal y usa JMESPath para recolectar todo ese jugoso JSON en la web!

Únase a la conversación

Su dirección de correo electrónico no será publicada. Las areas obligatorias están marcadas como requeridas *