מימוש פרסינג באמצעות Cheerio/BeautifulSoup (פרסינג HTML)

אתרים משנים את המבנה, והפרסרים מפסיקים לפתע לאסוף נתונים — מוכר? אנחנו מפתחים פרסינג HTML עמיד לפי דרישה: מגדירים ניתוח עמודים, עוקבים אחר שינויים ומצמצמים איסוף נתונים ידני באופן משמעותי.

פיתוח ותחזוקה של כל סוגי האתרים:

אתרי מידע או יישומי אינטרנט
אתרי תדמית, דפי נחיתה, אתרי חברה, קטלוגים מקוונים, חידונים, אתרי קידום, בלוגים, מקורות חדשות, פורטלי מידע, פורומים, אגרגטורים
אתרי מסחר אלקטרוני או יישומי אינטרנט
חנויות מקוונות, פורטלי B2B, שווקים, בורסות מקוונות, אתרי קאשבק, בורסות, פלטפורמות דרופשיפינג, מנתחי מוצרים
יישומי אינטרנט לניהול תהליכים עסקיים
מערכות CRM, מערכות ERP, פורטלים ארגוניים, מערכות ניהול ייצור, מנתחי מידע
אתרי שירות אלקטרוני או יישומי אינטרנט
פלטפורמות מודעות, בתי ספר מקוונים, בתי קולנוע מקוונים, בוני אתרים, פורטלים לשירותים אלקטרוניים, פלטפורמות אירוח וידאו, פורטלים נושאיים

אלה רק חלק מהסוגים הטכניים של אתרים שאנו עובדים איתם, ולכל אחד מהם יכולים להיות מאפיינים ופונקציונליות ספציפיים משלו, וכן ניתן להתאים אותם לצרכים ולמטרות הספציפיים של הלקוח.

השירותים שאנו מציעים
מציג 1 מתוך 1כל 2062 השירותים
מימוש פרסינג באמצעות Cheerio/BeautifulSoup (פרסינג HTML)
פשוט
מ- 1 יום עד 3 ימים

הכישורים שלנו:

שאלות נפוצות

העבודות האחרונות

  • פיתוח אפליקציית ווב עבור FEEDME
    פיתוח אפליקציית ווב עבור FEEDME
    1365
  • פיתוח חנות מקוונת לחברת FURNORO
    פיתוח חנות מקוונת לחברת FURNORO
    1330
  • פיתוח אפליקציית ווב עבור Enviok
    פיתוח אפליקציית ווב עבור Enviok
    1077
  • פיתוח CRM עבור Chasseurs
    פיתוח CRM עבור Chasseurs
    1113
  • פיתוח אתר עבור SBH Partners
    פיתוח אתר עבור SBH Partners
    1201
  • פיתוח אתר עבור Red Pear
    פיתוח אתר עבור Red Pear
    619

מדוע פרסור HTML נשבר באתרים אמיתיים

מפרסר שעבד מצוין על מדגם בדיקה של עשרה עמודים נשבר בפרודקשן כבר ביום הראשון. הסיבה כמעט תמיד אחת: HTML סטטי מתיעוד ותוצאות אמיתיות הם שני עולמות שונים.

הסימון מגיע כבר מורכב על ידי סקריפטים, הסלקטורים נשענים על מחלקות כמו css-1x2y3z שהבנאי מייצר ומשנה בכל מהדורה, והשרת מספק תוכן רק עם סשן תקף וכותרות בקשה מהימנות. נבחן כיצד זה נסגר בפועל.

סימון דינמי הוא הסיבה הנפוצה ביותר לבחירות ריקות. אם הנתונים נטענים באופן אסינכרוני, המפרסר מקבל שלד עמוד ללא הצמתים הנדרשים: הסלקטור תקף פורמלית, אך מחזיר null.

הפתרון אינו "להמתין יותר", אלא לעבוד עם המצב הסופי של העמוד — רינדור דרך דפדפן headless או ניתוח אותן בקשות שבהן הפרונטאנד שולף את הנתונים. הדרך השנייה מהירה ויציבה יותר, אך דורשת ניתוח פעילות הרשת.

סלקטורים הם נקודת הכשל השנייה. הצמדות למחלקות שנוצרות אוטומטית ולשרשראות כמו div > div:nth-child(3) > span משמעה שכל שינוי בסימון מאפס את הבחירה.

מפרסרים עמידים נשענים על מאפיינים סמנטיים, מיקרו-סימון ועוגני טקסט, ולא על מיקום בעץ, ובודקים במפורש שמצאו את מספר האלמנטים הצפוי — אחרת דעיכה שקטה במקום שגיאה.

הגנה מפני בקשות אוטומטיות וקידודים משלימות את השאר. הגבלת קצב, בדיקות לסימני בוט, החלפת תוכן ללקוחות חשודים — כל אלה מניבים תגובה עם קוד הצלחה וגוף ריק. הקידוד מוסיף נזק משלו: ללא ציון מפורש השרת מחזיר windows-1251 או latin-1, והקירילית הופכת לפסולת ששוברת השוואת מחרוזות. לכן בתצורת המפרסר הקידוד מוגדר בכפייה, ולא מזוהה אוטומטית.

מסקנה מעשית: מפרסר אינו סקריפט להרצה אחת, אלא שירות עם ניטור. אנו מטמיעים בדיקת שלמות הבחירה, התראה בעת ירידה בשיעור הניתוחים המוצלחים וגרסאות לסלקטורים, כדי ששינוי סימון במקור לא יהפוך לאובדן נתונים שקט.

מה נותן פרסור HTML עמיד

פרסור עמיד הוא כאשר ניתוח הדף אינו נשבר משינוי בתצוגה, ושיעור הניתוחים המוצלחים נשמר ברמה של 98-99% לעומת 70-80% בסקריפטים "חד-פעמיים". ההבדל ניכר לא ברגע ההרצה, אלא לאחר חודשים: הסלקטורים מתיישנים, מבנה ה-DOM משתנה, והפרסר או ממשיך לעבוד, או מחזיר בשקט שדות ריקים.

אנחנו בונים את הניתוח כך שכשל יהיה גלוי מיד וממוקד במקום אחד. הסלקטורים מוצאים לשכבת קונפיגורציה נפרדת, ולא מפוזרים בקוד — תיקון לתצוגה חדשה אורך דקות, ולא שעות של בדיקות רגרסיה. להלן מה בדיוק נותן גישה זו.

  • שיעור ניתוחים מוצלחים 98-99% — במקום "עובד עד שנשבר". כל הרצה מתעדת כמה דפים נותחו במלואם, כמה חלקית, וכמה נכשלו.
  • תמיכה בסלקטורים תוך דקות — הכללים מוצאים לקונפיג, בעת שינוי תצוגה מתוקן קובץ אחד, ולא כל קוד הפרסר.
  • נעלמים מחלקות שלמות של כשלים — שדות ריקים עקב שינוי מחלקות, כפילויות רשומות במעבר חוזר, תקיעות על בלוקים דינמיים.
  • מעבר חוזר על דפים שנכשלו — מה שלא נותח מוכנס לתור ומנותח מחדש, ולא הולך לאיבוד בשקט.
  • בדיקת שלמות נתונים — שדות חובה מאומתים לפני הכתיבה, רשומות פגומות אינן נכנסות לבסיס הנתונים.
  • ניטור דגרדציה — אם שיעור הניתוחים המוצלחים יורד מתחת לסף, מגיע אות מוקדם יותר ממה שהלקוח יבחין בו.

התוצאה — הפרסר מפסיק להיות סקריפט שביר והופך לחלק מתשתית: צפוי, ניתן לצפייה ותחזוקתי.

גישות לניתוח מרקאפ ומגבלותיהן

ניתוח HTML הוא תמיד בחירה בין עמידות לשינויים בתצוגה לבין דיוק החילוץ. סלקטורים לפי מחלקות ומזהים עובדים מהר ובאופן צפוי, כל עוד המרקאפ לא משתנה: די שמפתח האתר ישנה את שם העטיפה או יוסיף מכולה מתווכת, והכלל מחזיר בשקט תוצאה ריקה במקום שגיאה. לכן בפועל אנו משלבים כמה גישות ומטמיעים בדיקות שתופסות הידרדרות בניתוח.

אפשרות מתי מתאימה מגבלות
סלקטורים סטטיים לפי מחלקות ומזהים מרקאפ יציב, מבנה בלוקים ידוע נשבר בעת שינוי מחלקות, אין אות על שגיאה
ניתוח לפי מבנה המסמך רשימות, טבלאות, כרטיסים חוזרים רגיש לקינון ולסדר הצמתים
תבניות לבלוקים טיפוסיים קטלוגים, כרטיסי מוצרים, פידים דורש תחזוקה בעת שינוי הפריסה
ניתוח טקסט ידני דפים מגוונים ללא מרקאפ ברור איטי, הרבה חריגים, שברירי

סלקטורים סטטיים מספקים מהירות מקסימלית, אך כבולים לשמות מחלקות שמשתנים בתדירות הגבוהה ביותר. ניתוח לפי מבנה המסמך נשען על חזרתיות של צמתים — הוא שורד עריכות קוסמטיות, אך נשבר בעת שינוי הקינון.

תבניות לבלוקים טיפוסיים נוחות כאשר יש הרבה דפים מאותו סוג: הכלל מתאר כרטיס פעם אחת ומיושם על מאות דפים.

ניתוח טקסט ידני אנו משאירים כמקרה קיצון — כאשר המרקאפ אינו אחיד ולפרמל אותו יקר יותר מאשר לטפל בחריגים. כדי שהניתוח לא יידרדר באופן בלתי מורגש, אנו בודקים שכל תבנית החזירה תוצאה לא ריקה, ומשווים את מספר הבלוקים שנמצאו למספר הצפוי. אם כלל מפסיק למצוא אלמנטים, זה עולה מיד לפני השטח, ולא אחרי שבועות על נתונים ריקים.

כיצד אנו בונים את צינור עיבוד העמודים

העיבוד מתחיל לא בקוד, אלא במלאי המקורות: אילו עמודים אנו מעבירים לעיבוד, באיזו תדירות משתנה המבנה שלהם, והאם קיימים ערוצי חילוץ מוכנים. בשלב זה אנו מזהים היכן הסימון יציב והיכן הוא נשען על סלקטורים שבריריים, ומחליטים מה אנו לוקחים מהעמוד ומה אנו שולפים מנתונים נלווים.

  1. סקירת מקורות. אנו בוחנים את הסימון של כל עמוד, את תדירות עריכות התבנית, את קיומה של ניווט בין עמודים ואת הבלוקים המוסתרים שנטענים בנפרד מהמסמך הראשי. בסיכום — מפת מקורות עם ציון היכן העיבוד יציב והיכן יידרש מסלול חלופי.
  2. סכמת עיבוד. אנו מתכננים את מבנה הנתונים ואת כללי החילוץ: אילו שדות הם חובה, כיצד אנו מטפלים בחסרים, ומה אנו עושים בעת שינוי בתצוגה. הסכמה מתארת לא רק "מה לשלוף", אלא גם כיצד להבחין בין עמוד תקין לבין עמוד placeholder או שגיאה.
  3. הגדרת החילוץ. אנו בונים את העיבוד באמצעות Cheerio להעברה בצד השרת ו-BeautifulSoup במקומות שבהם נדרשת עמידות בפני סימון לא מדויק. אנו קושרים את הסלקטורים למאפיינים סמנטיים ולא לסדר האלמנטים — כך שעריכת התבנית אינה שוברת את כל הצינור.
  4. בדיקה בזרימה. אנו מריצים את העיבוד על נפח עמודים אמיתי, משווים את השדות שחולצו מול מדגם ייחוס, ומאתרים אי-התאמות לפי סוגי עמודים. בנפרד אנו בודקים את ההתנהגות בתגובות איטיות ובמסמך שנטען חלקית.
  5. טיפול בתקלות. אנו מגדירים ניסיונות חוזרים, הגבלת קצב הפניות ויומן שגיאות עם שמירת העמוד המקורי — לפיו ניתן לראות מה בדיוק השתנה בסימון.
  6. מסירה ותקנון. אנו מוסרים את סכמת העיבוד, תיאור השדות וכללי עדכון הסלקטורים, כדי שעריכות יבוצעו באופן צפוי ולא מהזיכרון.
  7. תמיכה שוטפת. אנו משווים באופן קבוע את שיעור העמודים שעובדו בהצלחה: ירידה במדד — אות לכך שהמקור שינה את התבנית.

סדר פעולות זה מניב תוצאה צפויה: הצינור שורד עריכות בתצוגה, ותקלות נראות בגרף ולא צפות בנתונים המוכנים.

מה הלקוח מקבל לידיו לאחר ההטמעה

לאחר ההטמעה, האיסוף מפסיק להיות אוסף סקריפטים "על מחשב נייד אחד" והופך לשירות מנוהל. להלן מה שאנו מעבירים לצוות הלקוח, כדי שניתן יהיה להפעיל ולפתח את הפתרון בלעדינו.

  • תצורות איסוף. פרופילים נפרדים לכל סוג עמוד: אילו סלקטורים שולפים שדות, אילו מאפיינים וכיצד מנורמלים הערכים. הסלקטורים הוצאו מהקוד אל תוך קונפיגורציה — בעת שינוי בתבנית המקור, התיקון אורך דקות, ללא שחרור גרסה של האפליקציה.
  • סכמות מקורות. מפה: כתובת, תדירות סריקה, עומק, מגבלות בקשות, כללי מעבר על עימוד וקטלוגים. ניתן לראות מהיכן מגיע כל בלוק נתונים ומה יש לעשות עם הופעת מדור חדש.
  • כללי טיפול בשגיאות. התנהגות בעת שינוי מבנה, פסקי זמן ותגובה ריקה: ניסיון חוזר עם השהיה, הסגר רשומה, התראה לאחראי. כשל של מקור אחד אינו עוצר את האחרים.
  • אימות נתונים. בדיקות לשדות חובה, סוגים וטווחי ערכים לפני הכתיבה לאחסון — רשומות פגומות אינן נכנסות לבסיס הנתונים ואינן שוברות דוחות.
  • לוגים וניטור. יומן ריצות עם מספר הרשומות שנאספו, שיעור השגיאות וזמן הביצוע; התראות על אנומליות, כדי שהבעיה תיראה לפני תלונת המשתמש.
  • תיעוד. תיאור הארכיטקטורה, הוראות להוספת מקור ותיקון סלקטורים, ניתוח תקלות אופייניות — מהנדס חדש נכנס לקונטור ללא הסברים בעל פה.
  • נהלי הפעלה. לוח זמנים לריצות, סדר עדכון פרופילי האיסוף, נקודות בקרת איכות ואחראים לכל שלב.

החבילה עצמאית: צוות הלקוח יכול לשנות מקורות וכללים בעצמו, ואנו מצטרפים בשינויים מורכבים. תארו את המשימה — נחזור עם הערכה ותוכנית לקונטור שלכם.

מקרה בוחן: איך הפרסר הפסיק לקרוס כשהתבנית משתנה

המשימה הייתה אופיינית: לאסוף כרטיסי מוצרים ומחירים מקטלוג חיצוני, שהחליף תבנית לעיתים קרובות. הגרסה הראשונה של הפרסור ב-Cheerio החזיקה מעמד על שרשראות סלקטורים קשיחות — div.list > div.item:nth-child(3) > span.price.

כל עוד המקור לא נגעו בו, הכול עבד, אבל כל שינוי בתבנית מצידו שבר את הפרסור: הסלקטור הפסיק למצוא את הצומת, הפרסר החזיר שדות ריקים, וחלק מהרשומות נכנסו למסד הנתונים עם מחירים אפסיים.

שיעור הפרסורים המוצלחים ירד ל-60-70%, וזה הבחינו בו רק דרך נתונים שגויים בדוחות, ולא דרך קריסת התהליך — דעיכה שקטה גרועה משגיאה גלויה.

מה שינו

כתבנו מחדש את החילוץ כך שיתבסס על סימנים עמידים במקום על מיקום בעץ: מאפייני data-*, מיקרו-סימון, תגים סמנטיים ועוגנים טקסטואליים לצד המחיר.

הוספנו שכבת בדיקת סכימה — לאחר הפרסור המסמך עובר ולידציה מול השדות הצפויים, ואם שיעור השדות המאוכלסים יורד מתחת לסף, ההרצה מסומנת כחשודה במקום להיכתב למסד הנתונים בשקט. את הסלקטורים הוצאנו לקונפיגורציה בנפרד מהקוד: תיקון המקור מטופל כעת בשינוי כללים, ולא בשחרור גרסה.

מדדים לפני ואחרי

מדד לפני אחרי
שיעור הפרסורים המוצלחים 60-70% 98-99%
זמן התאוששות לאחר שינוי תבנית 1-2 ימים 1-3 שעות
רשומות עם שדות ריקים במסד הנתונים באופן קבוע בודדות, נתפסות בולידציה

העיקר — לא המספר עצמו, אלא סוג הכשל. קודם שינוי תבנית означаו אובדן נתונים שקט וטיפול ידני בתקלה; כעת זה אות במוניטורינג ותיקון קונפיגורציה באותו יום. זמן ההתאוששות ירד בזכות העובדה שנקודת הכשל מרוכזת בכללים, ולא מפוזרת על פני קוד הפרסור.

במה שונה ניתוח של ת markup סטטי ודינמי?

ת markup סטטי מגיע מהשרת בשלמותו: ה-HTML כבר מכיל את כל הצמתים הדרושים, והמנתח קורא אותם ישירות באמצעות סלקטורים. כאן פועלות ספריות כמו Cheerio או BeautifulSoup — הן בונות עץ מסמך ומאפשרות לשלוף נתונים לפי מחלקות, מאפיינים ומבנה הקינון.

ניתוח כזה צפוי מראש: בקשה אחת — תשובה מלאה אחת, והתוצאה תלויה רק במידת היציבות של הסלקטורים בצד המקור.

ת markup דינמי נבנה כבר בדפדפן: השרת מחזיר שלד ריק, והנתונים נטענים על ידי סקריפטים ומופיעים ב-DOM זמן מה לאחר הטעינה. ניתוח HTML ישיר כאן יחזיר ריק, ולכן נדרש מנוע שמבצע את התסריטים וממתין לרינדור של הבלוקים הדרושים.

זה משנה את ההיגיון עצמו: במקום "לשלוף ולנתח" מופיעה המתנה למצב מסוים של העמוד, אחרת הנתונים просто לא יספיקו להופיע.

ההבדל משפיע ישירות על היציבות. מנתח סטטי נשבר בעיקר כאשר משתנה ה-markup — זה ניכר מיד ומתוקן על ידי עריכת הסלקטורים. מנתח דינמי תלוי גם בסדר הטעינה, בטעינה בגלילה ובעיכובי רשת, ולכן כאן מוסיפים ניסיונות חוזרים, פסקי זמן ובדיקה שהאלמנט אכן מרונדר, ולא רק נוכח ב-markup.

בפועל המקורות כמעט תמיד מעורבים: חלק מהנתונים נמצא ב-HTML, וחלק מגיע בבקשות נפרדות. אנו מזהים זאת בשלב הניתוח ובוחרים שיטה לכל בלוק בנפרד — כך המנתח לא קורס בגלל סעיף נטען אחד ונשאר צפוי מראש בעת עדכונים של המקור.

ספקות טכניים בנוגע לפרסינג HTML

פירוק HTML הוא החלק השביר ביותר באיסוף נתונים: הדף משתנה ללא התראה, והפרסר מחזיר בשקט שדות ריקים במקום שגיאה. להלן השאלות ההנדסיות הנפוצות ביותר שנשאלות לפני ההתחלה, וכיצד אנו מטפלים בכל אחת מהן.

כיצד אתם מוודאים שהנתונים שנאספו נכונים?

אנו בונים בדיקות בשלוש רמות. סכמת הנתונים מאמתת טיפוסים ושדות חובה — מחיר חסר או כותרת ריקה מסומנים מיד, ולא עוברים לייצוא. סכומי ביקורת ומספר הרשומות נבדקים מול הטווח הצפוי: ירידה חדה במספר הפריטים מאותתת על סלקטור שבור. בנוסף, אנו מריצים דפי ייחוס שבהם התוצאה ידועה מראש — אי-התאמה נתפסת לפני שהנתונים מגיעים אליכם.

מה קורה כאשר אתר המקור משנה את המבנה?

אנו קושרים סלקטורים לא למחלקות כמו col-md-7, אלא לסימנים יציבים — מבנה הבלוקים, מאפיינים, סדר האלמנטים. אם המבנה בכל זאת משתנה, מופעלת הוולידציה מהסעיף הקודם: המשימה מסומנת ככשלון, נשלחת התראה, והאיסוף נעצר במקום לכתוב זבל. תיקון הסלקטור מבוצע נקודתית, בלי לכתוב מחדש את כל האוסף.

כיצד אתם נמנעים מחסימות מצד המקור?

אנו פועלים במסגרת עומס סביר: מפזרים בקשות לאורך זמן, שומרים על הפסקות, משתמשים במאגר כתובות ובסבב כותרות. כאשר למקור יש ממשק רשמי לנתונים — אנו משתמשים בו במקום לפרסר את המבנה. זה מפחית גם את הסיכון לחסימה וגם את השבירות של הפתרון.

האם ניתן לעשות שימוש חוזר בפרסר עבור אתר אחר?

באופן חלקי. לוגיקת הסריקה, האחסון והבדיקות עוברת, אך שכבת החילוץ נכתבת בנפרד עבור כל מקור — לכל אחד יש מבנה משלו. לכן מקור חדש מתווסף מהר יותר מהראשון: התשתית כבר מוכנה, ורק התיאור של מה ומאיפה לקחת משתנה.

תארו את המקורות והשדות הנדרשים בפלט — נחזור עם הערכה ותוכנית איסוף.

נדון במשימה שלכם לניתוח עמודים

ניתוח HTML הוא משימה שבה 80% מהסיכון טמון במקורות, ולא בקוד. הסימון משתנה ללא התראה, חלק מהנתונים נטענים באמצעות סקריפטים, במקומות מסוימים קיימת הגנה מפני בקשות תכופות, ובאחרים נדרשים אימות והפעלת session.

ככל שנראה את העמודים האמיתיים מוקדם יותר, כך נעריך בצורה מדויקת יותר את היקף העבודה ולא נוסיף לתוכנית דברים מיותרים.

תארו את המשימה — נחזור עם הערכה ותוכנית. מה שחשוב לנו להבין כבר בהתחלה:

  • אילו מקורות אנחנו מנתחים: רשימת כתובות, סוגי עמודים, האם קיימת גישה באמצעות אימות;
  • מה בדיוק אנחנו שולפים: שדות ספציפיים, בלוקים מקוננים, טבלאות, קבצים מצורפים וקבצים;
  • באיזו תדירות ובאיזה היקף: הוצאה חד-פעמית, עדכון יומי או זרימה בזמן אמת;
  • באיזה פורמט נדרשת התוצאה: מסד נתונים, טבלה, ייצוא לקובץ או העברה למערכת שלכם;
  • כיצד המקור מספק את הנתונים: סימון סטטי או טעינה באמצעות סקריפטים ובקשות;
  • האם קיימות מגבלות: מגבלות בקשות, דרישות להשהיות, כללי שימוש בנתונים;
  • מה לעשות בעת תקלה: התראה, ניסיון חוזר, חזרה לייצוא התקין האחרון.

לפי התשובות הללו נבנה סכימת ניתוח, נגדיר נקודות בקרה ונוסיף הגנה מפני שינויים בסימון. תקבלו הערכת לוחות זמנים, תוכנית עבודה לפי שלבים ותמונה ברורה של מה ומתי יופיע בפלט.

שלחו רשימת מקורות ודוגמאות עמודים — זה מספיק כדי לחזור עם פרטים konkreti.