Archive

Archive for the ‘Open Knesset’ Category

תוצאות הבחירות לכנסת השמונה-עשרה (בחתך קלפיות)

31/08/2012 5 תגובות

במפגש הפיתוח האחרון של הסדנא לידע ציבורי, ישבתי מול עפרי מפרוייקט הכנסת הפתוחה. עפרי בדק את הקובץ שהכנסת מספקת עם תוצאות ההצבעה בבחירות לכנס ה-18 (פורמט CSV). הקובץ מכיל פירוט הצבעות לגבי כל הקלפיות בארץ (~9200 קלפיות). כאשר המטרה הסופית היא לחבר את הקלפיות לתצוגת מפה בה אפשר יהיה לראות את נתוני ההצבעה בערים ובשכונות שונות.

הבעיה היא שהקובץ עם פירוט הקלפיות מכיל את מס' הקלפי בלבד, ללא תיאור שלו. וכמובן שללא התיאור, אי אפשר לבקש מאנשים לעזור כדי להמיר אותו לנ"צ שאפשר לשים על מפה. החלטתי להתנדב כדי לדאוג להוספת המידע החסר לקובץ, זה לא נראה לי כמשימה מסובכת יותר מידי. התוצאות של הבחירות לכנסת ה-17 (פורמט XLS) מכיל את כתובת הקלפי במקום תיאורו. והתוצאות של הבחירות לכנס ה-16 זמינות רק דרך האתר ואין קובץ מרוכז שמכיל את הכל התוצאות.

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

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

בשלב זה הבנתי שעיקר העבודה תהיה קצירת המידע מאתר הכנסת. לצורך כך מצאתי את כתובות העמודים של הערים בחלוקה לא"ב, לאחר הפשטת כל ה-JS שמפנה לעמודים השונים. לולאה פשוטה עם wget אפשרה לי למשוך את כל העמודים (כתובת קבועה עם פרמטר של urlencode של אות כלשהי), ועיבוד שלהם עם sed אפשר להוציא את קוד העיר ושמה (כמובן שרוב היישובים אינם ערים, אבל אשאר עם עיר לצורך הפשטות). למרות שאני עובד עם sed על בסיס יומי, עדיין למדתי כמה דברים חדשים, ובעיקר על השמטה של חלקים רבים של המחרוזת דרך ביטוי רגולרי.

עם רשימת הערים (יש 1157 כאלה), התחלתי לחשוב איך להוציא את רשימת הקלפיות בכל אחת מהן. מאחר וגם הקלפיות של כל עיר מחולקות לעמודים שונים לפי א"ב, יש צורך באזור ה-25,000 שאילתות שונות (1157*22) כדי למשוך את כל המידע. שוב פעם הרצתי לולאה של wget. בהתחלה שמתי לב שכל הורדה לוקחת הרבה זמן, למרות שגודל התשובות הוא מאוד קטן. בדיקה קצרה הראתה שמדובר בזמן תשובה איטי של שרת ה-DNS. טיפול מהיר בקובץ ה-hosts האיץ את התהליך משמעותית. אם בהתחלה הייתי בטוח שאחסם בכלל כמות החסימות, לאחר הגברת התדירות כתוצאה מטיפול בבעיית ה-DNS הייתי בטוח שחסם על ניסיון DDOS או משהו כזה, אבל מסתבר שזה לא הזיז לאף אחד (אולי מישהו באיזה מרכז ניטור קיבל התראה (: ).

כל הקבצים שהורדו עברו המרה ל-UTF8 עם iconv (כמה פשוט, ככה מדהים) כדי שאוכל לעשות grep בקלות משורת הפקודה כדי לאתר את כל הקבצים שמכילים הודעה שאין קלפיות שמתחילים באות הזאת. לאחר הסינון, שוב עובדו הקבצים עם sed כדי להוציא מהם את קוד היישוב, קוד הקלפי והתיאור שלו. כעת ניתן לרכז את כל הנתונים לקובץ אחד שמכיל את הנתונים שיש לי מהקובץ המקורי (מס' יישוב ומס' קלפי) ואת המידע שאני רוצה להוסיף (שם/תיאור הקלפי).

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

בדרך, בוצעו עוד כל מיני עיבודים עם sed ו-cut כדי לבצע המרות מפורמט CSV לכזה שמופרד בטאבים וגם כדי להוציא את השדות הרלוונטים לכל מיני עיבודים (בדרך למדתי שמפריד השדרות ברירת מחדל של cut הוא טאב).

לסיכום, תענוג לראות איך כלים פשוטים מאפשר לבצע את העיבודים על מספר קבצים גדול ועל קבצים גדולים בעלי אלפי שורות (סה"כ השתמשתי ב-cat, wget, sed, grep, iconv ובשתי לולאות בלבד). אם אתרי הבחירות השונים של הכנסת היו תואמים אחד לשני, אול היה טעם להפוך את כל הפקודות לסקריפט, אבל בנתיים רק שמרתי את הפקודות לשימוש עתידי.

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

:קטגוריותOpen Knesset