Smart-World Surf

יחידה 11: עבודה עם נתונים חיצוניים

התממשקות למקורות נתונים שונים מעבר לקבצים מקומיים.

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

התממשקות ל-Web APIs באמצעות HTTP

אחד המקורות הנפוצים ביותר לנתונים חיצוניים כיום הוא שירותי רשת (Web APIs). שירותים אלו מאפשרים ליישומים שונים לתקשר ביניהם באמצעות פרוטוקול HTTP, בדומה לאופן שבו דפדפן אינטרנט מתקשר עם שרת.

ספריית requests בפייתון

ספריית requests היא הסטנדרט בפייתון לביצוע בקשות HTTP. היא מפשטת מאוד את תהליך שליחת הבקשות וקבלת התגובות.

HTTP Request: בקשה הנשלחת מלקוח (למשל, תוכנית פייתון) לשרת, במטרה לבצע פעולה מסוימת (למשל, לקבל נתונים, לשלוח נתונים).
HTTP Response: התגובה הנשלחת מהשרת ללקוח לאחר קבלת בקשה, המכילה את הנתונים המבוקשים או סטטוס הפעולה.

שיטות HTTP עיקריות

GET

משמשת לאחזור נתונים מהשרת. זוהי השיטה הנפוצה ביותר לקריאת מידע. לדוגמה: requests.get('https://api.example.com/data')

POST

משמשת לשליחת נתונים חדשים לשרת, למשל יצירת משאב חדש. הנתונים נשלחים בגוף הבקשה. לדוגמה: requests.post('https://api.example.com/users', json={'name': 'Alice'})

PUT/PATCH

משמשות לעדכון נתונים קיימים בשרת. PUT מחליפה משאב בשלמותו, PATCH מעדכנת חלקים ממנו.

DELETE

משמשת למחיקת משאב מהשרת.

טיפול בנתוני JSON

פורמט JSON (JavaScript Object Notation) הוא הפורמט הסטנדרטי להעברת נתונים ב-Web APIs. ספריית requests מאפשרת לנתח תגובות JSON בקלות:

response = requests.get('https://api.example.com/data')
data = response.json() # ממיר את התגובה לאובייקט פייתון (מילון או רשימה)

עבודה עם מסדי נתונים

מסדי נתונים הם דרך נוספת לאחסון ואחזור נתונים חיצוניים. פייתון מציעה מודולים שונים להתממשקות למסדי נתונים יחסיים (SQL) ולא יחסיים (NoSQL).

SQLite3 - דוגמה למסד נתונים יחסי

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

SQL (Structured Query Language): שפה סטנדרטית לתקשורת עם מסדי נתונים יחסיים, לביצוע פעולות כמו יצירה, קריאה, עדכון ומחיקה של נתונים (CRUD).

פעולות בסיסיות עם SQLite3

  • חיבור: conn = sqlite3.connect('my_database.db')
  • יצירת סמן (Cursor): cursor = conn.cursor(). הסמן משמש לביצוע פקודות SQL.
  • ביצוע שאילתות: cursor.execute("CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT)")
  • הכנסת נתונים: cursor.execute("INSERT INTO users (name) VALUES (?)", ('Alice',))
  • אחזור נתונים: cursor.execute("SELECT * FROM users"), ואז cursor.fetchone() או cursor.fetchall()
  • שמירת שינויים: conn.commit()
  • סגירת חיבור: conn.close()
מניעת SQL Injection: אחת הסכנות הגדולות בעבודה עם מסדי נתונים היא SQL Injection. לעולם אל תשלבו קלט משתמש ישירות לשאילתות SQL. השתמשו בפרמטרים (placeholders כמו ? או :name) ובארגומנטים נפרדים לפונקציית execute(). זהו נושא קריטי לבחינה!

פורמטים נפוצים לנתונים חיצוניים

מעבר ל-JSON, קיימים פורמטים נוספים המשמשים להעברת נתונים חיצוניים.

JSON

קל לקריאה וכתיבה לבני אדם ומכונות. נפוץ מאוד ב-Web APIs. ממופה בקלות למבני נתונים של פייתון (מילונים ורשימות) באמצעות מודול json.

XML

פורמט מבוסס תגיות, דומה ל-HTML. היה נפוץ בעבר ב-Web Services (SOAP) ועדיין קיים במערכות מסוימות. ניתן לנתח באמצעות מודולים כמו xml.etree.ElementTree.

CSV

Comma Separated Values. פורמט טקסט פשוט לאחסון נתונים טבלאיים, כאשר כל שורה מייצגת רשומה והערכים מופרדים בפסיקים (או מפריד אחר). נפוץ לייצוא וייבוא נתונים בין יישומים שונים. מודול csv בפייתון מספק כלים לעבודה איתו.

טיפול בשגיאות וקוד חסין: אינטראקציה עם נתונים חיצוניים כרוכה תמיד בסיכונים: כשלים ברשת, שרתים לא זמינים, נתונים בפורמט שגוי, חריגה ממגבלות שימוש (rate limits) של API. במבחן, מצופה מכם לכתוב קוד חסין המטפל בתרחישי כשל אלו באמצעות בלוקי try-except, בדיקת קודי סטטוס של HTTP, ואימות מבנה הנתונים המתקבל. זהו נושא מרכזי המבדיל בין קוד עובד לקוד אמין.

שאלות לדיון

  • מתי תעדיפו להשתמש ב-Web API ומתי במסד נתונים יחסי לאחזור נתונים, ומהם היתרונות והחסרונות של כל גישה?
  • הסבירו מהי בעיית SQL Injection וכיצד ניתן למנוע אותה בעת עבודה עם מודול sqlite3 בפייתון.
  • תארו שלושה סוגים שונים של שגיאות שיכולות להתרחש בעת ביצוע בקשת HTTP ל-API חיצוני, וכיצד תטפלו בכל אחת מהן בקוד הפייתון שלכם.
  • מהם ההבדלים העיקריים בין פורמטי JSON ו-XML, ומתי תבחרו להשתמש בכל אחד מהם?

נקודות לתשובת מודל

לשאלה "הסבירו מהי בעיית SQL Injection וכיצד ניתן למנוע אותה בעת עבודה עם מודול sqlite3 בפייתון":

  • הסבר SQL Injection: זוהי מתקפת אבטחה שבה תוקף מזין קוד SQL זדוני כקלט לתוכנית, במטרה לגרום למסד הנתונים לבצע פעולות לא מורשות (למשל, מחיקת טבלאות, גניבת מידע). זה קורה כאשר קלט המשתמש משורשר ישירות לשאילתת SQL מבלי לעבור סניטציה או פרמטריזציה.
  • דוגמה לפרצה: אם יש שאילתה כמו "SELECT * FROM users WHERE username = '" + user_input + "'", קלט כמו ' OR 1=1 -- יכול לשנות את משמעות השאילתה.
  • מניעה באמצעות פרמטריזציה: הדרך הנכונה והבטוחה למנוע SQL Injection היא באמצעות פרמטריזציה של שאילתות. במקום לשרשר מחרוזות, יש להשתמש בסימני שאלה (?) או שמות פרמטרים (:name) בתוך השאילתה, ולהעביר את הערכים כארגומנט נפרד לפונקציית execute().
  • דוגמה למניעה ב-sqlite3: username = input("Enter username: ")
    cursor.execute("SELECT * FROM users WHERE username = ?", (username,))
    המודול sqlite3 מטפל באופן אוטומטי ב"בריחה" (escaping) של התווים המיוחדים בקלט, ובכך מונע את המתקפה.
מצאתם טעות או שחסר משהו?
→ הקודמת
ויזואליזציית נתונים
הבאה ←
עקרונות אלגוריתמיים וביצועים