המטרה
למשוך באמינות את N הפוסטים/Reels האחרונים מפרופילי עסק בפייסבוק — לשרוד selectors מסתובבים, חסימת requests, ופג תוקף של cookies.
הפתרון
CLI ב-Python/Selenium (main.py) שמקבל profile URL + limit ומחזיר JSON + CSV אופציונלי. Auth מבוסס-cookies עם fallback ל-email/password. functions.py מספק primitives של login/ניווט/checkpoint; main.py כותב אטומית (temp → rename) כך ש-kill באמצע לא משחית.
עיקרי הדברים
- כתיבה אטומית — kill באמצע לא משחית פלט
- זיהוי checkpoint הופך חסימות שקטות לשגיאות ברורות
- DOM dumps מובנים הופכים תחזוקת selectors ל-diff
האתגר
Selectors של פייסבוק מסתובבים — XPaths קשיחים נשברים תוך שבועות.
דגלי debug-dump שומרים את ה-DOM הנוכחי כך שבעת שינוי, ניתן לעשות diff מול dump ישן ולעדכן מהר.
פג-תוקף של cookies באמצע ריצה קרס בלי לייצר פלט חלקי.
is_login_page ו-is_checkpoint_page נבדקים מיד אחרי open_profile_posts; בכישלון יציאה עם שגיאה ברורה לפני נגיעה בקובץ הפלט.
Kill בזמן json.dump השאיר את הפלט חצוי.
כתיבה ל-output.json.tmp ואז Path.replace(output) — rename ברמת OS = הקובץ הסופי או חדש או זהה לקודם.
Headless מסתיר את מצב ה-DOM שנדרש לדיבוג שבירת selectors.
--headless כבוי כברירת מחדל בפיתוח; Headed + screenshot/HTML dump מאפשרים שחזור offline.
מה נמסר
- main.py CLI
- functions.py + functions_old.py
- convert_cookies_to_json.py
- facebook_cookies.json דוגמת סכמה
- inspect_page_dump.py
- דוגמת פלט scraped_posts.json
תוצאות
Cookies + fallback
מצבי auth
JSON + CSV
פלט
Atomic writes
בטיחות
מה זה לימד אותי
- לאתרים עם selectors מסתובבים, DOM dumps + diff מנצחים חוכמה של CSS
- כתיבה אטומית שווה כל שורה — kill אחד שהורס scrape של 20 דקות הוא שיעור שדביק
- זיהוי checkpoint לפני נגיעה בפלט הוא הדפוס הכי חשוב ל-production
