המטרה
לספק מאגר מלא של כל אסיר ב-Georgia DOC, שורה לכל אישום — למרות תקרת 150 תוצאות שמפילה ~85% מהנתונים של כלא גדול.
הפתרון
סקרייפר Python/Playwright שעובר על 323 מוסדות עם adaptive partitioning (חלוקה לפי אות ראשונה של שם משפחה עד מתחת ל-150), מפיק offenders.csv עם 18 עמודות/אישום, עם progress.json ל-resume ו-rebuild_progress.py לשחזור.
עיקרי הדברים
- כיסוי 100% מובטח למרות תקרת 150
- 50K+ שורות אישומים על פני 323 מוסדות
- Resumable וניתן לשחזור דרך progress.json + rebuild
האתגר
האתר חוסם 150 תוצאות לבקשה; מוסד גדול מאבד ~85% בשקט.
Adaptive partitioning — חיפוש רחב, חלוקה לפי אות ראשונה של שם משפחה כשמגיע ל-150, רקורסיה עמוקה יותר אם partition עדיין חסום. כל partition שהושלם ב-progress.json.
GDC עם JSP sessions, מחזיר 500 ל-HTTP clients רגילים.
Playwright מריץ Chromium אמיתי — מטפל ב-cookies אוטומטית. מצב גלוי חומק גם מזיהוי headless.
תקלת רשת אחרי שעות שורפת הכל.
progress.json מתעד partitions שהושלמו; rebuild_progress.py עובר על CSV קיים ומסנכרן מחדש.
לקוחות רצו שורה-לכל-אישום, אבל GDC מראה אישומים כטבלה מקוננת.
Parser משכפל מאפייני אסיר על פני שורות האישומים — אין צורך ב-join בצד הלקוח.
מה נמסר
- scraper.py עם --test
- collector.py, parser.py, browser.py, fetch_requests.py
- progress.py + rebuild_progress.py לשחזור
- analyze.py לדו"ח איכות
- config.py, log_setup.py
- requirements.txt + Playwright Chromium
- README עם workflow, schema ו-partitioning
תוצאות
50K+
רשומות
323
מוסדות
100%
כיסוי
Resumable
שחזור
מה זה לימד אותי
- Adaptive partitioning זו הטכניקה הקנונית לאתרים עם תקרת תוצאות
- לאתרי JSP/ASP.NET ממשלתיים, Playwright כמעט תמיד יותר מהיר מ-reverse engineering
- לשמור progress אחרי partition, לא אחרי שורה — overhead זניח, שחזור נקי
