5 ADIMDA EKŞİ SÖZLÜK ENTRYLERİNİ ÇEKMEK

Merhabalar, öğrenci arkadaşlarım tez çalışmalarını yaparken sık sık web sitelerinden veri çekiyorlardı. Nasıl yapıldığını merak ediyordum. Python Selenium kullanarak çok basit bir yöntemi varmış. Ufak bir örnek olması açısından sizlerle Ekşi Sözlükte ki entry’ leri çekmeye karar verdim. Bunu sizlerle birlikte yapacağız.

Başlamadan önce entryleri nasıl çekeceğimiz sizlere anlatmak istiyorum.

Ekşi sözlükte entryleri çekmek istediğimiz sayfaya gidiyoruz. Ben Mustafa Kemal ATATÜRK başlığında yazılan entryleri çekmek istiyorum. Siz istediğiniz başlığı seçebilirsiniz. Burada önemli olan bu entrylerin yolunu nasıl bulacağımız. Aşağıdaki fotoğrafı inceleyelim:

Entry üzerine sol tıklayıp incele diyorum, ve copy selector’ü seçiyorum. XPath diyebilirdik ama birden fazla sayfadan yüzlerce veri çekeceğimiz için CSS selector kullanmak daha mantıklı olacak. Copy selector dediğimizde: #entry-item-list > li:nth-child(2) > div.content yolunu gösteriyor. Sayfada ki entryler div de content classında kayıtlı. Bizlerde classı content olanları siteden çekeceğiz. O zaman başlayalım.

1. KURULUM

Eğer bilgisayarınızda selenium kurulu değilse pip kullanarak terminalden kurulumu yapabiliriz. Aşağıda ki satırı yazarsak kurulum başlayacaktır.

         pip install selenium 

Bundan sonra kullanacağımız tarayıcıya göre driver indirmemiz gerekiyor. Resmi sitesi için buraya tıklayıp kullanacağınız browser dosyasını indirtikten sonra zipten çıkarın ve exe dosyasını çalıştırın. Ben Chrome kullanacağım. Siz size uygun olanı seçersiniz. Kurulum tamamlanacaktır.

2. GEREKLİ KÜTÜPHANELERİ EKLEME

Python dosyasını oluşturalım, ben VsCode’ta yazdım siz istediğiniz IDE’de yazabilirsiniz. Gerekli kütüphaneleri ekleyelim, Selenium dışında ben time kütüphanesinide eklemek istiyorum. Böylece entryleri çekerken gidilen sayfalarıda görmüş olacağım. Random kütüphanesini ekleme nedenim Mustafa Kemal Atatürk başlığı altında toplam 1971 sayfa var, random sayfalardan entryleri çekmesini istiyorum.

from selenium import webdriver
import time
import random

Selenium.webdriver modülü bizlere tüm WebDriver uygulamalarını sağlar. Şu anda desteklenen WebDriver uygulamaları Firefox, Chrome, IE ve Remote’tur.

3. DRİVER VE DEĞİŞKENLERİ BELİRLEME

browser = webdriver.Chrome()

Driveri browser’ adında yukarıdaki kodu yazarak oluşturuyoruz. Ben Chrome kullanacağım için Chrome yazdım siz kullandığınız tarayıcıya göre yazabilirsiniz.

Entryleri çekeceğimiz URL’ yi tanımlamamız gerekiyor. Burada dikkat etmeniz gereken önemli bir nokta var URL’ nin sonu sayfa sayısına göre değişiyor . Sayfa sayısına göre -> ?p=1, ?p=2 ..….?p=197. Entryleri çekeceğimiz sayfaları random seçeceğimiz için sayfa sayısını url’ye girmediğime dikkat edin. Ayriyeten entryleri çekerken bütün  entryleri tutmak için diziye, kaç sayfadan çekeceğimizi kontol etmemiz içinde sayfa sayısını tutan sayaca ihtiyacımız olacak.

url=("https://eksisozluk.com/mustafa-kemal-ataturk--34712?p=")
pageCount =1
entries=[]
entryCount=1 

4. SİTEDEN ENTRYLERİ ÇEKME

 while pageCount<=10:
    randomPage = random.randint(1,1971)
    newUrl = url + str(randomPage)
    browser.get(newUrl)
    pageCount += 1

    elements= browser.find_elements_by_css_selector(".content")
    for element in elements:
        entries.append(element.text)
    time.sleep(2) 

Her sayfada toplam 10 tana entry var , 10 sayfaya giderek toplamda 100 tane entry çekmek istiyorum ve sayfalarımı random olarak seçeceğim. While loop kullanarak bunu kontrol ediyorum.

Yukarıda URL’nin gidilen sayfa sayısına göre değiştiğini söylemiştim. Randompage değişkenine her defasında 1 ile 1971 sayfa sayıları arasından rastgele bir sayı atıyoruz ve bu sayı int değer olduğu için stringe çevirerek URL’ye ekliyoruz.

Entry çekerken selector kullanarak content classlarını çekeceğiz. Content class olduğundan ötürü başına nokta koyduğumuza dikkat ediniz.

Sayfada çekilen entryleri .append diyerek o diziye aktarıyoruz. Gidilen sayfaları görmek için 2 saniye beklemek istiyorum. Kodumuz aşağıdaki gibi olacaktır:

5. Entryleri Dosyaya Kaydetmek

 with open("Desktop\entries.txt","w",encoding="UTF-8") as file:""
    for entry in entries:
        file.write(str(entryCount) + ".\n"+entry + "\n")
        file.write("******************\n")
        entryCount+=1
browser.close()         

Entrylerimizi çekerken bunları bir txt dosyasına kaydedelim.Open diyerek dosyanın konumunu,  modunu “w” yazarak  dosya üzerinde yazma işlemi yapılacağını söylüyorum. Default olarak ASCII alıyor ama biz Türkçe karakter kullanacağımız için parametresini UTF-8 yaptım. Entry sayısını stringe çevirdim, \n diyerekte alt satıra geçtim. Run dedikten sonra dosyaya gittiğimizde yazılan entryleri göreceğiz.

Gördüğünüz gibi çok basit bir şekilde verileri çektik. Merak ettikleriniz varsa yorum yapabilirsiniz, okuduğunuz için teşekkür ederim.

Add a Comment

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