ייצוא תעשייתי של נתונים מגורדים: CSV, JSON ו-REST API
נתונים מגורדים rarely נדרשים בצורה גולמית. אנליסט מבקש CSV עבור טבלאות pivot, מפתח צריך JSON עם סינון, ומערכת הנהלת חשבונות מצפה להתראות webhook אוטומטיות. מצב טיפוסי: הפרוסר אסף 50,000 מוצרים, אבל הגשתם כקובץ אחד בלתי אפשרית—השרת נגמר מהזיכרון, Excel לא נפתח. אנחנו פותרים זאת עם streaming ועיצוב API נכון. עיבוד CSV ב-streaming מהיר פי 10 מטעינת הקובץ כולו לזיכרון ומאפשר ייצוא קטלוגים עד 500,000 שורות ללא תקלות. Streaming מפחית את עומס השרת פי 10, וחוסך עד 50% בעלויות תשתית השרת. צרו קשר כדי לבחור את פורמט הייצוא האופטימלי למשימה שלכם.
נתונים גולמיים מכילים לעתים קרובות כפילויות, רשומות לא תקינות וזבל. לפני הייצוא, אנו מבצעים ניקוי ונורמליזציה כדי להבטיח שרק נתונים באיכות גבוהה יוצאים החוצה. במשך שנים של ניסיון, יישמנו יותר מ-50 אינטגרציות ייצוא עבור פרויקטים עם מיליוני רשומות.
איך לבנות ייצוא עמיד לתקלות עבור מיליוני רשומות?
עבור נפחי נתונים גדולים, ארכיטקטורת הייצוא היא קריטית. אנו משתמשים ב-cursors של מסדי נתונים, שאילתות מנותקות עם pagination, ובקרת backpressure. במסדי נתונים relational (PostgreSQL, MySQL), אנו מיישמים cursors בצד השרת—זה מונע טעינת התוצאה כולה לזיכרון. עבור NoSQL (MongoDB), אנו משתמשים ב-allowDiskUse() וב-iterators. דפוס טיפוסי: קריאה של 1000 רשומות בכל פעם, שליחת מנות ל-stream. אם הלקוח איטי, אנו עוצרים את הקריאה כדי למנוע הצפת זיכרון.
ייצוא CSV ב-Streaming עבור נפחים גדולים
עבור CSV עם יותר מ-10,000 שורות, אנחנו לא מייצרים את הקובץ כולו בזיכרון—אנחנו משתמשים ב-streaming. דוגמה עם Flask באמצעות Response ו-stream_with_context:
import csv import io from flask import Response, stream_with_context def export_csv(site_id: int, filters: dict): def generate(): output = io.StringIO() writer = csv.DictWriter(output, fieldnames=[ 'id', 'name', 'price', 'currency', 'url', 'in_stock', 'scraped_at' ]) writer.writeheader() yield output.getvalue() output.truncate(0); output.seek(0) for product in stream_products(site_id, filters): writer.writerow(product) yield output.getvalue() output.truncate(0); output.seek(0) return Response( stream_with_context(generate()), mimetype='text/csv', headers={'Content-Disposition': 'attachment; filename=export.csv'}, ) גישה זו מאפשרת עיבוד קבצים בכל גודל ללא הגדלת צריכת הזיכרון. אנו מיישמים אותה בפרויקטים עם קטלוגים של 200,000+ פריטים—מבטיחים ביצועים יציבים תחת עומס.
למה Webhook עם חתימת HMAC בטוח יותר מ-POST רגיל?
שליחת נתונים דרך webhook ללא אימות היא פרצה: כל אחד יכול לזייף בקשה למערכת שלכם. אנו מוסיפים חתימה באמצעות HMAC-SHA256 כך שהמקבל יכול לוודא את זהות השולח. אנו משתמשים ב-import csv import io from flask import Response, stream_with_context def export_csv(site_id: int, filters: dict): def generate(): output = io.StringIO() writer = csv.DictWriter(output, fieldnames=[ 'id', 'name', 'price', 'currency', 'url', 'in_stock', 'scraped_at' ]) writer.writeheader() yield output.getvalue() output.truncate(0); output.seek(0) for product in stream_products(site_id, filters): writer.writerow(product) yield output.getvalue() output.truncate(0); output.seek(0) return Response( stream_with_context(generate()), mimetype='text/csv', headers={'Content-Disposition': 'attachment; filename=export.csv'}, ) :
import httpx, hashlib, hmac def send_webhook(url: str, secret: str, payload: dict): body = json.dumps(payload).encode() sig = hmac.new(secret.encode(), body, hashlib.sha256).hexdigest() httpx.post(url, content=body, headers={ 'Content-Type': 'application/json', 'X-Signature-SHA256': f'sha256={sig}', }, timeout=10) הסוד הזהה נשמר אצל השולח והמקבל—זה מבטל זיוף בקשות. החתימה מחושבת מהגוף, כך שכל שינוי בנתונים שובר את האימות. עבור נתונים קריטיים, ניתן להוסיף הצפנת AES לגוף.
השוואת פורמטי ייצוא
| מאפיין | CSV (streaming) | JSON API | Webhook |
|---|---|---|---|
| מטרה | דוחות, אנליטיקה | אינטגרציית מערכות | טריגרים, התראות |
| נפח נתונים | כל גודל (stream) | עד 10,000 רשומות לעמוד | אירוע בודד |
| אבטחה | אימות בסיסי | מפתח API + rate-limit | חתימת HMAC |
| מורכבות פיתוח | יום אחד | 1–2 ימים | 2–3 ימים (עם מסננים) |
| גמישות | שדות קבועים | בחירת שדות, pagination | Payload מותאם אישית |
איך לסנן נתונים ב-REST API?
REST API עבור נתונים מגורדים מיושם עם סינון מלא, pagination ובחירת שדות. דוגמת endpoint:
GET /api/v1/scraped-products?site_id=7&in_stock=true&fields=name,price,url&page=1&per_page=100 תשובה:
{ "data": [ { "name": "Кроссовки Nike Air Max", "price": 89.99, "url": "https://..." } ], "meta": { "page": 1, "per_page": 100, "total": 4823 } } האימות משתמש במפתח API בכותרת httpx. הגישה מוגבלת לפי IP ועם rate-limit (100 בקשות לדקה). מיון לפי כל שדה ואגרגציה (sum, average) עבור שאילתות אנליטיות נתמכים.
מתי להשתמש בכל פורמט ייצוא?
| פורמט | מקרה שימוש | דוגמה |
|---|---|---|
| CSV | אנליטיקה, דוחות, ייבוא ל-Excel | קטלוג מוצרים של 200,000 שורות |
| JSON API | אינטגרציה עם מערכות פנימיות | שליפת נתונים בזמן אמת דרך API |
| Webhook | התראות אוטומציה | התראה כאשר מוצר חדש מופיע |
מה כלול ביישום טיפוסי (תוצרים)
- קוד מקור לייצוא עם הערות
- תיעוד API בפורמט OpenAPI (Swagger)
- סקריפטי פריסה (Docker, docker-compose)
- דוגמאות אינטגרציה ב-Python וב-JavaScript
- תמיכה ל-30 יום לאחר המסירה
- אינטגרציה אופציונלית עם Sentry לניטור שגיאות
לוחות זמנים ועלות
יישום בסיסי של CSV ו-JSON API עם אימות—1–2 ימי עבודה. הוספת webhook עם חתימה, מסננים ובחירת שדות—יום נוסף. העלות מחושבת באופן אישי לאחר ניתוח המשימה. צרו קשר כדי לדון בפרטים. הזמינו יישום ייצוא turnkey—קבלו פתרון עובד תוך 2–3 ימים.







