המטרה
אגירת משרות בבריטניה מ-HireMyVisa, אימות אלו מעסיקים DEFINITELY/LIKELY SPONSORS, העשרה, ופרסום חוברת Excel נקייה לצוות המכירות.
הפתרון
Pipeline ב-Python שמתחבר ל-HireMyVisa, עוטף ה-API של המשרות עם stop-when-empty, מבצע dedup לפי job_id, מעשיר סיפון דרך POST בב-25 ל-/api/sponsor/batch-check, שומר JSON ביניים, ומייצר חוברת Excel עם pandas/openpyxl מחולקת ל-≤5,000 שורות עם פורמטים ותאריכים.
עיקרי הדברים
- Pagination stop-when-zero מסתגל לכל גודל
- מינימום קריאות סיפון בעזרת batched dedupe
- פלט Excel בחוברות של 5K שורות
- Re-runnable הודות לcache JSON ביניים
האתגר
API המשרות לא מחזיר ספירה כוללת או סמן סוף — pagination עיוור שורף זמן.
מילון collected לפי job_id, ספירת new לכל דף, שבירה על new == 0 כך שה-collector מסתגל לכל גודל.
סטטוס הסיפון ב-API נפרד עם batches של 25 ו-Bearer.
דדופ שמות מעסיקים, chunks של 25, קריאה פר chunk, ומיפוי חזרה — ממזער קריאות גם ב-1000+ משרות.
Excel חוסם תווי בקרה וחוברות גדולות איטיות לפתיחה.
Regex מנקה תווי בקרה ברמת השורה; MAX_ROWS_PER_FILE=5000 מחלק ל-jobs_part_{index}.xlsx.
תאריכי פרסום מגיעים כ-ISO עם Z, אבל המשתמשים רוצים לסנן כתאריך אמיתי.
parse_posted_date + format_posted_date ממירים ל-datetime, כך ש-pandas → openpyxl כותב תא Excel תאריך.
מה נמסר
- collector.py, api.py, enrich_sponsors.py, excel_builder.py, auth.py
- requirements.txt + venv מצורף
- Cache JSON ביניים (data/jobs.json, data/jobs_enriched.json)
- פלט Excel מחולק (data/jobs_part_<n>.xlsx)
- אישורי .env
תוצאות
GB (UK)
מדינה
25/call
Batch סיפון
≤5K rows
פיצול קבצים
2 (jobs + sponsor)
APIs
מה זה לימד אותי
- 'Stop when new == 0' זה ה-pagination הכי אמין ל-APIs בלי total
- ניקוי תווים ל-Excel חייב לקרות ברמת השורה, לא אחר כך
- Cache JSON בין שלבים עושה את הפייפליין ניתן-לדיבוג ולהרצה חוזרת
