Başlangıç Kodları

Buraya tıklayarak bu haftaya ait çalışmaların başlangıç kodlarına ulaşabilirsiniz.

Ön Bilgi

Günlük hayatta olduğu gibi internetteki iletişimin de kuralları var. Web tarayıcımız ile web server’u arasında iletişim kurmamızı sağlayan kural ve metodları protokol olarak adlandırıyoruz. Bu haftaki egzersizimizde HTTP Protokolüne ait metodları kullanacağız. Meraklısı buradaki gibi bir kaynaktan daha fazla bilgi edinebilir.

HTTP (Hyper Text Transfer Protocol)’de en çok kullandığımız metodlar şöyle:

HTTP Metodları Açıklamaları Örnek
GET Get metodu ile bir sorgu gerçekleştirebilir ve sonucunu sunucudan elde edilebilir. Arama, Belge indirme
HEAD Head GET ile aynı işlemi yapar ancak yanıtta gövdeyi istemez. -
POST Post ile sunucuya veri veya bir komut gönderebiliriz, genellikle sunucuda bir durum değişikliği yaratır. Sitenizdeki bir veriyi güncellemek, medya aktarmak
DELETE Mesajda belirtilen kaynağı siler. Gönderi silmek, kaldırmak

Diğer HTTP metodlarına bu siteden bakabilirsiniz.

Ön Hazırlık

Python requests kütüphanesi

Bu haftaki egzersizlerimiz için requests kütüphanesini ve BeautifulSoup kullanacağız, onun için `terminale aşağıdaki komutu yazarak requests ve BeautifulSoup kütüphanelerini indirin:

python -m pip install requests
python -m pip install beautifulsoup4

Başlamadan Önce

Bir websitesine sorgu yapmak için requests kütüphanesinin request isimli fonksiyonunu kullanabiliriz. Buradaki headers, ikinci egzersizimizde önemli olacak. Örneğin:

requests.request('GET', URL, headers=detaylar)

kullanarak belirtilen URL adresine gerekli detayları içeren (API anahtarı gibi) bir GET isteği gönderebiliriz. Denemek için

response=requests.request("GET", "https://cs101-merhabadunya.github.io/hakkimizda")

Aldığımız cevabı (response) inceleyelim:

  • Cevabın statüsü response.status_code
    Eğer 200 ise sorgumuz başarıyla gerçekleştirildiği, 403 ise sağladığınız API anahtarında bir hata olduğu anlamına gelir. 403 cevabı aldığınızda api anahtarınızı kontrol kedin.
  • Sorgumuzun microsaniye cinsinden ne kadar sürede cevaplandığı: response.elapsed
  • Sorgumuzda kullanılan url: response.url
  • Cevapta bize iletilen text (yazı): response.text

Cevabı aldıktan sonra, BeautifulSoup kütüphanesinin kendi fonksiyonlarını kullanarak websitesinin istediğiniz kısmındaki bilgilere ulaşabilirsiniz. class-adi olan yere istediğiniz class’ı yazıp oradaki bilgiyi alabilirsiniz.

soup = BeautifulSoup(response.content, "html.parser")
aradigimiz_yer = soup.find("div", attrs={"class":"class_adi"})
yazi = aradigimiz_yer.text

Tarayıcımızda bir internet sayfasına girdiğimizde sağ tıklayıp “İncele” (Inspect) seçeneğine bastığımızda sayfanın html koduna ulaşabiliyoruz. Sayfanın html koduna ulaştıktan sonra da açılan pencerede (genelde kutunun üzerinde bir mouse imleci olarak gözükür) incelenecek bir element seç butonuna basıyoruz. Bu butona bastıktan sonra anlık kurun üzerine gelip tıkladığımızda bize onun html kodundaki yerini gösterecektir. Buradaki class, id gibi özellikleri kullanarak BeautifulSoup’da kolay filtreleme yapabiliriz. Aşağıdaki ekran görüntüsünde bir örneğini görebilirsiniz: Chrome'da html kodu inceleme

Egzersiz 1

Bu egzersizimizde grafikler ile veri kazımasını birleştirip basit bir habre bülteni yapacağız. Güncel haber başlıklarını alabilmek için bbc.com/turkce sitesini kullanacağız.

Haber Başlıkları

Gelin ilk aşamada haber_basliklarini_al() fonksiyonumuzu yazalım. haber_basliklarini_al() fonksiyonu önce size başlangıç kodunda verilen ANA_URL değişkeninden urline ulaşabileceğiniz BBC Türkçe sayfasının tüm HTML içeriğini requests kütüphanesinin get methodu ile almalı. Daha sonra BeautifulSoup kullanarak elde ettiğimiz HTML içeriğindeki “a” tagli ve class özelliği size verilen başlangıç kodundaki CLASS değişkeninin değerine eşit olan tüm HTML elemanlarını bulmalı. Bu elemanların içerisinde bulunan textleri alarak haber_basliklari() listesine eklemeli ve listeyi return etmeli.

İkinci aşamadaysa, elde ettiğimiz haber başlıklarını kullanarak grafik kütüphanesinin de yardımıyla basit bir gündem takip programı yazacağız. Haber başlıklarını birer birer kanvasta gösterelim. Kullanıcı her kanvasa tıkladığında bir sonraki haber başlığına geçelim.

Egzersiz 2

CS 101’in son ekip toplantısında anıları yad eden ekibe Gül Sena program için aklına gelen ilk ismi açıklar: Diyar Diyar Python. Evde oturmaktan çok sıkılan Rıdvan keşke karantina bitse de eskisi gibi seyahat edebilsek diye üzülür. İrem ve Yekta evden çıkmadan ve sosyal mesafelerini koruyarak seyahat edebilecekleri bir oyun düşünürler: Diyar Diyar Hava Durumu

Bu egzersizimizde OpenWeatherMap’in geliştiriciler için sağladığı API’yi kullanarak şu sorulara cevap bulacağız:

Ön hazırlık

API anahtarı oluşturalım

API kullandığımızda çoğunlukla servislerini kullanacağımız siteden bir anahtar üretmemiz gerekir. Bu anahtarı site ile tüm iletişimimizde (istek atmak, bilgi edinmek, vb.) kullanırız ve bu sayede site bizim yaptığımız işlemlerin takibini tutabilir. Aynı zamanda site bizim apiyi kullanma miktarımızı ticari ve yasal sebeplerle sınırlayabilir. Bir API kullanırken sitenin kullanım koşullarını dikkatle incelememiz önemli!

Bu sebeple, önce OpenWeatherMap’in geliştiriciler için hazırladığı siteye girerek anahtar edineceğiz. Bu siteden bir hesap oluşturun, e-mail adresinize gelen e-mailden hesabınızı onaylayın. Siber Güvenlik Atölyesi’nde gördüğünüz üzere güçlü bir şifre seçmeyi unutmayın! Karşınıza ne amaçla bu siteyi kullanacağınız çıktığında Company kısmına CS 101 yazıp Purpose için de “Science & Education” kategorisini seçebilirsiniz. Bu adresten API anahtarınızı görüntüleyebilirsiniz, eğer API anahtarınız yoksa “Create key” kısmından yeni bir anahtar üretebilirsiniz. API anahtarınızı kopyalayın ve kodlarda API_ANAHTARI isimli değişkende SIZIN_ANAHTARINIZ yazan değerin yerine yapıştırın. Anahtarınız aylık maksimum 1.000.000 çağrı yapmanıza izin veriyor.

OpenWeatherMap API’si Dokümantasyonu

OpenWeatherMap API’sinin dokümantasyonuna buradan ulaşabilirsiniz. Fark ettiyseniz OpenWeatherMap API’si ile kullanabildiğimiz tek HTTP metodu GET bu demek oluyor ki bu API ile sadece bilgi isteyebiliriz ve sunucuda değişiklik yapamayız.

Görevler

Burada sorgudan gelen cevapların formatı api’ye bağlıdır. Bu sebeple size verdiğimiz open_weather_sorgusu_cevabi fonksiyonunu kulanabilirsiniz, bu fonksiyon cevabı bir dictionary olarak döndürür. Bu fonksiyondan aldığınız değeri konsola yazdırarak dictionary’nin formatı, anahtarları ve içerdiği değerlerle ilgili daha çok bilgi edinebilir ya da dönen cevabın formatını OpenWeatherMap’in Dokümantasyonundaki örneklerden de inceleyebilirsiniz.

Not: Uzun dictionary’leri yazdırmak zor olabildiği için başlangıç kodlarında sozluk_yazdir isimli bir fonksiyon yazdık. Bu fonksiyonu incelerseniz Not: longitude: boylam, latitude: enlem

Samsun

1. API’a şüpheyle yaklaşan Mustafa Samsun’un hava durumunu bulup bulamayacağımızı merak eder. Ozan, Mustafa’ya bu konuda yardım etmek için ‘GET’ kullanarak API_BAZ_URL olarak verilen url’ye “/weather?q=SEHIR_ISMI” stringini ekleyerek request oluşturmalıyız. open_weather_sorgusu_cevabi fonksiyonunu kulanabilirsiniz.

Örnek Çıktı:

coord:   lon:   36.3333
  lat:   41.25
weather: [{'id': 803, 'main': 'Clouds', 'description': 'parçalı bulutlu', 'icon': '04n'}]
base: stations
main:   temp:   9
  feels_like:   9
  temp_min:   9
  temp_max:   9
  pressure:   1022
  humidity:   87
visibility: 10000
wind:   speed:   0.51
  deg:   0
clouds:   all:   75
dt: 1618273672
sys:   type:   1
  id:   7017
  country:   TR
  sunrise:   1618282692
  sunset:   1618330304
timezone: 10800
id: 740263
name: Samsun
cod: 200

Şehirler

2. Gül Sena daha detaylı sorgular yapmak için Ahmet’ten tüm şehirler için enlem ve boylam bilgisini tutmasını rica eder. Dictionary’lerle uğraşması gereken Ahmet, 7. dersi anlatan Ege’den yardım ister. Ege sehirler listesindeki her şehir için bir istek atıp gelen sonuçları {sehir_1: [enlem, boylam], sehir_2: [enlem, boylam], …} şeklinde bir dictionary’de tutmasını önerir. Bu görev için de 1. görevdeki gibi “/weather?q=SEHIR_ISMI” sorgusunu kullanabilirsiniz.

Örnek Çıktı:

antalya: [30.7178, 36.7741]
artvin: [41.8333, 41.1667]
balikesir: [28, 39.75]
diyarbakır: [40.2189, 37.9158]
eskişehir: [30.5206, 39.7767]
istanbul: [28.9833, 41.0351]
izmir: [27.0923, 38.4622]
kırklareli: [27.2252, 41.7351]
samsun: [36.3333, 41.25]

Antep

3. Listede ‘Antep’in olmadığını fark eden Ege, Oya’ya sürpriz yapmak için Antep’i de dictionary’ye eklemek ister ancak bir hata ile karşılaşır. Ege’ye yardım etmek için Antep’i 1. görevdeki gibi sorgulayın, aldığınız hatayı konsola yazdırarak inceleyin.

Örnek Çıktı:

cod: 404
message: city not found

4. Oya’dan daha önce mektup alan Demet zarfın üzerindeki posta kodunu hatırlar. Ege ve Demet’e "weather?zip=POSTA_KODU,tr" sorgusunu ve başlangıç kodlarında verilen POSTA değişkenini posta kodu olarak kullanarak Antep’in bir bölgesinin enlem ve boylamlarını bulalım ve Ozan’ın oluşturduğu sözlüğe ekleyelim.

Örnek Çıktı:

İncesu: (37.2939 , 37.1793)

5. Arda, Necla’dan şimdiye kadar buldukları şehirlerin merkez koordinatlarını tahmin etmesini ister. Lisedeki coğrafya bilgilerinden bir şeyler hatırlasa da Arda’nın doğru cevabı bulmasına yardımcı olalım.
İpucu: Burada bulduğumuz şehirleri saran en büyük dikdörtgenin koordinatlarını bulup orta noktasını verebiliriz.

Örnek Çıktı:

Orta nokta: (39.255, 34.463)

CS 101 büyüyor…

6. CS 101’in gelecek dönemi için şehir seçme işi İdil ve Eren’e düşmüştür. Açık havada kod yazmayı seven Eren, hava durumu açık olan şehirlerle, İdil ise sıcaklığı (temp) ile hissedilen sıcaklığının (feels_like) 5C’yi açmayan şehirlerle iletişime geçmek ister. Başak kriterleri garip bulsa da CS 101’de herkese yer olduğu için neden olmasın :).
Hava durumunu kontrol etmek için

Örnek Çıktı:

Eren ve İdil'in beraber kabul ettikleri şehirler:  {'Sincik'}

Not: 6. aşamadaki koordinatlar CS 101’in daha ulaşamadığı bazı şehirlerin birbirinden güzel doğal ve tarihi zenginliklerini temsil ediyor. Merak ederseniz kendiniz de bu yerlere haritadan bakabilirsiniz.

Gezmeyi, dışarıda yürümeyi, arkadaşlarının ne dediğini maskesiz duymayu özleyenler yalnız değilsiniz. Görüşmek üzere!