0Pricing
Learn AI with Python · درس

تقسيم الصفحات وجمع مجموعات البيانات الكبيرة

معالجة تقسيم الصفحات، وأنماط next_cursor، وتقييد معدل الطلبات باستخدام time.sleep، وأشرطة التقدم.

تقسيم الصفحات وجمع مجموعات البيانات الكبيرة درس مجاني في Learn AI with Python على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Learn AI with Python، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Learn AI with Python 4 دروس في المجموع.

لماذا يوجد تقسيم إلى صفحات؟

نادرًا ما تعيد واجهات API ملايين السجلات في رد واحد. بل تقسّم النتائج إلى صفحات بحيث يظل كل رد صغيرًا وسريعًا.

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

التقسيم حسب رقم الصفحة

يستخدم أبسط مخطط معاملًا باسم page. وتزيد قيمته حتى تعيد واجهة API صفحةً فارغة.

import requests

all_items = []
page = 1
while True:
    resp = requests.get(url, params={"page": page, "per_page": 100}, timeout=10)
    resp.raise_for_status()
    items = resp.json()
    if not items:
        break
    all_items.extend(items)
    page += 1
print(len(all_items), "items collected")

التقسيم باستخدام المؤشر / عنوان URL التالي

تعيد العديد من واجهات API الحديثة عنوان URL التالي أو رمز مؤشر يشير إلى الصفحة التالية. وتستمر في التكرار ما دام رابط تالٍ موجودًا.

يتميز هذا الأسلوب بالمتانة لأن الخادم يتحكم في موضع بدء الصفحة التالية.

all_items = []
next_url = "https://api.example.com/items?limit=100"
while next_url:
    resp = requests.get(next_url, timeout=10)
    resp.raise_for_status()
    data = resp.json()
    all_items.extend(data["results"])
    next_url = data.get("next")   # None when no more pages
print(len(all_items))

الالتزام بحدود معدل الطلبات باستخدام time.sleep

تضع واجهات API حدًا لعدد الطلبات التي يمكنك إرسالها في الثانية أو الدقيقة. ويؤدي إرسال الطلبات بكثافة إلى إرجاع 429 Too Many Requests أو حظرك.

أدرج استدعاءً صغيرًا لـ time.sleep بين الطلبات للتصرف بشكل مناسب والبقاء ضمن الحد.

import time

while next_url:
    resp = requests.get(next_url, timeout=10)
    resp.raise_for_status()
    data = resp.json()
    all_items.extend(data["results"])
    next_url = data.get("next")
    time.sleep(0.5)   # 2 requests per second

قراءة ترويسات حدود معدل الطلبات

تبلغك واجهات API المصممة جيدًا بالحصّة المتبقية لك في ترويسات مثل X-RateLimit-Remaining وX-RateLimit-Reset.

يمكنك قراءتها لإبطاء الإرسال عند الاقتراب من الحد فقط، بدلًا من التوقف مؤقتًا دائمًا.

remaining = int(resp.headers.get("X-RateLimit-Remaining", 1))
if remaining < 5:
    reset = int(resp.headers.get("X-RateLimit-Reset", 1))
    print("Near limit, sleeping", reset, "s")
    time.sleep(reset)

معالجة 429 بالتراجع التدريجي

إذا واجهت بالفعل 429، فغالبًا ما يتضمن الرد ترويسة Retry-After تخبرك بالمدة التي يجب انتظارها. التزم بهذه المدة قبل إعادة المحاولة.

resp = requests.get(url, timeout=10)
if resp.status_code == 429:
    wait = int(resp.headers.get("Retry-After", 5))
    time.sleep(wait)
    resp = requests.get(url, timeout=10)   # retry once

أشرطة التقدم باستخدام tqdm

تبدو مهام الجمع الطويلة عالقةً من دون ملاحظات توضيحية. وتغلّف tqdm أي كائن قابل للتكرار، ثم تطبع شريط تقدم مباشرًا يتضمن المعدل والوقت التقديري للوصول.

from tqdm import tqdm

for page in tqdm(range(1, 101), desc="Fetching"):
    resp = requests.get(url, params={"page": page}, timeout=10)
    all_items.extend(resp.json())
    time.sleep(0.2)

استخدام tqdm مع إجماليات غير معروفة

في التقسيم باستخدام المؤشر، لا تعرف العدد الإجمالي مسبقًا. استخدم tqdm كعداد يدوي، واستدعِ update() في كل تكرار.

from tqdm import tqdm

pbar = tqdm(desc="Pages")
while next_url:
    resp = requests.get(next_url, timeout=10)
    data = resp.json()
    all_items.extend(data["results"])
    next_url = data.get("next")
    pbar.update(1)
pbar.close()

الجمع التدريجي

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

import json

with open("items.jsonl", "w") as f:
    while next_url:
        resp = requests.get(next_url, timeout=10)
        data = resp.json()
        for item in data["results"]:
            f.write(json.dumps(item) + "\n")
        next_url = data.get("next")

الجمع القابل للاستئناف

احفظ آخر مؤشر أو رقم صفحة حتى تتمكن إعادة التشغيل من استئناف العمل بدلًا من البدء من جديد. ويجعل ذلك المهام الطويلة قادرةً على تحمّل الأعطال.

import os

start_page = 1
if os.path.exists("checkpoint.txt"):
    start_page = int(open("checkpoint.txt").read()) + 1

for page in range(start_page, 1000):
    # ... fetch and store ...
    open("checkpoint.txt", "w").write(str(page))

جمع كل الأجزاء

تجمع حلقة الجمع المخصصة للإنتاج كل الأجزاء: تقسيم النتائج إلى صفحات، والانتظار احترامًا لحدود معدل الطلبات، وعرض التقدم، والكتابة التدريجية، وحفظ نقاط التحقق.

from tqdm import tqdm
import time, json

with open("out.jsonl", "a") as f:
    next_url = "https://api.example.com/items?limit=100"
    pbar = tqdm(desc="Pages")
    while next_url:
        r = requests.get(next_url, timeout=10)
        r.raise_for_status()
        d = r.json()
        for it in d["results"]:
            f.write(json.dumps(it) + "\n")
        next_url = d.get("next")
        pbar.update(1)
        time.sleep(0.3)

فحص سريع: التقسيم باستخدام المؤشر

تعيد واجهة API حقلًا باسم "next" يحتوي على عنوان URL، أو القيمة None في الصفحة الأخيرة.

مراجعة: جمع مجموعات البيانات الكبيرة

يمكنك الآن جمع مجموعات بيانات تمتد عبر صفحات عديدة:

  • التقسيم حسب رقم الصفحة والتقسيم باستخدام المؤشر (while next_url)
  • استخدام time.sleep وترويسات حدود معدل الطلبات لتجنب أخطاء 429
  • التراجع التدريجي باستخدام Retry-After عند تقييد المعدل
  • أشرطة تقدم tqdm للمهام الطويلة
  • الكتابة التدريجية والقابلة للاستئناف لتحمّل الأعطال

التالي: تخزين البيانات التي جُمعت بكفاءة.

الأسئلة الشائعة

هل درس «تقسيم الصفحات وجمع مجموعات البيانات الكبيرة» مجاني؟

نعم — نص درس «تقسيم الصفحات وجمع مجموعات البيانات الكبيرة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Learn AI with Python، انتقل إلى CoddyKit PRO. تتضمن دورة Learn AI with Python 4 دروس في المجموع.

ماذا ستتعلم في «تقسيم الصفحات وجمع مجموعات البيانات الكبيرة»؟

معالجة تقسيم الصفحات، وأنماط next_cursor، وتقييد معدل الطلبات باستخدام time.sleep، وأشرطة التقدم. تتمرن على Learn AI with Python مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Learn AI with Python؟

لا تُشترط خبرة سابقة. Learn AI with Python على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.

كم من الوقت يستغرق درس «تقسيم الصفحات وجمع مجموعات البيانات الكبيرة»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Learn AI with Python هذا؟

نعم. كل درس في Learn AI with Python يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. أساسيات REST API لجمع البيانات
  2. تقسيم الصفحات وجمع مجموعات البيانات الكبيرة
  3. تخزين البيانات المُجمعة بكفاءة
  4. العمل مع واجهات برمجة التطبيقات للبيانات العامة
← العودة إلى Learn AI with Python