Python Web Scraping – II

Python   Bir önceki yazımızda ihtiyacımız olan kütüphanelerden (modüller de diyebiliriz ) bahsetmiştik. Kısaca bu modülleri nasıl yükleyeceğinizden bahsedip direk olarak bir web sitesinden güncel döviz fiyatlarını getireceğimiz basit bir uygulamanın örneği vermek istiyorum.  Öncelikle requests modülünden biraz bahsedelim. Bu modül python ile birlikte standart olarak yüklü gelmediğinden pip3 install requests komutu ile sistemimize yüklüyoruz.  “pip”  komutunun ne işe yaradığını merak edebilirsiniz. PIP, python’daki modüllerini rahatça indirip kurabilmek için hazırlanmış bir paket yöneticisidir. PyPI‘deki modülleri bilgisayarınıza basit bir komut ile rahatça kurmanızı ve kaldırmanızı sağlar.

Neden “pip3” komutunu kullandığıma gelince: Bilgisayarımda hem python 2.x hem de python 3.x versiyonları kurulu olduğundan ve sadece python 3.x versiyonunda requests modülünü yüklemek istediğim için “pip3” komutu ile kurulum yaptım. Sizin geliştirme ortamınıza uygun olan pip komutunu kullanmanızda fayda var.

Şimdi request modülü ile getirdiğimiz web sayfalarını parse etmede kullanacağımız BeatifulSoup modülünü de pip3 install bs4 komutu ile yükleyelim.  Bu işlemi de yaptıktan sonra aşağıdaki kodu istediğimiz herhangi bir editör programı ile yazarak uzantısını .py olacak şekilde bilgisayarımıza kaydedelim.

import requests
from bs4 import BeautifulSoup
try:
    page = requests.get("https://www.doviz.com/")
    soup = BeautifulSoup(page.content, 'html.parser')
    currency = soup.findAll("li", {"data-table-homepage-key" : "USD"})
    for attr in currency:
    	dollar = soup.findAll("div", {"class": "column2-row2"})
    	result = dollar[0].getText() + " " + dollar[3].getText() + " " + dollar[1].getText() + " " + dollar[4].getText()
    	print(result)
except:
   print("Hata olustu")

Requests ve Bs4 modüllerini 1. ve 2. satırlarda yer alan import komutu ile kodumuza ekliyoruz. Programımız çalışırken herhangi bir hata ile karşılaşılması durumunda hata mesajını ekrana yazdırmak için 3., 11. ve 12. satırlarda yer alan “try except” bloğu ile “print” komutunu kullanıyoruz. Request modülünün get fonksiyonuna parametre olarak güncel döviz bilgilerini almak için kullanacağımız sitenin adresini veriyoruz. Get fonksiyonu ile belirttiğimiz web sitesine yaptığımız istek (request) sonucunda gelen yanıt (response) nesnesini page isimli değişkenimize atıyoruz. Yanıt nesnenin içinde yer alan özelliklerden (text, content, encoding, status_code vb.) biz sayfa içeriği ile işlem yapacağımızdan sadece “content” i kullanacağız. Detaylı bilgi için burayı ziyaret edebilirsiniz.

Sonrasında BeatifulSoup fonksiyonuna sayfa içeriğinin yer aldığı “page.content” ‘i birinci parametre olarak veriyoruz. İkinci parametre olarak da “html.parser” ile sayfa içeriğinin “html” formatında olduğunu belirtiyoruz.

Şimdi bir önceki yazımızda belirttiğimiz gibi tercih ettiğiniz herhangi bir tarayıcıya ait Geliştirici Araçları ( Developer Tools ) aracılığıyla veri çekmek istediğimiz web sitesine ait sayfadaki verinin çekileceği alana ait bilgileri elde etmemiz gerekiyor. Tarayıcı olarak Chrome’u tercih  ettiğimden örnekleri buna göre vereceğim. Verileri çekeceğimiz adres chrome sayfasında açıkken F12 tuşu ile chrome developer tools aracını başlatıyoruz. En sol üst köşede yer alan kare içine çapraz yukarı ok ikonu tıklayarak sayfadaki döviz kur karşılığının seçimini yapacağız.

Seçimi yaptığımızda döviz bilgilerinin bulunduğu alanlardan almak istediğimiz bilginin bulunduğu alanı tıklıyoruz. Developer tools penceresinde aşağıdaki şekilde html kodlarının yer aldığı ve seçili kısmın geldiği bir manzara ile karşılaşıyoruz. Bu işlemi sayfadaki bileşen üzerindeyken sağ mouse tuşu menüsünden Inspect(İncele) seçeneği ile de yapabiliriz. Bu durumda Developer Toolsu ayrıca açmaya gerek kalmıyor.

Html yapısını inceleyerek verisini almak istediğimiz bileşenin hangi ayırdedici özelliğini kullanacağımıza karar veriyoruz.  Sonrasında BeatifulSoup modülü ile gelen metodlar içerisinden bize uygun olanını seçerek devam ediyoruz. Ben soup.findAll() metodu ile dolar kur bilgisinin yer aldığı ve “data-table-homepage-key” özelliğinin değeri USD olan list item bileşenini aldım. Daha sonra bu bileşen içerisinde yer alan sütunlardan dolar alış ve satış bilgisinin yer aldığı alanların değerlerini .getText() fonksiyonu ile result değişkenine atarak print fonksiyonu ile aşağıdaki şekilde konsol ekranına yazdırdım. Örneği mümkün olduğunca sade ve kısa tutmaya çalıştım. Yoksa web scraping için farklı senaryolar  için bir çok farklı metodlar ve yöntemler kullanma şansımız var. Beatiful Soup kütüphanesi ile sadece bir bileşen seçimi için bile class adından başka bileşen adı, öznitelikleri , etiketleri, css vb. hatta bileşenin metin (text) değeri gibi

Python Geliştirme ortamı olarak docker alt yapısını kullandığım için çalışan python container’ıma bash ile bağlanarak app.py dosyamı shell’den python executable dosyasına parametre olarak vererek çalıştırdım. Sonuç yukarıda olduğu gibi başarılı olsa da ekonomi anlamında pek de içacıcı değil!  ( Programın sonuç ekran görüntüsü ile döviz.com sayfasının ekran görüntüsü çok yakın aralıklarla alınmasına Dolar alış satış değerleri arasındaki farka dikkat…!)

Sağlıcakla…

Not: 11 Mayıs 2019 tarihinde doviz.com sitesinin sayfa yapısının değiştiğini farkettim. Yukarıdaki örnek yazıyı yazdıgım tarih itibariyle  doviz.com sitesini esas alarak yazılmıstır.

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir