Hafta 8 - Grup Çalışması Egzersizleri
İnternetten Veri Kazıma
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:
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!