Python: הורדת נתונים מהאינטרנט ל-SQL Server

10/08/2017

אין תגובות

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

image
נתחיל בפייתון לבד:

import pandas as pd

countries=pd.read_html("https://simple.wikipedia.org/wiki/List_of_countries_by_population_density")

countries[0]

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

pandas
lxml
html5lib
BeautifulSoup4

כיצד מתקינים? בעזרת פקודת ההתקנה pip, למשל (בחלונית שורת הפקודה cmd):

pip install pandas

אם המערכת אינה מוצאת את pip, יש להפעיל אותו עם הנתיב המלא שלו.
כדי למצוא אילו התקנות יש אפשר להריץ ב-cmd ב-root את הפקודה

dir/b/s pip.exe

אצלי היו שלוש התקנות שלו, ואזי אפשר לנסות כך (לפי מה שאצלי):

"C:\Program Files\Python36\Scripts\pip.exe" install pandas

לסיום – כדאי לאתחל את ממשק הפיתוח (אם יש כזה), ולקוות שהקוד הנ”ל יעבוד.

מה עושים אם כל זה?
לשם כך נעבור ל-SQL 2017 (או לכל גירסה עתידית תומכת Python) ונריץ:

Exec    sp_execute_external_script

       @language=N'Python',

       @script =N'

import pandas as pd

countries=pd.read_html("https://simple.wikipedia.org/wiki/List_of_countries_by_population_density")

OutputDataSet=countries[0]';

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

sp_configure 'external scripts enabled', 1

Go

ReConfigure

Go

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

image

עובד!
ננסה לשפר את חווית המשתמש:

  1. לעמודות אין כותרות עם משמעות
  2. ללא שום קשר – שורה עם שמות העמודות מופיע בתחילת הפלט, ועוד אחת – בסופו (לא רואים בצילום המסך).
  3. העמודות הראשונה והאחרונה מיותרות – באחת מספור רץ, ובאחרת קישורים מויקיפדיה.

את השורות והעמודות נסיר בפייתון עצמו,
ואת שמות העמודות ב-SQL עצמו בעזרת With Result Sets:

Exec    sp_execute_external_script

       @language=N'Python',

       @script =N'

import pandas as pd

countries=pd.read_html("https://simple.wikipedia.org/wiki/List_of_countries_by_population_density")

OutputDataSet=countries[0][1:-1].ix[:,1:7]'

With Result Sets (([Country / dependent territory] Varchar(50),

                [Population] Int,

                [Date last updated] Varchar(50),

                [Area (km2)] Decimal(10,2),

                [Area (mi2)] Decimal(10,2),

                [Density (km2)] Varchar(50),

                [Density (mi2)] Varchar(50)));

בשורת ה-OutputDataSet:
אדום (0) – הטבלה הראשונה (יתכנו מספר טבלאות באותו אתר).
ירוק (1-:1) – מהשורה השניה (הראשונה היא 0) ועד לאחרונה (לא כולל..).
סגול (:) – פילטר נוסף על השורות שבמקרה זה הוא מיותר.
כחול (1:7) – העמודות מהשניה ועד לשביעית (לא כולל).

מה קורה כשיש מספר טבלאות?
עיינו באתר של בלומברג:

image

יש בו מספר טבלאות (הנתונים משתנים בכל כמה שניות..).

Exec    sp_execute_external_script

       @language=N'Python',

       @script =N'

import pandas as pd

countries=pd.read_html("https://www.bloomberg.com/markets/currencies/cross-rates")

OutputDataSet=countries[0]';

הקוד הזה יחזיר את הטבלה הראשונה ([0]countries).
נוכל לקבל את שלוש האחרות אם נשנה את הקוד בהתאם ל- 1,2,3.

הוסף תגובה
facebook linkedin twitter email

כתיבת תגובה

האימייל לא יוצג באתר. שדות החובה מסומנים *