Selenium Nedir?
WEB teknolojileri günümüzde çeşitli alanlarda kullanılmaktadır. Günümüzde bu teknolojilerin güvenliği ve sağlıklı çalışması önemlidir. Bu alanda ise test uygulamaları yapılmaktadır. Selenium, WEB sitelerinin test edilmesi için kullanılan bir açık kaynaklı yazılımdır. Farklı senaryolar test edilebilir ve bu test sonuçlarına göre WEB siteleri iyileştirilmektedir.
Python desteği olan Selenium; çeşitli tarayıcı özelliklerine göre WEB siteleri üzerinde bir kullanıcı gibi işlem yapmanıza olanak sağlamaktadır. Bir internet sitesi üzerinde gerçekleştirilen metin yazma, buton tıklama vb. işlemler gerçekleştirilebilir. Bu işlemler için WEB sayfasının HTML sayfalarının kod yapısı incelenmektedir ve işlem yapılmaktadır. Ayrıca WEB siteleri için otomasyon da geliştirebilirsiniz. Bir HTML elementinin türü, adı, sınıf türü vb. ayrıntıları kontrol edebilirsiniz ve veri kazıma yapabilirsiniz.
Örnek olarak bir internet sitesinin içinde yer alan ürünlerin tüm özelliklerini alabilirsiniz. HTML içindeki ilgili "div" elementinin "class" türüne göre alıp bu alan içindeki "p" elementlerinin özelliklerini bir Python listesi içine alabilir ve Pandas ile DataFrame üzerinde düzenleyip CSV formatına dönüştürebilirsiniz. Bu CSV dosyası içinde ise ürünün adı, fiyatı, markası sütunları yer alabilir.
Veri Kazıma Nedir?
Veri kazıma veya web scraping, internet sitelerinin sayfalarını hedef alır. Her bir sayfanın HTML vb. dili içinde yer alan elementler içinde yer alan text bilgileri hedef alınır. Bu elementlerin sınıf, ad, içinde bulunduğu alanlara göre incelenir, depolanır, üzerinde belirli bilgileri olanlar dikkate alınır veya hepsi dikkate alınır. Bu incelemeler sonucu ise belirli text bilgiler alınmaktadır. Ayrıca görsel veya bağlantı köprüleri de alınabilir. Alınan bilgiler ise genelde yapay zeka uygulamalarında çeşitli kategorilere göre dataset olarak kullanılmaktadır.
Bu bilgiler ayrıca Kaggle gibi ortamlarda paylaşılabilir birçok kullanıcının çalışmalarına katkı sağlayabilir.
Örnek olarak TensorFlow ile bir banka verisi üzerine araştırma yapmak istemekteyiz. Bununla ilgili bir model eğitimi için veri setine ihtiyacımı vardır. Bu verileri ise bir finansal site üzerinde paylaşılan bilgileri veri kazıma yolu ile elde ederek kullanabiliriz.
Ayrıca dikkat etmemiz gereken nokta ise bu verileri kazıma izninin yasal olup olmamasıdır. Kişiler veri kazıma işlemlerinden kendisi sorumlu olmaktadır, bu noktada ise veri kazıma için tercih ettiğiniz sitelere dikkat etmelisiniz.
Ne Kullanacağız? Google Colab
Bu makalede ise Google Colab üzerinden ücretsiz CPU ve hafıza birimlerini kullanacağız. Veri kazıma işleminin kalıcı olması için ise verileri Google Drive ile bağlantı kurarak saklayacağız çünkü Google Colab kalıcı olmayan hafıza yönetimine sahiptir, eğer Python 3 ile çalışan makinin süresi bitse bile verilerimiz Google Drive üzerinde depolanmış olacaktır.
Selenium ile Veri Kazıma
İlk olarak Google Colab üzerinde Python notebook açınız. Bu notebook dosyası ise CPU üzerinden çalışmaktadır. İlk olarak Google Drive ile bağlantı kuralım, sonrasında ise ekrana gelen giriş adımlarını doğrulayın.
from google.colab import drive
drive.mount('/content/drive')
Önceden ise Veri-Kazima isimli bir klasörünüz Google Drive içinde yer alsın. Bu klasör içine gideceğiz.
%cd /content/drive/MyDrive/Veri-Kazima
.Şimdi ise Selenium'u Python için kurmaktayız.
!pip install selenium
Şimdi ise Selenium içinde yer alan WebDriver'ı import etmemiz gerekmektedir.
from selenium import webdriver
bilgi Şimdi ise Selenium içindeki By özelliğini ekleyelim. Bu özelliğini ile birlikte istediğimiz HTML elementine kolaca erişebiliriz.
from selenium.webdriver.common.by import By
Şimdi ise Chorme paketine ait opsiyonların yer aldığı bir nesne oluşturalım. Böylece Chorme tarayıcısını esas alarak internet sayfalarına erişim sağlayacağız. Google Colab ortamında genellikle Chorme bilgileri yer alabilir veya yer almayabilir ama el ile kurabilirsiniz. Benim tavsiyem ise hiçbir kurulum yapmadan yolunuza devam ediniz.
options = webdriver.ChromeOptions()
Kod yürütmesi esnasında ise bir web sayfasının tam yüklenmesi gerekebilir. Bunun için ise sayfa bekleme, sayfa öğesi bekleme gibi özellikler gerekir. Bu ilgili birimlerin yüklenmesi için kod yürütmesinin hata almasını önleyebilir, bunu veri kazıma kısmında hata almamak için yapmaktayız. Genellikle işe yaramaktadır.
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
ediniz. Ayrıca zaman bilgisi elde etmek, elde edilen veri kazıma bilgilerinin organize etmek ve kod üzerinde zamanı bazen durdurmak için Pandas, Time, Datetime ekleyeceğiz.
import pandas as pd
from time import sleep
from datetime import datetime
Burada ise sonradan kullanacağımız bir fonksiyon olacaktır. Veri kazımada alınan her bir nesnenin text özelliği geri döndürülür.
def text_al(deger):
return deger.text
def link_al(deger):
return deger.get_attribute("href")
def list_str_yap(deger):
return ' '.join(list(map(lambda bilgi : text_al(bilgi),deger)))
Burada ise bir sayfadan veri almayı hedeflemekteyiz. Bu fonksiyonu ise her adımda yeniden kullanmak için yazdık. önceden belirlediğimiz opsiyonlar ile bir Chorme alanı açtık ve ilgili sitenin verisini "get" ile çağırdık. .05 sleep ve sayfanın tam olarak büyük olarak alınması, 10 sayı değerinde sayfa yükleme komudu ve "body" etiketi tam olarak yüklenene kadar bekleme yaptık. "find_elements" içindeki By.XPATH ise bir element yoludur. Bu yolu ise belirtmemiz gerekmektedir. Data sonra ise bir sayfadaki tüm değerlerin bir listede olması için "list_str_yap" kullandık. "find_elements" ise belirttiğiniz yolu ve diğer özellikleri karşılyan tüm HTML elementlerini bir liste içine toplar ve bu liste içindeki her bir öğenin ise "text" özelliğini önceden yazdığmız "list_str_yap" ile alırız.
def site_veri_getir(site_veri):
browser = webdriver.Chrome(options=options)
browser.get(site_veri)
sleep(0.5)
browser.maximize_window()
bekle = WebDriverWait(browser, 10)
bekle.until(EC.presence_of_element_located((By.TAG_NAME, "body")))
sleep(0.5)
metin = browser.find_elements(By.XPATH,'(/html/body/div[7]/div[2]/div[1]/div[1]/article/div[5]/div[2]/div[3]/p)')
list_str_yap(metin)
print(list_str_yap(metin))
return list_str_yap(metin)
Şimdi ise artık bir web sayfasındaki öğeleri alacağız . Bir haber sitesi içindeki haberleri ele alacağız. Bunları ise bir Pandas DataFrame içinde depolayacağız. Haberib başlığı, linki, özeti ve içeriği olacaktır. Aşağıdaki adımlarda ise şimdilik içerik alınmayacaktır. Buradan ise ilgili DataFrame'i bir CSV yaptık. Bunu yapmamızın nedeni ise eğer Google Colab notebook kapanırsa(çökerse-işlem süresi biterse) elimizdeki verilerin kalıcı olması içindir. CSV dosyası Google Drive içindeki klasörümüzdedir.
haberler_DataFrame = pd.DataFrame({"Baslik":[],"Ozet":[],"Kategori":[],"Link":[],"Icerik":[]})
simdi = datetime.now()
saat, dakika, saniye, gun, ay, yil = simdi.hour, simdi.minute, simdi.second, simdi.day, simdi.month, simdi.year
dosya_kaydet = str(gun)+"_"+str(ay)+"_"+str(yil)+"+"+str(saat)+"-"+str(dakika)+"-"+str(saniye)+"_"+"webtekno"+"_"+"_GenisDataSet_CSV.csv"
haberler_DataFrame.to_csv(dosya_kaydet)
Şimdi ise bir internet sitesinin bir kategorisi üzerindeki verileri kazıyalım. İlk olarak site adının sürekli değişmesi için "for" döngüsü kullanalım. Daha sonra Chorme alanı açalım. sonrasında bekleme işlemlerini yapalım. "find_elements" ile sırası ile başlık, özet, kategori bilgilerini alalım. Bu bilgiler içindeki "text" ve "href" bilgilerini alalım.Bu bilgilerin en kısa olan liste uzunluğuna göre eklenmesi için bir "kisitlama" yapalım. Daha sonra ise bu bilgileri her bir döndü adımında DataFrame içine ekleyip sonradan CSV üzerine yazalım(CSV'yi yeniden oluşturma vardır, koda dikkatli bakınız.) . Burada dikkat edilmesi gereken ise her sitenin yeni veri gösterme özelliği farklı olabilir. Bazı siteler aşağı kaydırıldığında veya bazır siteler buton tıklamaları ile yeni veri getirir. Ya da bu site gibi doğrudan sayfalar üzerinden işlem yapmaktadır. Ayrıca her bir kaydetme sırasında fazladan oluşan sütunu ise silme işlemi de yaptık.
for i in range(2,1500):
browser = webdriver.Chrome(options=options)
site_adi = "https://www.webtekno.com/haber?s="+str(i)
print(site_adi)
browser.get(site_adi)
sleep(1)
browser.maximize_window()
sleep(1)
print("Sıra : " + str(i)+" / "+ site_adi)
browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")
bekle = WebDriverWait(browser, 1)
bekle.until(EC.presence_of_element_located((By.TAG_NAME, "body")))
sleep(0.1)
baslik = browser.find_elements(By.XPATH,'(/html/body/div[7]/div[2]/div[1]/div/div[2]/div/div/div/div/a/h3/span)')
ozet = browser.find_elements(By.XPATH,'(//div[@class="sidebar-content-main"]//div//div[@class="post-inner-content"]//div[@class="post-excerpt"]//p)')
kategoriler = browser.find_elements(By.XPATH,'(/html/body/div[7]/div[2]/div[1]/div/div[2]/div/div/div/div/div/a/h5)')
linkler = browser.find_elements(By.XPATH,'(/html/body/div[7]/div[2]/div[1]/div/div[2]/div/div/div/div/a)')
baslik = list(map(lambda bilgi : text_al(bilgi),baslik))
ozet = list(map(lambda bilgi : text_al(bilgi),ozet))
kategoriler = list(map(lambda bilgi : text_al(bilgi),kategoriler))
linkler = list(map(lambda bilgi : link_al(bilgi),linkler))
kisitlama = min(len(baslik),len(kategoriler),len(linkler))
try:
haberler_DataFrame = pd.concat([haberler_DataFrame,pd.DataFrame({"Baslik": baslik[0:kisitlama], "Ozet": ozet[0:kisitlama], "Kategori": kategoriler[0:kisitlama],"Link":linkler[0:kisitlama]})], ignore_index=True)
except:
pass
try:
haberler_DataFrame.drop("Unnamed: 0."+str(i),axis=1,inplace=True)
except:
pass
print("Hata")
haberler_DataFrame.drop("Unnamed: 0",axis=1,inplace=True)
haberler_DataFrame.to_csv(dosya_kaydet)
print("Baslik : " + str(len(baslik)))
print("Ozet : " + str(len(ozet)))
print("Linkler : " + str(len(linkler)))
bekle = WebDriverWait(browser, 500)
bekle.until(
EC.presence_of_element_located((By.TAG_NAME, "body"))
)
Şimdi verileri görüntüleyin, burada ise "Icerik" sütunu ise tamamen boştur.
haberler_DataFrame
Şimdi ise içerik sütununa veri ekleyelim. Bunu ise başka bir zaman yapmak istediniz ve yeni Google Colab notebook açtınız. "dosya_kaydet" isimli değişkeni ise dosyanın yolu olarak düzenleyiniz. "data" ise bir DataFrame olacaktır.
import pandas as pd
data = pd.read_csv(dosya_kaydet)
data = pd.DataFrame(data)
Şimdi ise bu CSV dosyasının "Icerik" sütundaki her bir sıraya göre veri ekleme yapalım. Bunun için "Link" sütundaki linkleri sırası ile "site_veri_getir" ile kullanın ve gelen her veriyi "Icerik" sütunundaki alana kaydedin ve sonrasında ise "data" için CSV dosyası oluşturun.
data_csv = pd.read_csv(dosya_kaydet)
data_csv = pd.DataFrame(data_csv)
for i in range(len(data_csv)):
print("Sıra : " + str(i) + "/" + str(len(data_csv)))
data = pd.read_csv(dosya_kaydet)
data = pd.DataFrame(data)
try:
data["Icerik"][i]=site_veri_getir(str(data_csv["Link"][i]))
except:
data["Icerik"][i]="Veri Yok"
try:
data.drop("Unnamed: 0."+str(i),axis=1,inplace=True)
except:
pass
print("Hata")
data.drop("Unnamed: 0",axis=1,inplace=True)
data.to_csv(dosya_kaydet)
!!!!Eğer Google Colab çökerse aşağıdaki kodun içindeki alana "dosya_kaydet" için dosya yolunu yazınız ve kodu devam ettirebilirsiniz.
data_csv = pd.read_csv(dosya_kaydet)
data_csv = pd.DataFrame(data_csv)
for i in range(data_csv.Icerik.count(),len(data_csv)):
print("Sıra : " + str(i) + "/" + str(len(data_csv)))
data = pd.read_csv(dosya_kaydet)
data = pd.DataFrame(data)
try:
data["Icerik"][i]=site_veri_getir(str(data_csv["Link"][i]))
except:
try:
data["Icerik"][i]=site_veri_getir(str(data_csv["Link"][i]))
except:
data["Icerik"][i]="Veri Yok"
try:
data.drop("Unnamed: 0."+str(i),axis=1,inplace=True)
except:
pass
print("Hata")
data.drop("Unnamed: 0",axis=1,inplace=True)
data.to_csv(dosya_kaydet)
Şimdi ise tüm veri kazıma sonuçlarına bakabilirsiniz.
import pandas as pd
data = pd.read_csv(dosya_kaydet)
data = pd.DataFrame(data)
data
Şimdi ise sizin için hazırladığım GitHub reposu ve Kaggle adreslerine bakınız. Burada daha fazla örnek yer almaktadır.
Kaggle Dataset: https://www.kaggle.com/denizhanahin/datasets
Kaggle Notebook: https://www.kaggle.com/denizhanahin/code