آموزش کار با api در پایتون

August 2021

آموزش کار با api در پایتون

در این آموزش API پایتون ، نحوه بازیابی داده ها برای پروژه های علم داده را یاد می گیریم. میلیون ها API آنلاین وجود دارد که دسترسی به داده ها را فراهم می کند. وب سایت هایی مانند Reddit ، Twitter و Facebook همه داده های خاصی را از طریق API های خود ارائه می دهند.

 

برای استفاده از API ، یک درخواست به یک سرور وب از راه دور فرستاده و داده های مورد نیاز خود را بازیابی کنید.

 

اما چرا از یک API به جای مجموعه داده CSV ایستا که می توانید از وب بارگیری کنید استفاده کنید؟ API ها در موارد زیر مفید هستند:

 

1. داده ها به سرعت تغییر می کنند. نمونه ای از این اطلاعات مربوط به قیمت سهام است. ایجاد یک مجموعه داده و بارگیری آن در هر دقیقه واقعاً منطقی نیست - این کار پهنای باند زیادی را می گیرد و بسیار کند است.

 

2. شما یک قطعه کوچک از مجموعه داده های بسیار بزرگتر می خواهید. نظرات Reddit یک مثال است. اگر می خواهید فقط نظرات خود را در Reddit بارگیری کنید، چه می کنید؟ بارگیری کل پایگاه داده Reddit و سپس فیلتر کردن نظرات خود چندان منطقی نیست.

 

3. محاسبات مکرر درگیر است. Spotify دارای API است که می تواند ژانر یک قطعه موسیقی را به شما بگوید. شما می توانید از لحاظ نظری طبقه بندی کننده خود را ایجاد کرده و از آن برای محاسبه دسته بندی های موسیقی استفاده کنید ، اما هرگز به اندازه Spotify داده نخواهید داشت.

 

در مواردی مانند موارد بالا ، API راه حل مناسب است. در این مقاله، ما با پایتون از یک API ساده برای بازیابی اطلاعات مربوط به ایستگاه فضایی بین المللی (ISS) پرس و جو می کنیم.

 


 

ایستگاه فضایی

 

درباره این آموزش API پایتون

برای این آموزش ، فرض می کنیم که شما برخی از اصول کار با داده ها در پایتون را می دانید. اگر اینطور نیست ، ممکن است دوست داشته باشید دوره رایگان اصول پایتون را امتحان کنید.

 

اگر به دنبال چیزی پیشرفته تر هستید ، آموزش ساخت API با django rest framework ما را بررسی کنید.

 


 

api چیست؟

API یا رابط برنامه نویسی برنامه، سروری است که می توانید از آن برای بازیابی و ارسال داده ها با استفاده از کد استفاده کنید. API ها بیشتر برای بازیابی اطلاعات استفاده می شوند و این تمرکز این آموزش خواهد بود.

 

هنگامی که می خواهیم داده ها را از API دریافت کنیم ، باید درخواست دهیم. درخواست ها در سراسر وب استفاده می شود. به عنوان مثال ، هنگام بازدید از این پست وبلاگ ، مرورگر وب شما درخواستی از سرور وب مونگارد ارائه کرد که با محتوای این صفحه وب پاسخ داد.

 

توضیح عملکرد api

درخواست های API دقیقاً به همان شیوه عمل می کنند - شما درخواست داده را به سرور API می دهید و به درخواست شما پاسخ می دهد.

 


 

ایجاد درخواست API در پایتون

برای کار با API ها در پایتون ، به ابزارهایی نیاز داریم که این درخواست ها را انجام دهند. در پایتون ، رایج ترین کتابخانه برای درخواست و کار با API ها ، کتابخانه requests است. کتابخانه requests بخشی از کتابخانه استاندارد پایتون نیست ، بنابراین برای شروع باید آن را نصب کنید.

 

اگر از pip برای مدیریت بسته های Python خود استفاده می کنید ، می توانید requests را با استفاده از دستور زیر نصب کنید:

pip install requests

 

پس از نصب کتابخانه ، باید آن را وارد کنید. بیایید با آن مرحله مهم شروع کنیم:

import requests

اکنون که کتابخانه requests را نصب و وارد کرده ایم ، بیایید از آن استفاده کنیم.

 


 

ایجاد اولین درخواست API

انواع مختلفی از درخواست ها وجود دارد. رایج ترین مورد ، درخواست GET ، برای بازیابی داده ها استفاده می شود. از آنجا که ما فقط با بازیابی داده ها کار می کنیم ، تمرکز ما بر روی درخواست های "get" خواهد بود.

 

هنگام درخواست، پاسخ API با یک کد پاسخ همراه است که به ما می گوید آیا درخواست ما موفق بوده یا خیر. کدهای پاسخ مهم هستند زیرا بلافاصله به ما می گویند که مشکلی پیش آمده است.

 

برای ایجاد درخواست "GET" ، از تابع request.get () استفاده می کنیم که به یک آرگومان نیاز دارد - نشانی اینترنتی که می خواهیم درخواست را به آن ارائه دهیم. ما با درخواست از نقطه پایانی API که وجود ندارد شروع می کنیم ، بنابراین می توانیم ببینیم که کد پاسخ چگونه است.

 

response = requests.get("https://api.open-notify.org/this-api-doesnt-exist")

 

تابع get () یک شیء response را برمی گرداند. ما می توانیم از ویژگی response.status_code برای دریافت کد وضعیت درخواست خود استفاده کنیم:

print(response.status_code)

# OUTPUT
404

 

کد وضعیت "404" ممکن است برای شما آشنا باشد - این کد وضعیتی است که یک سرور در صورتی که نتواند فایلی را که ما درخواست کرده ایم پیدا کند ، باز می گرداند. در این مورد ، ما درخواست کردیم که this-api-doesnt-exist وجود نداشت!

 

بیایید کمی بیشتر در مورد کدهای وضعیت رایج بیاموزیم.

 


 

کدهای وضعیت API

کدهای وضعیت با هر درخواستی که به یک سرور وب ارسال می شود ، بازگردانده می شوند. کدهای وضعیت اطلاعات مربوط به آنچه در یک درخواست اتفاق افتاده است را نشان می دهد. در اینجا برخی از کدهای مربوط به درخواست های GET آمده است:

 

200: همه چیز خوب پیش رفت و نتیجه برگشت داده شد (در صورت وجود).

301: سرور شما را به نقطه پایانی دیگری هدایت می کند. این می تواند زمانی اتفاق بیفتد که یک شرکت نام دامنه را تغییر می دهد یا نام نقطه پایانی تغییر می کند.

400: سرور فکر می کند که شما درخواست بدی کرده اید. این می تواند زمانی اتفاق بیفتد که در کنار سایر موارد ، داده های مناسب را ارسال نکنید.

401: سرور فکر می کند که احراز هویت نشده اید. بسیاری از API ها نیاز به اعتبار ورود دارند، بنابراین این امر زمانی اتفاق می افتد که شما اعتبار صحیح را برای دسترسی به API ارسال نکنید.

403: منبعی که می خواهید به آن دسترسی پیدا کنید ممنوع است: شما مجوزهای مناسبی برای مشاهده آن ندارید.

404: منبعی که سعی کردید به آن دسترسی پیدا کنید در سرور یافت نشد.

503: سرور آماده رسیدگی به درخواست نیست.

 

ممکن است توجه داشته باشید که همه کدهای وضعیتی که با "4" شروع می شوند نوعی خطا را نشان می دهند. اولین تعداد کد وضعیت نشان دهنده دسته بندی آنها است. این مفید است - می توانید بدانید که اگر کد وضعیت شما با "2" شروع شود ، موفق بود و اگر با "4" یا "5" شروع شود ، خطایی رخ داد.

 


 

مستندات API

به منظور اطمینان از درخواست موفقیت آمیز ما ، هنگام کار با API ها مهم است که از مستندات استفاده کنیم. اسناد در ابتدا می تواند ترسناک به نظر برسد ، اما هرچه بیشتر از مستندات استفاده می کنید ، راحت تر می شوید.

 

ما با API به نام Open Notify کار خواهیم کرد که به داده های مربوط به ایستگاه فضایی بین المللی دسترسی می دهد. این یک API عالی برای یادگیری است زیرا طراحی بسیار ساده ای دارد و نیازی به احراز هویت ندارد.

 

اغلب چندین API در یک سرور خاص موجود است. هر یک از این API ها معمولاً نقاط پایانی(endpoint) نامیده می شوند. اولین نقطه پایانی که ما استفاده می کنیم https://api.open-notify.org/astros.json است که اطلاعات مربوط به فضانوردان فعلی در فضا را برمی گرداند.

 

اگر روی لینک بالا کلیک کنید تا اسناد مربوط به این نقطه نهایی را مشاهده کنید ، خواهید دید که می گوید این API ورودی ندارد. این امر برای ما یک API ساده برای شروع کار می کند. ما ابتدا با استفاده از کتابخانه requests ، درخواست GET را به نقطه پایانی می رسانیم:

response = requests.get("https://api.open-notify.org/astros.json")
print(response.status_code)

# OUTPUT
200

 

ما یک کد "200" دریافت کردیم که به ما می گوید درخواست ما با موفقیت انجام شد. مستندات به ما می گوید که پاسخ API که دریافت می کنیم در قالب JSON است. اگر تا به حال با json کار نکرده‌اید، پیشنهاد میکنیم ویدیو‌های آموزش json و آموزش کار با json در پایتون را ببینید، اما ابتدا از متد () respond.json برای مشاهده داده هایی که از API دریافت کرده ایم استفاده کنیم:

 

print(response.json())


# OUTPUT
{'message': 'success', 'people': [{'name': 'Alexey Ovchinin', 'craft': 'ISS'}, {'name': 'Nick Hague', 'craft': 'ISS'}, {'name': 'Christina Koch', 'craft': 'ISS'}, {'name': 'Alexander Skvortsov', 'craft': 'ISS'}, {'name': 'Luca Parmitano', 'craft': 'ISS'}, {'name': 'Andrew Morgan', 'craft': 'ISS'}], 'number': 6}

 


 

استفاده از API با Query Parameters

نقطه پایانی https://api.open-notify.org/astros.json که قبلاً استفاده کردیم هیچ پارامتری ندارد. ما فقط یک درخواست GET ارسال می کنیم و API اطلاعات مربوط به تعداد افرادی را که در حال حاضر در فضا هستند ارسال می کند.

 

با این وجود ، داشتن یک نقطه پایانی API که نیاز به تعیین پارامترها دارد بسیار رایج است. به عنوان مثال https://api.open-notify.org/iss-pass.json . این نقطه پایانی در دفعات بعدی به ما می گوید که ایستگاه فضایی بین المللی از یک مکان مشخص روی زمین عبور می کند.

 

اگر به اسناد نگاه کنیم، پارامترهای مورد نیاز lat (عرض جغرافیایی) و long (طول جغرافیایی) را مشخص می کند.

 

ما می توانیم این کار را با افزودن یک آرگومان کلید واژه اختیاری، params ، به درخواست خود انجام دهیم. ما می توانیم با این پارامترها یک دیکشنری بسازیم و سپس آنها را به تابع request.get منتقل کنیم. در اینجا دیکشنری ما با استفاده از مختصات شهر نیویورک به نظر می رسد:

parameters = {
    "lat": 40.71,
    "lon": -74
}

 

ما همچنین می توانیم همین کار را مستقیماً با افزودن پارامترها به آدرس مستقیم انجام دهیم. مانند این: https://api.open-notify.org/iss-pass.json؟lat=40.71&lon؛=-74.

 

تقریباً همیشه ترجیح داده می شود که پارامترها به عنوان یک دیکشنری تنظیم شوند، زیرا requests به مواردی که بر می آید، مانند قالب بندی صحیح پارامترهای پرس و جو ، رسیدگی می کند و نیازی نیست نگران وارد کردن مقادیر در رشته URL باشیم.

 

بیایید با استفاده از این مختصات درخواست دهیم و ببینیم چه پاسخی دریافت می کنیم.

 

response = requests.get("https://api.open-notify.org/iss-pass.json", params=parameters)

jprint(response.json())

 

{
    "message": "success",
    "request": {
        "altitude": 100,
        "datetime": 1568062811,
        "latitude": 40.71,
        "longitude": -74.0,
        "passes": 5
    },
    "response": [
        {
            "duration": 395,
            "risetime": 1568082479
        },
        {
            "duration": 640,
            "risetime": 1568088118
        },
        {
            "duration": 614,
            "risetime": 1568093944
        },
        {
            "duration": 555,
            "risetime": 1568099831
        },
        {
            "duration": 595,
            "risetime": 1568105674
        }
    ]
}

 


 

درک گذر زمان

پاسخ JSON با آنچه اسناد مشخص کرده است مطابقت دارد:

 

 

بیایید زمان عبور را از شی JSON خود استخراج کنیم:

pass_times = response.json()['response']
jprint(pass_times)

 

[
    {
        "duration": 395,
        "risetime": 1568082479
    },
    {
        "duration": 640,
        "risetime": 1568088118
    },
    {
        "duration": 614,
        "risetime": 1568093944
    },
    {
        "duration": 555,
        "risetime": 1568099831
    },
    {
        "duration": 595,
        "risetime": 1568105674
    }
]

 

در مرحله بعد ما از یک حلقه برای استخراج پنج مقدار risetime استفاده می کنیم:

risetimes = []

for d in pass_times:
    time = d['risetime']
    risetimes.append(time)

print(risetimes)

 

[1568082479, 1568088118, 1568093944, 1568099831, 1568105674]

 

درک این زمانها دشوار است - آنها در قالبی شناخته می شوند که به عنوان timestamp یا epoch می شوند. اساساً زمان از 1 ژانویه 1970 با تعداد ثانیه اندازه گیری می شود. ما می توانیم از روش Python datetime.fromtimestamp () برای تبدیل این زمانها به زمانهای قابل فهم استفاده کنیم:

from datetime import datetime

times = []

for rt in risetimes:
    time = datetime.fromtimestamp(rt)
    times.append(time)
    print(time)

 

2019-09-09 21:27:59
2019-09-09 23:01:58
2019-09-10 00:39:04
2019-09-10 02:17:11
2019-09-10 03:54:34

 

به نظر می رسد ISS اغلب از شهر نیویورک عبور می کند - پنج بار بعدی در یک دوره هفت ساعته اتفاق می افتد!

 


 

نتیجه گیری

 

در این آموزش یاد گرفتیم:

 

مقالات مرتبط

معرفی 8 ابزار مهم پایتون برای ساخت api

7 اشتباه برنامه نویسان جنگو

nginx چیست؟ به همراه دوره آموزش کانفیگ و راه اندازی nginx

آینده پایتون