המטרה
לעבור על קוד דיגיטלי מחובר באתר ICCSafe - למשל IMC2024V3.0 - לייצא כל section כ-PDF, ולמזג את הכול לספר אחד שאפשר לנווט בו. הדרישה כללה יכולת לחדש ריצה שנקטעה ופורמט נקי בלי רכיבי הממשק של האתר.
הפתרון
סקרייפר Playwright יחיד עם ממשק שורת פקודה, שעובר על עץ ה-sidebar, מזריק CSS ייעודי להדפסה כדי להסתיר תפריטים וכותרות, קורא ל-page.pdf() עבור כל section, וממזג את הכול עם pypdf. שיתוף ה-session נעשה דרך --save-storage-state ו---storage-state auth.json, וההתקדמות נשמרת ב-state.json כך שאפשר להמשיך מאיפה שנעצר.
עיקרי הדברים
- עקיפת פרמיום בלי לכתוב login (storage_state)
- CSS print-only נותן PDFs נקיים בלי לגעת בדף החי
- מפתחות sidebar יציבים מאפשרים resume בין ריצות
האתגר
בלי מנוי Premium, קובצי ה-PDF שנוצרים מכילים את ההודעה 'Printing is a feature of Digital Codes Premium' במקום התוכן.
שימוש ב-storage_state של Playwright: ריצה אחת עם דפדפן גלוי אוספת את auth.json, וכל ריצה אחריה מקבלת --storage-state auth.json ויורשת את העוגיות, ה-localStorage וההרשאות. אין צורך לממש תהליך התחברות אמיתי בקוד.
הקריאה ל-page.pdf() לוכדת את כל הדף כולל תפריט הניווט והמגירה הצדדית, ומייצרת PDF מכוער שלא ניתן להגיש ללקוח.
הזרקת CSS מסוג @media print שמסתיר את #chapter-wrapper, .v-navigation-drawer, .v-app-bar, nav ו-[role='navigation'] לפני כל קריאה ל-page.pdf(). התוצאה נקייה יותר מכל ניסיון לגרד HTML ולסדר אותו מחדש.
קוד מלא מתפרס על מאות sections. תקלת רשת אחת באמצע לא יכולה להתחיל את הכול מהתחלה.
הקובץ state.json מתעד את המפתחות שכבר עובדו, והפעלה מחדש מדלגת עליהם. המפתחות נבנים בסדר יציב - li_id, ואם אין אז aria-label, ואם אין אז הטקסט - כך שאותו section ממופה לאותו מפתח גם בין ריצות.
האתר בנוי כ-SPA ב-Vuetify שמרנדר תוכן אסינכרונית. קריאה ל-page.pdf() מוקדם מדי לוכדת ספינר טעינה במקום את הפרק.
המתנה לסלקטורים של התוכן והתייצבות שלהם לפני הרינדור, ולולאת ניסיון חוזר עם timeout ארוך יותר אם הרינדור הראשון נכשל.
מה נמסר
- iccsafe_scrape_to_pdf.py - סקרייפר יחיד עם ממשק שורת פקודה
- render_local_html_to_pdf.py - כלי עזר לרינדור מקומי
- requirements.txt יחד עם התקנת Playwright Chromium
- README שמתאר את זרימת ה-storage-state בשני שלבים
- פלטי דוגמה תחת out_pdf4/ ו-out_test2/
תוצאות
codes.iccsafe.org
יעד
Per-section + merged PDF
פלט
state.json resumable
שחזור
מה זה לימד אותי
- storage_state הוא הדרך הנקייה ביותר לאוטמט אתרי מסמכים חסומי-מנוי, בלי לכתוב תהליך התחברות אמיתי ובלי לשמור סיסמאות בקוד
- CSS ייעודי להדפסה נותן PDF נקי בהרבה מגירוד HTML מסונן וסידורו מחדש
- מפתחות יציבים בסדר li_id ואז aria-label ואז טקסט הם הגרנולריות הנכונה לשמירת מצב שמאפשר חידוש ריצה
