0Pricing
Learn AI with Python · บทเรียน

การแบ่งหน้าและรวบรวมชุดข้อมูลขนาดใหญ่

จัดการการแบ่งหน้า รูปแบบ next_cursor การจำกัดอัตราด้วย time.sleep และแถบความคืบหน้า

การแบ่งหน้าและรวบรวมชุดข้อมูลขนาดใหญ่ เป็นบทเรียน Learn AI with Python ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 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จะครอบออบเจ็กต์ที่วนซ้ำได้ทุกชนิด และแสดงแถบความคืบหน้าแบบสดพร้อมอัตราและ ETA

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 สำหรับงานที่ใช้เวลานาน
  • การเขียนข้อมูลแบบเพิ่มทีละส่วนและดำเนินการต่อได้เพื่อให้ทนต่อความผิดพลาด

บทถัดไป: การจัดเก็บข้อมูลที่รวบรวมได้อย่างมีประสิทธิภาพ

คำถามที่พบบ่อย

บทเรียน “การแบ่งหน้าและรวบรวมชุดข้อมูลขนาดใหญ่” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การแบ่งหน้าและรวบรวมชุดข้อมูลขนาดใหญ่” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Learn AI with Python ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Learn AI with Python มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การแบ่งหน้าและรวบรวมชุดข้อมูลขนาดใหญ่”

จัดการการแบ่งหน้า รูปแบบ next_cursor การจำกัดอัตราด้วย time.sleep และแถบความคืบหน้า คุณปฏิบัติ Learn AI with Python ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Learn AI with Python หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Learn AI with Python บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “การแบ่งหน้าและรวบรวมชุดข้อมูลขนาดใหญ่” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Learn AI with Python นี้ได้ไหม

ได้ บทเรียน Learn AI with Python ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. พื้นฐาน REST API สำหรับรวบรวมข้อมูล
  2. การแบ่งหน้าและรวบรวมชุดข้อมูลขนาดใหญ่
  3. การจัดเก็บข้อมูลที่รวบรวมอย่างมีประสิทธิภาพ
  4. การใช้งาน API ข้อมูลสาธารณะ
← กลับไปที่ Learn AI with Python