Python ile Veri Kazıyarak Basit Emlak Botu Yapmak

Mert TOSUN
3 min readJan 25, 2021

--

Merhaba, ilk yazımda Web Scraping işlemleri ile basit bir emlak botu yapmayı göstereceğim. Sahibinden üzerindeki ilanlara erişip daire fiyatlarını görmek istediğimiz bir senaryoyu gerçekleştirelim. Bu işlemler için Python kütüphanelerinden Requests ve BeautifulSoup4 modüllerini kullanacağız. Kütüphanelere sahip değilseniz buradan kurulum adımlarını görebilirsiniz. IDE olarak ise PyCharm’ı kullanacağız.

BeautifulSoup4 ile Sahibinden.com Daire Kategorisi Altındaki Linklerin Toplanması

1- Gerekli kütüphanelerin import edilmesi

import requests
from bs4 import BeautifulSoup

2- Requests ile kaynağa bağlanma ve içeriği görme

parametre = {"User-Agent":"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36"} #User-Agent tanımının yapılması
url = "https://www.sahibinden.com/satilik-daire/" #Bağlanılacak URL
r = requests.get(url,headers = parametre) #Requests modülü ile sayfa kaynağına bağlanma.
soup = BeautifulSoup(r.text,"lxml") #BeautifulSoup modülü ile parçalama işlemlerinin gerçekleştirilmesi

Parametre değişkeni ile User Agent tanımını gerçekleştirdik. Url değişkenimize görmek istediğimiz sayfa kaynağını tanıtıyoruz. requests.get ile R değişkenine sayfa kaynağını tanıttık. Artık bağlantımız hazır! Şimdi soup değişkenimize içeriğin content’ini verelim. Ben parse işlemleri için LXML’i kullandım. Dilerseniz farklı bir metod kullanabilirsiniz.

3- İçeriği BeautifulSoup ile parçalamak

liste = soup.find("table",{"id":"searchResultsTable"}).find("tbody").find_all("tr",{"class":"searchResultsItem"})[0]

Liste isimli bir değişken oluşturup, BeautifulSoup içine verdiğimiz content’i parçalamaya başladık.

İlanlar, “searchResultsTable” id değerine sahip bir table içinde tutulmakta. Dolayısıyla ilk olarak soup’a bu kısmı verdik.

find("tbody").find_all("tr",{"class":"searchResultsItem"})[0]

“searchResultsTable” altında bulunan “tbody” etiketine erişmek için find metodunu kullanıyoruz, ardından tüm ilanlar “tr” etiketiyle bir liste altında tutulduğu için find_all metodunu kullandık. Peki “tr” etiketlerini neye göre ayırt edeceğiz? Birden çok “tr” etiketi varsa ne yapmalıyız? İşte bunu için {“class”:”searchResultsItem”}) parametresini kullandık. Bu sayede class’ı searchResultsItem olan tr etiketlerine ulaşmış oluyoruz. Tebrikler artık tüm liste elimizde! Artık yapmamız gereken, istediğimiz değerleri ekrana vermek.

4- Sıra geldi değerlerimizi görmeye :)

Öncelikle her değeri görmek için for döngüsü içerisinde işlemleri yapacağız. Şu an ilan listemizin içinde bir indexteyiz. Her bir index’i dolaşıp sonuç döndürmek için işlemleri for döngüsü içerisinde gerçekleştireceğiz.

for list in liste:
baslik = list.find("a",{"class":"classifiedTitle"}).text.strip().upper()
metrekare = list.find("td",{"class":"searchResultsAttributeValue"}).text.strip()
fiyat = list.find("td",{"class":"searchResultsPriceValue"}).text.strip()

konum = list.find("td",{"class":"searchResultsLocationValue"}).text.strip()

print("{}. ilan detayı".format(sayac))
print("İlan Başlığı:{}\nDaire Metrekaresi: {}\nOda Sayısı:{}\nİlan Konumu: {}".
format(baslik,metrekare,fiyat,konum))
print("*"*30)

Şimdi dikkatlice inceleyelim;

  • İlanın başlığını görebilmek “class” değeri “classifiedTitle” olan a etiketini seçtik. Farkındaysanız açıklama bir link içinde. Dolayısıyla .text diyerek text değerini elde ettik.
  • İlanın metrekare cinsinden büyüklüğünü görebilmek “class” değeri “searchResultsAttributeValue” olan a etiketini seçtik. Text işlemini gerçekletirip, strip() fonksiyonu ile çıktımızı güzel bir hale getirdik.
  • Fiyatı görmek için “class” değeri “searchResultsPriceValue olan a etiketine eriştik.
  • Son olarak ilanımızın konumunu da görelim:
konum = list.find("td",{"class":"searchResultsLocationValue"}).text.strip()

Print ile değerlerimizi ekrana basalım.

print("İlan Başlığı:{}\nDaire Metrekaresi: {}\nOda Sayısı:{}\nİlan Fiyatı:{}\nİlan Tarihi:{} {}\nİlan Konumu: {}".
format(baslik,metrekare,oda_sayisi,fiyat,tarih_gun,tarih_yil,konum))
print("*"*30)

Ben format() metodu ile değerleri ekrana yazdırmayı tercih ettim. Python’ın güncel sürümüne sahipseniz f’String ile aynı işlemi yapabilirsiniz. İlanlar arasında boşluk bırakmak ve görüntüyü güzelleştirmek için yıldız (*) kullanıp, 30 ile çarptım. Dilerseniz artık sonucumuzu görelim. :)

Evet gördüğünüz gibi ilanlarımızı başarıyla görebildik. Farklı süslemeler veya değişkenlerle içeriği zenginleştirmek tamamen size kalmış.

Çalıştığımız kodların tamamı:

import requests
from bs4 import BeautifulSoup

parametre = {"User-Agent":"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36"}
url = "https://www.sahibinden.com/satilik-daire/"
r = requests.get(url,headers = parametre)
soup = BeautifulSoup(r.text,"lxml")


liste = soup.find("table",{"id":"searchResultsTable"}).find("tbody").find_all("tr",{"class":"searchResultsItem"})[0]

for list in liste:
baslik = list.find("a",{"class":"classifiedTitle"}).text.strip().upper()
metrekare = list.find("td",{"class":"searchResultsAttributeValue"}).text.strip()
fiyat = list.find("td",{"class":"searchResultsPriceValue"}).text.strip()
konum = list.find("td",{"class":"searchResultsLocationValue"}).text.strip()

print("İlan Başlığı:{}\nDaire Metrekaresi: {}\nİlan Fiyatı:{}\nİlan Konumu: {}".
format(baslik,metrekare,fiyat,konum))
print("*"*30)

Bu yazı da basit bir bot yapmaya çalıştık. İlerleyen süreçlerde projelerimizi geliştirip çok daha işlevsel hale getireceğiz. Okuduğunuz için teşekkür ederim. :)

Beni takip etmek için: https://tr.linkedin.com/in/merttosun61

--

--

Mert TOSUN

Interested in Data Science, Data Governance & Data Quality