ברוכים הבאים ליחידת הלימוד "עבודה עם נתונים חיצוניים" בקורס "תכנות וניתוח נתונים בשפת פייתון" (20606). בעולם המודרני, יישומים רבים אינם פועלים במנותק, אלא דורשים גישה ואינטראקציה עם נתונים ממקורות חיצוניים – בין אם אלו שירותי רשת, מסדי נתונים מרוחקים או קבצים בפורמטים שונים. יחידה זו חיונית להבנת האופן שבו פייתון מאפשרת לנו להתממשק למקורות אלו, לאחזר נתונים, לעבד אותם ולשלב אותם ביישומים שלנו. הבנה מעמיקה של נושאים אלו קריטית להצלחה במבחן, המדגיש לרוב יכולת יישום מעשית וטיפול בשגיאות.
התממשקות ל-Web APIs באמצעות HTTP
אחד המקורות הנפוצים ביותר לנתונים חיצוניים כיום הוא שירותי רשת (Web APIs). שירותים אלו מאפשרים ליישומים שונים לתקשר ביניהם באמצעות פרוטוקול HTTP, בדומה לאופן שבו דפדפן אינטרנט מתקשר עם שרת.
ספריית requests בפייתון
ספריית requests היא הסטנדרט בפייתון לביצוע בקשות HTTP. היא מפשטת מאוד את תהליך שליחת הבקשות וקבלת התגובות.
שיטות 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, שהם קבצים מקומיים אך מייצגים את העקרונות של מסדי נתונים יחסיים. הוא מצוין ללמידה ולפיתוח מקומי.
פעולות בסיסיות עם 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()
? או :name) ובארגומנטים נפרדים לפונקציית execute(). זהו נושא קריטי לבחינה!פורמטים נפוצים לנתונים חיצוניים
מעבר ל-JSON, קיימים פורמטים נוספים המשמשים להעברת נתונים חיצוניים.
JSON
קל לקריאה וכתיבה לבני אדם ומכונות. נפוץ מאוד ב-Web APIs. ממופה בקלות למבני נתונים של פייתון (מילונים ורשימות) באמצעות מודול json.
XML
פורמט מבוסס תגיות, דומה ל-HTML. היה נפוץ בעבר ב-Web Services (SOAP) ועדיין קיים במערכות מסוימות. ניתן לנתח באמצעות מודולים כמו xml.etree.ElementTree.
CSV
Comma Separated Values. פורמט טקסט פשוט לאחסון נתונים טבלאיים, כאשר כל שורה מייצגת רשומה והערכים מופרדים בפסיקים (או מפריד אחר). נפוץ לייצוא וייבוא נתונים בין יישומים שונים. מודול csv בפייתון מספק כלים לעבודה איתו.
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) של התווים המיוחדים בקלט, ובכך מונע את המתקפה.