בונים מגרד אתרים בפייתון - איך שולפים מידע מהאינטרנט בלי לשבור כלום¶
כל אתר אינטרנט הוא בעצם קובץ HTML ענק שדפדפן יודע להציג יפה. אז מה קורה אם אנחנו לא רוצים להסתכל על הדף - אלא לשלוף ממנו נתונים אוטומטית? זה בדיוק מה שעושה web scraper, ופייתון היא כנראה הכלי הכי נוח בעולם לזה. הפרויקט הזה מלמד אתכם לקרוא HTML כמו שהמחשב רואה אותו, ולהפוך בלגן של תגיות לנתונים מסודרים שאפשר לעבוד איתם.
מה בונים בפועל¶
הרעיון פשוט: כותבים סקריפט שניגש לדף אינטרנט ציבורי, שולף ממנו מידע מסוים - כותרות חדשות, מחירי מוצרים, רשימת ספרים - ושומר את זה לקובץ CSV או JSON מסודר. במקום לגלול ולהעתיק ידנית עשרות פעמים, המחשב עושה את זה תוך שניות.
שלב ראשון - מורידים את הדף¶
הכלי הראשון שצריך הוא requests, ספרייה שמאפשרת לפייתון לבקש דף אינטרנט בדיוק כמו שדפדפן עושה:
בשלב הזה html הוא פשוט מחרוזת ענקית ומבולגנת. אין שם עדיין שום מבנה שאפשר לעבוד איתו בנוחות - וכאן נכנס לתמונה השלב הבא.
שלב שני - מפרקים את ה-HTML עם BeautifulSoup¶
BeautifulSoup היא ספרייה שהופכת את המחרוזת המבולגנת לעץ של אלמנטים שאפשר לחפש בו. רוצים את כל הכותרות בדף? מחפשים את תגית ה-h2. רוצים מחיר בתוך תגית עם class מסוים? מחפשים אותה לפי השם שלה:
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, "html.parser")
titles = soup.find_all("h2", class_="headline")
for t in titles:
print(t.text.strip())
הדרך הכי טובה ללמוד אילו תגיות לחפש היא לפתוח את כלי המפתחים בדפדפן (מקש F12), ללחוץ על "בחר אלמנט", ולסמן את המידע שאתם רוצים לשלוף. הדפדפן יראה לכם בדיוק באיזו תגית ובאיזה class המידע יושב.
שלב שלישי - שומרים את התוצאה¶
אחרי ששלפתם את המידע, שווה לשמור אותו במבנה שאפשר לפתוח באקסל או לטעון שוב בפייתון - קובץ CSV הוא הבחירה הכי נוחה למתחילים. מודול ה-csv הבנוי בפייתון עושה את זה בלי שום ספרייה נוספת, וזו הזדמנות טובה ללמוד עבודה עם קבצים בצורה שיש לה שימוש מיידי וברור.
איך לגרד בצורה מכובדת ולא להיחסם¶
זה החלק שהרבה מדריכים מדלגים עליו, ולדעתי הוא הכי חשוב. לפני שאתם מריצים סקרייפר על אתר, שווה לבדוק את קובץ robots.txt שלו (פשוט מוסיפים /robots.txt לכתובת האתר) - הוא מגדיר אילו חלקים באתר מותר לגרד ואילו לא. גם אם אין חסימה טכנית, יש לזה גם צד אתי - אתר הוא לא מאגר נתונים חינמי שמחכה שתרוקנו אותו.
בנוסף, כדאי להוסיף השהייה קטנה (time.sleep) בין בקשה לבקשה, כדי לא להפציץ שרת עם מאות בקשות בשנייה - זה נחשב לא הוגן, ובאתרים רבים גם יגרום לחסימת ה-IP שלכם. סקרייפר איטי שרץ בסבלנות עדיף על סקרייפר מהיר שנחסם אחרי דקה.
הבעיה שתתקלו בה - תוכן שנטען עם JavaScript¶
לא כל אתר "נכנע" ל-requests בקלות. אתרים רבים היום בונים את התוכן שלהם באמצעות JavaScript אחרי שהדף כבר נטען - כלומר ה-HTML שמגיע מ-requests לא מכיל בכלל את המידע שאתם מחפשים, כי הוא עוד לא "נבנה". אם אתם מריצים את הקוד ומקבלים דף כמעט ריק למרות שבדפדפן רואים תוכן מלא, זה הסימן. הפתרון במקרה כזה הוא כלים כמו Selenium או Playwright שמריצים דפדפן אמיתי ברקע - אבל זה שלב מתקדם יותר, וכדאי קודם להתמחות בגרידה של אתרים "רגילים".
למה הפרויקט הזה שווה את הזמן¶
מעבר לכלי מעשי, סקרייפר מלמד אתכם לקרוא תיעוד של ספרייה חיצונית, להתמודד עם מבנה נתונים לא צפוי, ולטפל בשגיאות כשהאתר לא מגיב כמו שציפיתם - כישורים שמלווים כל מתכנת, לא משנה מה יהיה הפרויקט הבא. בקורס תכנות בסיסי החינמי שלנו עוברים על עבודה עם ספריות חיצוניות, קבצים ולולאות בדיוק ברמה שצריך כדי לבנות פרויקט כזה בביטחון. התחילו את קורס התכנות הבסיסי כאן