การแบ่งหน้าและรวบรวมชุดข้อมูลขนาดใหญ่
จัดการการแบ่งหน้า รูปแบบ 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- พื้นฐาน REST API สำหรับรวบรวมข้อมูล
- การแบ่งหน้าและรวบรวมชุดข้อมูลขนาดใหญ่
- การจัดเก็บข้อมูลที่รวบรวมอย่างมีประสิทธิภาพ
- การใช้งาน API ข้อมูลสาธารณะ