AFAD'ın (Afet ve Acil Durum Yönetimi Başkanlığı) web sitesinde son depremleri gösteren bir tablo bulunur. Bu derste bu tabloyu düzenli aralıklarla okuyup, yalnızca yeni depremleri (ve isterseniz belirli bir büyüklüğün üzerindekileri) bildiren bir bot yazacağız.
Tabloyu Bulmak ve Satırlarını Almak
import requests
from bs4 import BeautifulSoup
sayfa = requests.get("https://deprem.afad.gov.tr/last-earthquakes.html")
html = BeautifulSoup(sayfa.content, "html.parser")
tablo = html.find("table")
satirlar = tablo.find_all("tr")[1:11] # son 10 deprem (başlık satırını atla)
find_all("tr"), tablodaki tüm satırları (<tr> etiketlerini) bir liste olarak döndürür. [1:11], ilk satırı (genelde başlık satırıdır) atlayıp sonraki 10 satırı alır.
Her Satırdan Veriyi Çekmek
for satir in satirlar:
kolonlar = satir.find_all("td")
tarih = kolonlar[0].get_text()
buyukluk = kolonlar[5].get_text()
yer = kolonlar[6].get_text()
print(f"{tarih} - {yer} - Büyüklük: {buyukluk}")
Her satırdaki hücre (<td>) sayısı ve sırası, kaynak sitenin tablo yapısına göre değişir — hangi indeksin hangi bilgiyi taşıdığını tarayıcının İncele aracıyla kontrol ederek belirlemeniz gerekir.
Aynı Depremi Tekrar Tekrar Bildirmemek
Bot her birkaç saniyede bir tabloyu yeniden okuduğu için, aynı deprem birden fazla kez görünür ve tekrar tekrar bildirim gönderebilir. Bunu önlemek için, daha önce bildirdiğiniz depremlerin bir kimliğini (ör. tarih+yer birleşimini) bir kümede (set) tutabilirsiniz:
bildirilenler = set()
def kontrol_et():
for satir in satirlar:
kolonlar = satir.find_all("td")
deprem_id = kolonlar[0].get_text() + kolonlar[6].get_text()
if deprem_id in bildirilenler:
continue
bildirilenler.add(deprem_id)
mesaj_gonder(f"Yeni deprem: {kolonlar[6].get_text()}")
continue, döngüde o an işlenen elemanı atlayıp bir sonrakine geçer — burada daha önce görülmüş bir depremi tekrar bildirmeden atlamak için kullanılır.
Büyüklüğe Göre Filtrelemek
Küçük depremlerin çok sık olması nedeniyle, yalnızca belirli bir büyüklüğün üzerindekileri bildirmek isteyebilirsiniz:
BUYUKLUK_ESIGI = 4.0
buyukluk_degeri = float(kolonlar[5].get_text())
if buyukluk_degeri >= BUYUKLUK_ESIGI:
mesaj_gonder(f"Büyük deprem: {kolonlar[6].get_text()} - {buyukluk_degeri}")
Sırada Ne Var?
Sırada, aynı "yeni veri geldiğinde bildir" mantığını bir haber sitesinin RSS akışı üzerinde uygulayacağız.