python api requests urllib pycurl json rpc aiohttp mssql

Merhaba iyi günler.

Bugün; popülaritesi gün geçtikçe yükselen, birçok makine öğrenmesi-yapay zeka temelli uygulamalarda açık ara ön planda olan, veri madenciliği-bilimsel analiz çözümlemelerinde esnek çözümlemeler sunan, hızlı ve çevik yapısı ile kullanıcıların gözdesi olarak yer edinmiş Python dili üzerinde APIApplication Programming Interface (Uygulama Programlama Arabirimi) çözümlerini inceliyor olacağım.

Şimdiden iyi okumalar.

Hatırlatma:Python ve Pyhton Kütüphanelerine yönelik ön bilgiler içeren hatırlatmalara alt kısımda yer alan yazılar üzerinden ulaşabilirsiniz.

Çözümleme öncesinde kısaca anahtar bilgilere yönelik hatırlatmalarda bulunacak olursak;

API (Application Programming Interface); bir uygulamanın verilerini diğer bir uygulama veya cihazlarla paylaşmasına, yanısıra veriye dayalı çeşitli etkileşimler kurmasına olanak sağlayan bir çözümdür.

Bir diğer deyişle; ilgili yazılımlarla bir araya gelerek onların birbirleriyle haberleşmesine, veri alışverişine ve işbirliğine olanak sağlamaktadır.
*Sistemler arası iletişim sağlanması olarakta özde ifade edilmektedir.

API’lar; günümüzde veriye dayalı ilerleyen teknolojinin ve dijitalleşmenin önemli bir parçası olarak görülmektedir.
Özellikle de veri odaklı faaliyetlerde vazgeçilmez bir sistem tamamlayıcısı rolü üstlenmektedir.

API Türleri

Temel tabanlı olarak API çözümleri dört kategoride derlenmektedir.

Bunlar;

  • Open API (Açık API):Genel API veya Harici API olarak da bilinen Açık API’lar; herhangi bir geliştirici tarafından kullanılabilen; düşük kimlik doğrulama ve yetkilendirme önlemlerine sahip ve genellikle paylaştıkları bilgilerde kısıt olan API türüdür.
    Örneğin; Google Haritalar API, Google Analytics API, Spotify API vb.
  • Partner API (İş Ortağı API):İş Ortağı API’ler; harici olarak paylaşılan, yalnızca API’yi sağlayan şirketle iş ilişkisi olan kişiler ya da şirketler arasında çeşitli kimlik doğrulama ve yetkilendirme önlemlerine sahip olan API türüdür.
    Örneğin; Kargo firması kişisel/kurumsal kargo takip bilgilendirme servisi ya da B2B hizmetleri vb.
  • Internal API (Dahili API):Dahili API’ler; yalnızca bir şirket içinde kullanıma sunulan ve ekipler ile sistemler arasındaki veri aktarımlarını kolaylaştırmayı amaçlayan API türüdür.
    Örneğin; Kurum içi kullanıcı bilgileri servisi vb.
  • Composite API (Kompozit (Çoklu) API):Bileşik API’lar; geliştiricilerin çağrıları veya istekleri bir araya getirmesine ve farklı sunuculardan tek bir birleştirilmiş yanıt almasına olanak tanıyan birden çok API kullanmasını sağlayan API türüdür.

olarak ifade edilmektedir.

API Mimarileri

Temel tabanlı olarak API çözümleri kategorilerine yönelik inşa edilen API mimari türleri yönünden üç kategoride derlenmektedir.

Bunlar;

  • REST API (Representational State Transfer – Temsil Durum Aktarımı):REST; istemci ve sunucu arasında bilgi aktarımı sağlayan; ölçeklenebilir, hafif ve kullanımı kolay olacak şekilde tasarlanmış bir servis yapısıdır.
    REST API (RESTful API); REST yönergelerini izleyen bir API türüdür ve verileri bir sunucudan istekte bulunan bir istemciye aktarmak için kullanılımaktadır.

    Bu yapı içerisinde birtakım yönergeler ve özellikler bulunmaktadır, bunlar;
    *RESTful API 6 özelliği-kuralı.
  1. Client-Server Separation (İstemci-Sunucu Ayrımı)stemci-sunucu etkileşimleri, istemciden gelen bir istek ve ardından sunucudan gelen bir yanıt şeklinde yapılandırılmalıdır.
  2. Uniform Interface (Tekdüzen – Tekbiçim Arayüz):İstekler ve yanıtlar herhangi bir istemci ile herhangi bir sunucu arasında uyumluluğu sağlamak için belirli bir şekilde biçimlendirilmelidir.
  3. Stateless (Durumsuzluk):İstemci-sunucu etkileşimi diğer tüm etkileşimlerden (önceki-sonraki) bağımsız olarak tamamlanan yada tanımlanan bir iletişim yöntemi içermelidir.
  4. Layered System (Katmanlı Sistem):İstekler ve yanıtlar, istemci ile sunucu arasındaki ara sunuculardan geçse bile her zaman aynı şekilde biçimlendirilmelidir.
  5. Cacheable (Önbelleklenebilir – Önbelleğe Alınabilir):Sunucu yanıtları sağlanan bir kaynağın istemci tarafından önbelleğe alınıp alınmayacağını ve ne kadar süreyle önbellekte kalacağı belirlenmelidir.
  6. Code on Demand – Optional (İsteğe Bağlı Kod – Opsiyonel):Sunucu bir yanıtında istemcilere bilgisayar kodu gönderip, kendi arka ucunda çalıştırma yetkisi sağlayıp sağlamayacağı belirlenmelidir.
  • SOAP API (Simple Object Access Protocol – Basit Nesne Erişim Protokolü):SOAP; ağlar arasında bilgi iletimi sağlayan; sabit ve değişmez kuralları olan temel bir protokol yapısıdır. 
  • RPC API (Remote Procedure Call – Uzaktan Prosedür Çağrısı):REST ve SOAP’tan farklı olarak RPCistemci tarafında kullanılan herhangi bir program sunucu-istemci iletişimine ihtiyaç duyuyor ise, prosedürü sağlayan programa izin veren süreçler arası iletişim teknolojisi yapısıdır.

olarak ifade edilmektedir.

API HTTP Durum Kodları

HTTP (Hyper Text Transfer Protocol – Üst Metin Transfer Protokolü):Bilginin sunucudan istemciye nasıl ve ne şekilde aktarılacağını belirten protokoldür.

HTTPS (Secure Hyper Text Transfer Protocol – Güvenli Üst Metin Transfer Protokolü):Bilginin sunucudan istemciye nasıl ve ne şekilde aktarılacağını belirten bilgi taşıma katmanı güvenliği veya öncesinde öncül olan güvenli soket katmanı olan protokoldür.

API kullanımında iletilen istemci istekleri sonrasında sunucu taraflı olarak bazı durum kodları geri dönmektedir.
Bunlar;

  • Informational Responses 100-199 (Bilgilendirici Yanıtlar);
  1. 100 Continue (Devam)
  2. 101 Switching Protocols (Anahtarlama Protokolü)
  3. 102 Processing (İşleme)
  4. 103 Early Hints (Erken İpuçları)
  • Successful Responses 200-299 (Başarılı Yanıtlar);
  1. 200 OK (Tamam – Başarılı)
  2. 201 Created (Oluşturuldu)
  3. 202 Accepted (Kabul Edildi)
  4. 203 Non-Authoritative Information (Yetkili Olmayan Bilgiler)
  5. 204 No Content (İçerik Yok)
  6. 205 Reset Content (İçeriği Sıfırla)
  7. 206 Partial Content (Kısmi İçerik)
  8. 207 Multi-Status (Çoklu Durum)
  9. 208 Already Reported (Bildirildi)
  10. 226 IM Used – HTTP Delta Encoding (IM Kullanıldı – HTTP Delta Kodlaması)
  • Redirection Messages 300-399 (Yönlendirme Mesajları):
  1. 300 Multiple Choices (Çoklu Seçim)
  2. 301 Moved Permanently (Kalıcı Olarak Taşındı)
  3. 302 Found (Bulundu)
  4. 303 See Other (Diğerlerine Bakın)
  5. 304 Not Modified (Düzenlenmemiş)
  6. 305 Use Proxy (Proxy Kullan)
  7. 306 Unused (Kullanılmamış)
  8. 307 Temporary Redirect (Geçici Yönlendirme)
  9. 308 Permanent Redirect (Kalıcı Yönlendirme)
  • Client Error Responses 400-499 (İstemci Hatası Yanıtları):
  1. 400 Bad Request (Kötü İstek)
  2. 401 Unauthorized (Yetkisiz)
  3. 402 Payment Required (Ödeme Gerekli)
  4. 403 Forbidden (Yasak)
  5. 404 Not Found (Bulunamadı)
  6. 405 Method Not Allowed (Yönteme İzin Verilmiyor)
  7. 406 Not Acceptable (Kabul Edilmez)
  8. 407 Proxy Authentication Required (Proxy Kimlik Doğrulaması Gerekli)
  9. 408 Request Timeout (İstek Zaman Aşımı)
  10. 409 Conflict (Çatışma)
  11. 410 Gone (Gitti)
  12. 411 Length Required (Gerekli Uzunluk)
  13. 412 Precondition Failed (Önkoşul Başarısız)
  14. 413 Payload Too Large (Yük Çok Büyük)
  15. 414 URI Too Long (URI Çok Uzun)
  16. 415 Unsupported Media Type (Desteklenmeyen Ortam Türü)
  17. 416 Range Not Satisfiable (Aralık Yetersiz)
  18. 417 Expectation Failed (Beklenti Başarısız)
  19. 421 Misdirected Request (Yanlış Yönlendirilmiş İstek)
  20. 422 Unprocessable Entity (İşlenemeyen Varlık)
  21. 423 Locked (Kilitli)
  22. 424 Failed Dependency (Başarısız Bağımlılık)
  23. 425 Too Early Experimental (Erken Deneyimleme)
  24. 426 Upgrade Required (Yükseltme Gerekli)
  25. 428 Precondition Required (Önkoşul Gerekli)
  26. 429 Too Many Requests (Çok Fazla İstek)
  27. 431 Request Header Fields Too Large (İstek Başlık Alanları Çok Büyük)
  28. 451 Unavailable For Legal Reasons (Yasal Sebeblerle Müsait Değil)
  • Server Error Responses 500-599 (Sunucu Hatası Yanıtları):
  1. 500 Internal Server Error (Dahili Sunucu Hatası)
  2. 501 Not Implemented (Uygulanmadı)
  3. 502 Bad Gateway (Geçit Hatası)
  4. 503 Service Unavailable (Hizmet Kullanılamıyor)
  5. 504 Gateway Timeout (Geçit Kullanılamıyor)
  6. 505 HTTP Version Not Supported (HTTP Sürümü Desteklenmiyor)
  7. 506 Variant Also Negotiates (Varyant Planlanmalı)
  8. 507 Insufficient Storage (Yetersiz Depolama)
  9. 508 Loop Detected (Dögü Algılandı)
  10. 510 Not Extended (Genişletilmiş)
  11. 511 Network Authentication Required (Ağ Kimlik Doğrulaması Gerekli)

API HTTP Metodları - İşlemleri

GET, POST, PUT, DELETE, PATCH çok kullanılan HTTP methodlardır.

  • Get :İstemci tarafından; sunucuda yer alan, belirtilmiş kaynaktaki varlığın temsilini istemektedir.
  • Head :İstemci tarafından; sunucudan başlığı olan, yanıt gövdesi olmayan belirtilen kaynaktaki varlığın temsilini istemektedir.
    *Sadece başlığı olan (Request Header), gövdesi olmayan (Request Body).
  • Post :İstemci tarafından; sunucuda yer alan bir kaynağa, belirtilen bir varlığı göndermektedir.
    *Yeni bir varlık oluşturmaktadır.
  • Put :İstemci tarafından sunucuda yer alan hedef kaynağın tüm geçerli temsillerini istek yüküyle değiştirmektedir.
  • Delete :İstemci tarafından sunucuda yer alan hedef kaynağındaki bir varlığı siler.
  • Connect :Hedef kaynak tarafından tanımlanan sunucuya bir tünel oluşturur.
  • Options :Hedef kaynak için iletişim seçeneklerini açıklar.
  • Trace :Hedef kaynağa giden yol boyunca bir ileti geri döngü testi gerçekleştirir.
  • Patch :Bir kaynağa kısmi değişiklikler uygular.

API HTTP Başlıkları

Başlıca karşılaşılan/kullanılan HTTP başlıkları aşağıdaki gibidir;

  1. Accept: İstekteki içeriğin kabul edilebilir türlerini belirtir.
    Örneğin; “Accept: application/json” ifadesi, isteğin sadece JSON türünde içerik kabul edebileceğini gösterir.
  2. Accept-Charset: İstekteki içeriğin kabul edilebilir karakter kümelerini belirtir.
    Örneğin; “Accept-Charset: UTF-8” ifadesi, isteğin sadece UTF-8 karakter kümesinde içerik kabul edebileceğini gösterir.
  3. Accept-Encoding: İstekteki içeriğin kabul edilebilir sıkıştırma türlerini belirtir.
    Örneğin; “Accept-Encoding: gzip” ifadesi, isteğin sadece gzip sıkıştırma türünde içerik kabul edebileceğini gösterir.
  4. Accept-Language: İstekteki içeriğin kabul edilebilir dil türlerini belirtir.
    Örneğin; “Accept-Language: en-US” ifadesi, isteğin sadece İngilizce dilinde içerik kabul edebileceğini gösterir.
  5. Accept-Ranges: Yanıt başlığı olarak kullanılır ve sunucunun belirtilen içeriğin parçalarını verme yeteneğini belirtir.
    Örneğin; “Accept-Ranges: bytes” ifadesi, sunucunun belirtilen içeriğin parçalarını verme yeteneğine sahip olduğunu gösterir.
  6. Age: Yanıt başlığı olarak kullanılır ve sunucudan yanıtın kaç saniye içinde önbellekten gönderildiğini belirtir. Örneğin; “Age: 3600” ifadesi, yanıtın önbellekten 1 saat içinde gönderildiğini gösterir.
  7. Authorization: İstekteki kimlik doğrulama bilgilerini belirtir.
    Örneğin; “Authorization: Basic YWRtaW46cGFzc3dvcmQ=” ifadesi, isteğin “admin” kullanıcı adı ve “password” şifresiyle gönderildiğini gösterir.
  8. Cache-Control: İstekteki önbellek kontrol bilgilerini belirtir.
    Örneğin; “Cache-Control: no-cache” ifadesi, isteğin önbelleklenmemesi gerektiğini gösterir.
  9. Connection: İstekteki bağlantı türlerini belirtir.
    Örneğin; “Connection: keep-alive” ifadesi, isteğin bağlantının açık kalmasını istediğini gösterir.
  10. Content-Length: İstekteki içerik uzunluğunu belirtir.
    Örneğin; “Content-Length: 123” ifadesi, isteğin 123 bayt uzunluğunda bir içeriği olduğunu gösterir.
  11. Content-Type: İstekteki içerik türünü belirtir.
    Örneğin; “Content-Type: application/json” ifadesi, isteğin bir JSON verisi içerdiğini gösterir.
  12. Content-Encoding: Yanıt başlığı olarak kullanılır ve yanıtta kullanılan sıkıştırma türünü belirtir.
    Örneğin; “Content-Encoding: gzip” ifadesi, yanıtta gzip sıkıştırma türü kullanıldığını gösterir.
  13. Content-Language: Yanıt başlığı olarak kullanılır ve yanıtta kullanılan dil türünü belirtir.
    Örneğin; “Content-Language: tr” ifadesi, yanıtta Türkçe dil türü kullanıldığını gösterir.
  14. Content-Location: Yanıt başlığı olarak kullanılır ve yanıtta bulunan içerik için bir URL belirtir.
    Örneğin; “Content-Location: http://example.com/resource.html” ifadesi, yanıtta bulunan içerik için example.com adresindeki resource.html dosyasını gösterir.
  15. Content-Disposition: Yanıt başlığı olarak kullanılır ve yanıtta bulunan içerik için bir dosya adı ve indirme/görüntüleme seçeneğini belirtir.
    Örneğin; “Content-Disposition: attachment; filename=report.pdf” ifadesi, yanıtta bulunan içerik için “report.pdf” dosya adını ve indirme seçeneğini gösterir.
  16. Date: Yanıt başlığı olarak kullanılır ve yanıtın gönderildiği tarihi belirtir.
    Örneğin; “Date: Fri, 01 Jan 2021 00:00:00 GMT” ifadesi, yanıtın 1 Ocak 2021 tarihinde gönderildiğini gösterir.
  17. ETag: Yanıt başlığı olarak kullanılır ve yanıtta bulunan içeriğin benzersiz bir etiketini belirtir.
    Örneğin; “ETag: “1234567890abcdef” ifadesi, yanıtta bulunan içerik için “1234567890abcdef” etiketini gösterir.
  18. Expires: Yanıt başlığı olarak kullanılır ve yanıtın geçerlilik süresini belirtir.
    Örneğin; “Expires: Fri, 01 Jan 2022 00:00:00 GMT” ifadesi, yanıtın 1 Ocak 2022 tarihine kadar geçerli olduğunu gösterir.
  19. Host: İstekteki barındırıcı adını belirtir.
    Örneğin; “Host: example.com” ifadesi, isteğin example.com adresine gönderildiğini gösterir.
  20. If-Modified-Since: İstekteki içeriğin son değiştirilme tarihini belirtir.
    Örneğin; “If-Modified-Since: Fri, 01 Jan 2021 00:00:00 GMT” ifadesi, isteğin içeriğinin 1 Ocak 2021 tarihinden sonra değiştirilmediğini gösterir.
  21. Last-Modified: Yanıt başlığı olarak kullanılır ve yanıtta bulunan içerik için son değiştirilme tarihini belirtir. Örneğin; “Last-Modified: Fri, 01 Jan 2021 00:00:00 GMT” ifadesi, yanıtta bulunan içerik için 1 Ocak 2021 tarihinde değiştirildiğini gösterir.
  22. Link: Yanıt başlığı olarak kullanılır ve yanıtta bulunan içerik ile ilgili diğer kaynakları belirtir.
    Örneğin; “Link: </css/style.css>; rel=stylesheet” ifadesi, yanıtta bulunan içerik için css/style.css dosyasının bir stil sayfası olduğunu gösterir.
  23. Location: Yanıt başlığı olarak kullanılır ve yönlendirilen bir isteğin yönlendirileceği URL’yi belirtir.
    Örneğin; “Location: http://example.com/new-location” ifadesi, yönlendirilen isteğin example.com adresindeki new-location dosyasına yönlendirileceğini gösterir.
  24. Pragma: Yanıt başlığı olarak kullanılır ve önbellek kontrol bilgilerini belirtir.
    Örneğin; “Pragma: no-cache” ifadesi, yanıtın önbelleklenmemesi gerektiğini gösterir.
  25. Refresh: Yanıt başlığı olarak kullanılır ve tarayıcının belirtilen süre sonra sayfayı yenilemesini belirtir. Örneğin; “Refresh: 5; url=http://example.com/new-page” ifadesi, tarayıcının 5 saniye sonra example.com adresindeki new-page dosyasına yönlendirileceğini gösterir.
  26. User-Agent: İstekteki tarayıcı türünü ve sürümünü belirtir.
    Örneğin; “User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36” ifadesi, isteğin Chrome 87 tarayıcısından gönderildiğini gösterir.
  27. X-Requested-With: İstekteki isteğin bir AJAX isteği olduğunu belirtir.
    Örneğin; “X-Requested-With: XMLHttpRequest” ifadesi, isteğin bir AJAX isteği olduğunu gösterir.
  28. Server: Yanıt başlığı olarak kullanılır ve sunucunun türünü belirtir.
    Örneğin; “Server: Apache/2.4.41 (Unix)” ifadesi, sunucunun bir Apache sunucusu olduğunu ve Unix işletim sistemini kullandığını gösterir.
  29. Set-Cookie: Yanıt başlığı olarak kullanılır ve tarayıcıda bir çerez oluşturur.
    Örneğin; “Set-Cookie: name=value; Expires=Fri, 01 Jan 2022 00:00:00 GMT; Path=/” ifadesi, tarayıcıda “name=value” çerezi oluşturur ve 1 Ocak 2022 tarihine kadar geçerli olur.
  30. Transfer-Encoding: Yanıt başlığı olarak kullanılır ve yanıtta kullanılan veri aktarım kodlamasını belirtir. Örneğin; “Transfer-Encoding: chunked” ifadesi, yanıtta veri parçaları halinde gönderildiğini gösterir.
  31. Vary: Yanıt başlığı olarak kullanılır ve sunucunun hangi istek öğelerine göre yanıtı önbelleklediğini belirtir. Örneğin; “Vary: Accept-Encoding” ifadesi, sunucunun istekteki “Accept-Encoding” öğesine göre yanıtı önbelleklediğini gösterir.
  32. WWW-Authenticate: Yanıt başlığı olarak kullanılır ve kimlik doğrulama bilgilerini talep eden bir isteğe yanıt olarak kullanılır.
    Örneğin; “WWW-Authenticate: Basic realm=”Protected Area”” ifadesi, isteğin “Basic” kimlik doğrulama türünü kullanarak “Protected Area” alanına erişmeye çalıştığını gösterir.

Python API Kullanım Örneği

Bugün bu mevcut bu teknolojik çözümü REST servis mimarisi ile Python üzerinde; MsSQL ile iletişime geçecek şekilde deneyimlemeye çalışacağız.

Dilerseniz hızlıca göz atmaya başlayalım.

Öncelikle bir veri kaynağı sağlayıcısı bulmamız gerekmektedir.
Bunun için yüzlerce öneri mevcut, fakat biz tercihimizi popüler olan ve belki sonrasında ara zamanlarınızda kullanabileceğiniz The MovieDB üzerinde kullanalım.
*The Movie DB=Film ve dizi bilgi portalıdır.

Bu kaynak üzerindeki veriler için API kullanımı adına bir ön üyelik gerekmektedir.
Ön üyeliğin ardından ise ilgili platform kullanıcınıza yönelik bir API Key oluşturup; bu API Key’i kullanarak çeşitli verilere ulaşmanızı sağlamaktadır.
İlgili API Key bilgisine ulaşmak için, profil alanındaki Settings (Ayarlar) kısmında yer alan;

python api mssql the moviedb settings

API sekmesinden ilgili veri edinimi adına kullanıcınıza yönelik oluşturulmuş API Key (API Anahtarı) bilgisine ulaşabilirsiniz.

python api mssql the moviedb settings create api key

Python ile API entegrasyonu yapmak için öncelikle bir API sözleşmesi oluşturmanız gerekir.
Bu; API’nin istekleri ve cevap verme şekillerini belirleyecek ortak bir protokoldür.

Sonra, özel olarak Python için bir RESTful API’ye bağlanmak istiyorsanız, Python ile RESTful API’ler entegre etmek için kullanabileceğiniz birkaç kütüphane bulunmaktadır.
Bunlar arasında;

  • Requests, 
  • Requests-OAuthlib, 
  • urllib, 
  • aiohttp 

ve daha pek çok seçenek mevcut.
Ek kod dökümlü liste için lütfen tıklayınız…

Dilerseniz hızlıca analizimizi gerçekleştirmek için adımlarımızı uygulamaya başlayalım.

1-Gerçekleştireceğimiz analizler için kullanacağımız kütüphanelerimizi projemize dahil edelim;
(Requests, Pyodbc)
*Requests=API erişim ve çözümleme işlemleri için kullanılacaktır.
*Pyodbc=MsSQL hizmetine 
erişim ve çözümleme işlemleri için kullanılacaktır. 

import requests
import pyodbc
python api usage requests pyodbc library import

NOT:İlgili kütüphaneler yerel makinanızda bulunmuyor ise;

Ya da Komut Satırı (Command Prompt) üzerinden;

py -m pip install ilgili_kutuphane

işlemini gerçekleştirerek yüklemede bulunabilirsiniz.
*İlgili çalışma dizinini belirlemeniz gerekmektedir.

2-Çalışmamıza ilgili verilerimizi dahil edelim ve önizleme gerçekleştirelim;

Bunun için edinmiş olduğumuz API-Key değeri ve istek iskeletimizin kurgusu gerekmektedir. 
The Movie DB üzerinden talep edeceğimiz verileri Popüler Film bilgileri olarak seçelim ve istekte bulunalım.
Dilerseniz farklı formatlar da kurgulayabilirsiniz; ilgili bağlantı için lütfen tıklayınız…

API_KEY = "The Movie DB üzerinden edindiğiniz key."

response = requests.get(
                        "https://api.themoviedb.org/3/movie/popular",
                        params={"api_key": API_KEY}
                        )

Kodumuzu çalıştırıp, yanıt bilgisini yazdırdığımızda;

print(response.content)
python api usage the movie db data
python api usage the movie db data detail

Çıktının ilk satırında görüldüğü gibi ilgili değerler 1.sayfaya yönelik verilmektedir.
2.sayfa ya da dinamik sayfalama için kodumuzu parametrik olarak düzenlememiz gerekmektedir.
İlgilli kodumuzu düzenlediğimizde;
*2.sayfa için, dinamik düzenleme döngü ile sağlanacaktır.

page=2
response = requests.get(
                        "https://api.themoviedb.org/3/movie/popular",
                        params={
                                "api_key": API_KEY,
                                "page": page
                               }
                        )

Çalıştırıp, yanıt bilgisini yazdırdığımızda ise;

python api usage the movie db data new detail

şeklinde görüntülemede bulunmaktayız.

3-İlgili API veri kümemizi dinamik olarak kullanılacak şekilde genişletelim;
*Dinamik olarak sayfaları arttırıp bilgileri edinmeye çalışalım.
Mevcut kodumuzu ise parametrik şekilde bu yapıya göre düzenleyelim;

page = 1
while True:
    response = requests.get(
                            "https://api.themoviedb.org/3/movie/popular",
                            params={
                                    "api_key": API_KEY,
                                    "page": page
                                   }
                            )
    movies_data = response.json()["results"]
    print(movies_data)
    page += 1

Kaç sayfalık bir çıktı edineceğimizi ise basitçe kontrol edelim;
*Kaç sayfalık çıktı edinebileceğimizi.

    print("**********************")
    print("**********************Sayfa: ",page)
    print("**********************")

Şimdi ise kodumuzu çalıştıralım;

python api usage the movie db max data response

maksimum 500 sayfalık bir bilgi edinebilmekteyiz.
Peki doğrudan ilgili sayfalama değerini 500’den başlatırsak bir çözüm elde edebilir miyiz;

python api usage the movie db max data error response

bariz bir şekilde “Hayır” cevabını almaktayız.
O zaman burada bir limitasyon mevcut, sadece ilk 500 sayfa.

4-Kullanmak istediğimiz bilgileri ayıklamaya başlayalım;
Burada geri dönen response değeri içerisinden; yani,

movies_data = response.json()["results"]

parametresinden for döngüsü ile dinamik bir şekilde bilgileri edinmeye çalışalım.
Peki; mevcut kodumuzu ise bu yapıya göre tekrar düzenleyelim;
*Kontrol amaçlı olduğu için sayfa değerimizi page=490’dan başlatalım.

page = 490
while True:
    response = requests.get(
                            "https://api.themoviedb.org/3/movie/popular",
                            params={
                                    "api_key": API_KEY,
                                    "page": page
                                   }
                            )     
    movies_data = response.json()["results"]
    for movie_data in movies_data 
     print("********************")   
     print("********************")
     print("********************")
     print(movie_data["title"])
     print(movie_data["release_date"])
     print(movie_data["overview"])
    page += 1

Kodumuzu çalıştırdığımızda ise;

python api usage the movie db response data cleaning

beklemiş olduğumuz gibi ilgili verilere ulaşabildiğimizi görüntülemekteyiz.

5-Kullanmak istediğimiz bilgileri biraz daha genişletelim;
Görsel uzantısı ve IMDB tekil sayfa ID değerini alalım.
Bunun için The Movie DB API dokümantasyonlarına tekrar göz atmamız gerekmektedir.
Dilerseniz ek bilgileri de dahil edebilirsiniz.
İlgili bağlantı için lütfen tıklaynız… 

Kod bloğumuza ise;

image_response = requests.get(
      f"https://api.themoviedb.org/3/movie/{movie_data['id']}/images",
      params={"api_key": API_KEY}
  )
image_path = image_response.json()["posters"][0]["file_path"]
image_url = f"https://image.tmdb.org/t/p/w500{image_path}"

görsel bilgisi için, imdb sayfa erişimi için ise;

imdb_response = requests.get(
     f"https://api.themoviedb.org/3/movie/{movie_data['id']}/external_ids",
      params={"api_key": API_KEY}
  )
imdb_id = imdb_response.json()["imdb_id"]

IMDB ID değerini dahil etmekteyiz.
İlgili düzenleme ile mevcut güncel kod bloğumuz;

import requests
API_KEY = "The Movie DB üzerinden edindiğiniz key."
page = 498
while True:
    response = requests.get(
                            "https://api.themoviedb.org/3/movie/popular",
                            params={
                                    "api_key": API_KEY,
                                    "page": page
                                   }
                            )
    movies_data = response.json()["results"]
    for movie_data in movies_data:
     image_response = requests.get(
         f"https://api.themoviedb.org/3/movie/{movie_data['id']}/images",
         params={"api_key": API_KEY}
     )
     image_path = image_response.json()["posters"][0]["file_path"]
     image_url = f"https://image.tmdb.org/t/p/w500{image_path}"
     imdb_response = requests.get(
         f"https://api.themoviedb.org/3/movie/{movie_data['id']}/external_ids",
         params={"api_key": API_KEY}
     )
     imdb_id = imdb_response.json()["imdb_id"]
     print("********************")   
     print("********************")
     print("********************")
     print(movie_data["title"])
     print(movie_data["release_date"])
     print(movie_data["overview"])
     print(image_url)
     print(imdb_id)
     
    page += 1

şekline dönüşmüş oldu.
Çalıştırdığımızda ise; 

python api usage the movie db response data proccessing image url imdb id

yeni eklediğimiz parametrelerede ulaşabiliyor olduğumuz görüntülemektedir.
Test ettiğimizde ise, görsel bağlantısı;
Çıktıdaki görsel bağlantısı: https://image.tmdb.org/t/p/w500/v6Ty2nvINucq05j2Yt5eNemzJVY.jpg
Çıktıdaki IMDB ID: tt0096842

python api usage the movie db response data proccessing image url test

IMDB ID bağlantısı;

python api usage the movie db response data proccessing imdb id test

şeklinde görüntülenmektedir.
Peki buraya kadar ki kısımda bir API üzerinden belirli verileri elde edebilmekte olduğumuzu gördük.
Elbetteki sonuç odaklı kullanım adına bu bilgileri bir kaynağa yazmak işimize yarayabilir.
Bunun için MsSQL üzerine bir veri aktarımında bulunalım.
Aktaracağımız parametreler ise;

  • Title (Başlık):İlgili filmin başlığı/adı. 
  • Release Date (Yayın Tarihi):İlgili filmin yayın tarihi/vizyon tarihi.
  • Overview (Genel Bakış):İlgili filmin özeti/konusu.
  • Image URL (Görsel Bağlantısı):İlgili filmin kapak görseli.
  • IMDB ID (IMDB NO vb.):İlgili filmin IMDB film no’su.

olarak belirleyelim.
Önceki yazılarımızda kullanmış olduğumuz kod bloklarını, mevcut (ilgili) kod bloğumuza uyarlayalım.
Bağlantı ve erişim için;  

server = 'server' 
#PORT:1433
database = 'database' 
username = 'username' 
password = 'password' 
cnxn = pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server};SERVER='+server+';DATABASE='+database+';UID='+username+';PWD='+ password)
cursor = cnxn.cursor()

ilgili bilgilerin MsSQL üzerine aktarılması için ise;

cursor.execute(
            "INSERT INTO MovieDetail (title, release_date, overview, image_url, imdb_id) VALUES (?, ?, ?, ?, ?)",
            (movie_data["title"], movie_data["release_date"], movie_data["overview"], image_url, imdb_id)
        )
    cnxn.commit()

şeklinde kullanımda bulunalım.
Son olarak MsSQL üzerindeki aktarımda bulunulacak ilgili tablo ise;

USE [TheMovieDB]
GO
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[MovieDetail](
	[title] [nvarchar](250) NULL,
	[release_date] [nvarchar](50) NULL,
	[overview] [nvarchar](max) NULL,
	[image_url] [nvarchar](max) NULL,
	[imdb_id] [nvarchar](25) NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO

formatında kullanılacaktır.
Güncel son kod bloğumuz ise;

import requests
import pyodbc

API_KEY = "The Movie DB üzerinden edindiginiz key."
server = 'server' #PORT:1433 database = 'database' username = 'username' password = 'password' cnxn = pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server};SERVER='+server+';DATABASE='+database+';UID='+username+';PWD='+ password) cursor = cnxn.cursor() page = 1 while True: response = requests.get( "https://api.themoviedb.org/3/movie/popular", params={"api_key": API_KEY, "page": page} ) movies_data = response.json()["results"] if not movies_data or page==500: break for movie_data in movies_data: image_response = requests.get( f"https://api.themoviedb.org/3/movie/{movie_data['id']}/images", params={"api_key": API_KEY} ) image_path = image_response.json()["posters"][0]["file_path"] image_url = f"https://image.tmdb.org/t/p/w500{image_path}" imdb_response = requests.get( f"https://api.themoviedb.org/3/movie/{movie_data['id']}/external_ids", params={"api_key": API_KEY} ) imdb_id = imdb_response.json()["imdb_id"] cursor.execute( "INSERT INTO MovieDetail (title, release_date, overview, image_url, imdb_id) VALUES (?, ?, ?, ?, ?)", (movie_data["title"], movie_data["release_date"], movie_data["overview"], image_url, imdb_id) ) cnxn.commit() page += 1 cursor.close() cnxn.close()

şeklinde olacaktır.
Veri gelmemesi ya da Page=500 olması durumunda hata vermeden kapanması/durması için;

    if not movies_data or page==500:
        break

eklemesinde bulunduk.
İlgili kodumuzu çalıştırdığımızda ise;

python api usage the movie db response data save end proccess

çıktısı ve;

python api usage the movie db response data save mssql db table

görüntüsü elde etmekteyiz.

Peki birazda raporlama ve görüntülemede bulunalım.
Hızlıca Power BI’a başvurarak ilgili bilgilerimizi raporlaştıralım.
*Görsel amaçlı olarak.

İlgili verilerimizi raporlama alanına aktarıp hızlıca ufak düzenlemelerde bulunduğumuzda;
*Hızlı ve kolay kullanım içerdiği için tercih edildi.

python the movie db data report sample
python the movie db data report detail movie sample
python the movie db data report detail movie cover sample
python the movie db data report selected sample

görünümlerini elde etmekteyiz.
İlgili rapor dosyasına erişmek için lütfen tıklayınız…

Burda gerçekleştirilmiş çalışmada;

tamemen kendi tercihlerinize yönelik modellenebilir.
Genel olarak Python üzerinde bir API erişimi ve erişim sonrası dönen bilgilerin kullanımına yönelik basit bir seviyede çözümlemede bulunulmaya çalışılmıştır.

İlgili kod dökümü için lütfen tıklayınız…

Gelecek yazılarda görüşmek üzere.

İyi çalışmalar… 

, ,

İlgili Yazılar