انتقل إلى المحتوى

مقدمة سريعة لتحليل JSON باستخدام JMESPath في Python

مرحبًا يا من هناك! أصبح JSON سريعًا تنسيق البيانات الأكثر شيوعًا على الويب الحديث. باعتباري خبيرًا في تجريف الويب يتمتع بخبرة تزيد عن 5 سنوات، فقد رأيت JSON ينتقل من تنسيق بيانات متخصص إلى لغة مشتركة لواجهات برمجة تطبيقات الويب ومواقع الويب.

في هذا المنشور، أريد أن أقدم لك JMESPath – مكتبة Python سهلة الاستخدام لتحليل ومعالجة بيانات JSON. مع ظهور JSON، أصبح JMESPath أداة أساسية في صندوق أدوات تجريف الويب الخاص بي.

دعونا نلقي نظرة عملية على كيفية عمل JMESPath حتى تتمكن من البدء في استخدامه في برامج Python النصية وكاشطات الويب!

الصعود السريع لـ JSON

أولا، دعونا نناقش بإيجاز لماذا أصبح JSON شائعًا جدًا على شبكة الإنترنت. يرمز JSON إلى JavaScript Object Notation وقد اكتسب شعبية بشكل مطرد منذ أن تم إضفاء الطابع الرسمي عليه لأول مرة في أوائل العقد الأول من القرن الحادي والعشرين.

فيما يلي بعض الإحصائيات حول اعتماد JSON:

  • على مدى 70% من واجهات برمجة تطبيقات الويب الحديثة استخدم JSON لنقل البيانات
  • حول 60٪ من مواقع الويب تخدم الآن بيانات JSON ببعض السعة
  • تقدم جميع المواقع الشهيرة مثل Twitter وReddit وFacebook واجهات برمجة التطبيقات المستندة إلى JSON
  • JSON متروك ل 4 مرات أكثر شيوعًا من XML لبيانات الويب بشكل عام

أصبح JSON هو التنسيق المفضل لبيانات الويب نظرًا لدعمه المدمج في JavaScript، وبناء الجملة البسيط، وحجم الملف الصغير، وسهولة التحليل.

بالنسبة لنا، هذا يعني أن البيانات التي نريدها متاحة بشكل متزايد في مستندات JSON الأولية والمنظمة. ومع ذلك، فإن جمع هذه البيانات المفيدة ليس بالأمر السهل دائمًا.

على الرغم من أن JSON موجود في كل مكان، إلا أن JSON الخام المستخرج من المواقع غالبًا ما يكون:

  • ضخم - تحتوي على الكثير من البيانات الزائدة التي لا نحتاجها
  • متداخلة - مع البيانات المدفونة في كائنات ومصفوفات معقدة
  • غير عملي - الافتقار إلى الحقول والقيم التي يمكن استخراجها بسهولة

هذا هو المكان الذي يأتي فيه JMESPath للإنقاذ!

ما هو JMESPath؟

JMESPath (تُنطق "james path") هي لغة استعلام مصممة خصيصًا لتحليل بيانات JSON.

باستخدام JMESPath، يمكنك كتابة التعبيرات إلى:

  • حدد حقول JSON المتداخلة بسهولة
  • تصفية صفائف JSON
  • إعادة تشكيل JSON المعقدة إلى هياكل أبسط
  • فرز JSON وتقييده وتحويله برمجيًا

تم تطوير JMESPath بواسطة Amazon (الذين يعرفون شيئًا أو اثنين عن معالجة JSON!) وتم تنفيذه للعديد من لغات البرمجة.

بالنسبة لبيثون، نستخدم jmespath الوحدة التي توفر واجهة برمجة تطبيقات نظيفة لاستخدام JMESPath لتحليل JSON.

بعض الأمثلة على ما يمكنك القيام به:

  • أختار حقول محددة من مستندات JSON
  • الفرز صفائف كائنات JSON
  • تسطيح متداخلة JSON في قوائم وقيم بسيطة
  • إعادة تشكيل بيانات JSON إلى نماذج مناسبة لبيثون
  • تصنيف حسب: و قصر مصفوفات بيانات JSON

يسمح JMESPath بالعمل بسهولة مع JSON المعقد للغاية في Python.

تثبيت JMESPath في بايثون

يمكن تثبيت JMESPath بسهولة باستخدام النقطة:

pip install jmespath

بعد التثبيت، قم باستيراده إلى نصوص Python الخاصة بك:

import jmespath

وأنت جاهز لبدء تحليل JSON!

الاستعلام عن JSON باستخدام أساسيات JMESPath

جوهر JMESPath هو التعبير مسارات للتنقل في مستندات JSON.

بعض الأمثلة على تعبيرات JMESPath الأساسية:

إختار ال name الحقل من كائن JSON:

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

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

احصل على جميع الأسماء من قائمة كائنات JSON:

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

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

احصل على العنصر الأول من مصفوفة JSON:

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

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

كما ترون، يستخدم JMESPath بناء جملة مشابهًا لـ JavaScript مع تدوين النقطة وفهرسة المصفوفة.

الآن دعونا نلقي نظرة على بعض الميزات الأكثر تقدمًا.

تصفية صفائف كائنات JSON

إحدى المهام الشائعة هي تصفية صفائف كائنات JSON بناءً على الشروط.

يجعل JMESPath تصفية صفائف JSON أمرًا سهلاً.

على سبيل المثال، يمكننا تصفية المستخدمين حسب العمر:

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

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

[?age >28] يقوم المرشح باختيار العناصر التي يكون عمرها أكبر من 28 عامًا.

يمكنك التصفية على السلاسل والأرقام والكائنات المتداخلة - أي شيء تقريبًا في بيانات JSON الخاصة بك.

تسطيح وإسقاط بيانات JSON

ميزة أخرى مفيدة للغاية في JMESPath هي تسطيح JSON وإسقاطه في أشكال أخرى.

على سبيل المثال، يمكننا "تسوية" JSON المتداخل في قائمة بسيطة باستخدام [] التوقعات:

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

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

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

وبالمثل، يمكننا إعادة تشكيل كائنات JSON إلى كائنات JSON أخرى باستخدام {} التوقعات:

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}

تسمح الإسقاطات بإعادة تشكيل JSON المتداخل المعقد بسهولة إلى تنسيقات بسيطة مثل القوائم والإملاءات المفيدة لـ Python.

فرز وتقييد وتقطيع مصفوفات JSON

يوفر JMESPath بعض الطرق المفيدة لمجادلة صفائف بيانات 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}]

يتيح لنا ذلك أخذ صفائف كبيرة من مستندات JSON واستخراج البتات التي نحتاجها فقط.

JMESPath لتخريب الويب

الآن بعد أن قمنا بتغطية أساسيات الاستعلام عن JSON باستخدام JMESPath، فلنرى ذلك عمليًا لاستخلاص البيانات من الويب.

في هذا المثال، سنقوم باستخراج بيانات قائمة العقارات من موقع Realtor.com. البيانات التي نريدها موجودة في علامة البرنامج النصي JSON في كل صفحة قائمة.

فيما يلي مثال على القائمة:

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

أولاً سنقوم بكشط الصفحة والحصول على نص 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()

وهذا يعطينا كائن JSON مع الآلاف من الخطوط التي تحتوي على جميع بيانات القائمة.

وإليك نظرة خاطفة على جزء صغير فقط:

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

بدلًا من تحليل هذا الكائن الضخم، يمكننا استخدام JMESPath للاستعلام عما نريده بالفعل فقط:

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)

يؤدي هذا إلى طباعة الحقول التي نريدها فقط:

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

باستخدام JMESPath، تمكنا من تحليل آلاف الأسطر من JSON إلى قاموس Python نظيف باستخدام الحقول التي نريدها فقط.

يمكننا الآن جمع البيانات بسهولة عبر جميع القوائم من خلال تكرار عناوين URL واستخراج JSON باستخدام JMESPath في كل تكرار.

مقارنة بموزعي JSON الآخرين

هناك عدد قليل من خيارات تحليل JSON الشائعة الأخرى في Python:

  • مسار JSON - لغة استعلام مشابهة لـ JMESPath ولكنها أقل اكتمالاً
  • jq - معالج JSON قوي ولكنه يتطلب تعلم بناء جملة فريد
  • json.load() - محلل Python JSON مدمج ولكنه يتطلب الكثير من التعليمات البرمجية

في تجربتي، يوفر JMESPath أفضل توازن لتحليل JSON السهل والقوي في Python.

بعض المزايا الرئيسية لبرنامج JMESPath:

  • بناء جملة الاستعلام موجزة
  • أداء سريع لمستندات JSON الكبيرة
  • من السهل تعلم التعبيرات
  • مستندات ممتازة ودعم المجتمع
  • إسقاط كائن متطور
  • مصمم خصيصًا لـ JSON

لتحليل JSON المحذوف من الويب بسرعة، فإن JMESPath هو خياري المفضل.

المزيد من موارد JMESPath

فيما يلي بعض الموارد الرائعة الأخرى لإتقان JMESPath:

على وجه الخصوص، أوصي باللعب مع محطة JMESPath حيث يمكنك تجربة التعبيرات بسرعة مقابل بيانات JSON النموذجية.

دعونا نحلل كل JSON!

شكرًا لانضمامك إلي في هذه المقدمة السريعة لتحليل JSON مع JMESPath في Python. آمل أن تجد أنه من المفيد!

فيما يلي ملخص سريع لما قمنا بتغطيته:

  • ما هو JMESPath؟ - لغة استعلام لتصفية بيانات JSON وتسويتها وتحويلها.
  • لماذا يهم - أصبح JSON هو تنسيق بيانات الويب السائد.
  • كيفية تثبيت - pip install jmespath
  • أساسيات الاستعلام - التدوين النقطي، وفهرسة المصفوفة، والمرشحات، وما إلى ذلك.
  • التسطيح / الإسقاط - إعادة تشكيل JSON المتداخل المعقد.
  • الفرز / التقطيع - رانجلينج صفائف JSON.
  • مثال على تجريف الويب – استخراج البيانات من موقع realtor.com باستخدام JMESPath.

مع ظهور JSON، يمكن أن يؤدي وجود أداة مثل JMESPath إلى تبسيط عملية استخراج البيانات المفيدة من مواقع الويب وواجهات برمجة التطبيقات المحذوفة بشكل كبير.

اسمحوا لي أن أعرف إذا كان لديك أي أسئلة أخرى! يسعدني دائمًا مساعدة زملائي في كاشطات الويب.

الآن اخرج واستخدم JMESPath لحصد كل ملفات JSON الرائعة على الويب!

الوسوم (تاج):

الانضمام إلى محادثة

لن يتم نشر عنوان بريدك الإلكتروني. الحقول المشار إليها إلزامية *