Konu Başlıkları Gizle

  1. 1 İyi Sosyal'ler!​
Merhaba,

Birkaç gündür üzerinde düşündüğüm küçük Python script'imi sunmaya sonunda hazırım. Bu gece oturup toplamda 1-2 saatte ancak bitirebildim. Sunacağım script, Sosyal'de yazdığınız tüm mesajlardaki (profil mesajları dahil) toplam karakter sayısını buluyor (sadece alıntılar hariç). Ben alıntılardaki karakterleri hariç tutacak şekilde yazdım kodu ama 62. satırı kaldırırsanız veya yoruma alırsanız alıntıları da sayıyor olmalı.

Kütüphane olarak sys standart kütüphanesi dışında sadece selenium kullandım hatta bu ilk kullanışım oldu. Güzel bir kütüphaneymiş. Kodu çalıştırmadan önce kütüphanenin ortamınızda yüklü bulunması gerekiyor. Ben direkt pip install selenium komutunu kullandım.

Buyurun:
Python:
import sys

from selenium import webdriver
from selenium.webdriver.common.by import By


def calculateTotalChars(initialPage: str):
    # Tarayıcı açılmaması için:
    # https://sqa.stackexchange.com/questions/2609/running-webdriver-without-opening-actual-browser-window
    options = webdriver.ChromeOptions()
    options.add_argument("--headless")
    options.add_argument("log-level=3")  # Log mesajlarını gizliyor

    # Selenium'la tarayıcı açıp ilk mesaj listesi sayfasına giriyoruz
    browser = webdriver.Chrome(options)
    browser.get(initialPage)

    totalChars = 0  # Toplam karakter sayısı
    currentMessageNo = 0  # Mevcut mesaj numarası
    while True:
        try:
            messageIndex = 0
            while True:
                # Mesaj listesi elementini alıp ardından içindeki tüm mesaj maddelerini alıyoruz.
                messageList = browser.find_element(By.CSS_SELECTOR, "ol.block-body").find_elements(By.XPATH, "*")

                # Önceki iterasyonda son mesaja gelmişsek duruyoruz.
                if messageIndex == len(messageList):
                    break

                # Mesaj bağlantısını almak için şu 3 satır:
                listElem = messageList[messageIndex]
                contentMain = listElem.find_element(By.CLASS_NAME, "contentRow-main")
                postUrl = contentMain.find_element(By.TAG_NAME, "a").get_attribute("href")

                assert postUrl  # Ne olur ne olmaz, bağlantı yoksa (edge case).

                # Mesaj konusuna gidiyoruz (bağlantıda mesajın numarası var).
                browser.get(postUrl)

                # Edge case varsa diye try-except var.
                try:
                    # Mesajımızın ID'si.
                    postId = browser.current_url.split("#")[-1]

                    # Profil veya konu mesajıysa.
                    if postId.startswith("post") or postId.startswith("profile-post"):
                        # Sadece mesajımızın bulunduğu elementi alıyoruz.
                        allMessage = browser.find_element(By.CSS_SELECTOR, f'div[data-lb-id="{postId}"]')
                    # Konunuzun ilk mesajıysa.
                    else:
                        # Sadece mesajımızın bulunduğu elementi alıyoruz.
                        allMessage = browser.find_element(By.CSS_SELECTOR, f"div.message-userContent")

                    # Mesajımızın içindeki alıntılar
                    quotes = allMessage.find_elements(By.TAG_NAME, "blockquote")

                    # Toplam karakter sayısına mesaj uzunluğumuzu ekliyoruz (boşluklar da dahil oluyor).
                    totalChars += len(allMessage.text)

                    # Bu satırı, alıntıları da saymak istiyorsanız silin veya yoruma alın.
                    totalChars -= sum(map(lambda q: len(q.text), quotes))

                    # Mesaj numaramızı bir artırıyoruz.
                    currentMessageNo += 1
                except:
                    pass

                # Burası işte, bilgileri yazdırdığımız yer.
                print(f"Mesaj {currentMessageNo}: {browser.current_url}\nToplam {totalChars} karakter\n")

                # Tarayıcıda geri gidiyoruz ki mesaj listemize dönelim.
                browser.back()

                # Bir sonraki mesaj için index'i 1 artırıyoruz.
                messageIndex += 1

            try:
                # Mesaj listesinde "Sonraki" butonunu alıyoruz.
                # Alamazsak hata veriyor, except'e gidiyor.
                nextPageButton = browser.find_element(By.CLASS_NAME, "pageNav-jump--next")
            except:
                try:
                    # Son sayfadayız, "Daha eski sonuçları görüntüle" butonunu alıyoruz.
                    # O da yoksa mesajlarımızın sonuna gelmişizdir, except'e gidecek.
                    nextPageButton = browser.find_element(
                        By.XPATH, "//*[contains(text(), 'Daha eski sonuçları görüntüle')]"
                    ).find_element(By.XPATH, "..")
                except:
                    break

            # Aldığımız butondaki bağlantıyı seçiyoruz.
            nextPageLink = nextPageButton.get_attribute("href")
            assert nextPageLink  # Ne olur ne olmaz

            # Bir sonraki mesaj listesi sayfasına gidiyoruz.
            browser.get(nextPageLink)

        # Ctrl-C vb. durumlarda program kapanmadan önce son durumu söylüyor.
        except KeyboardInterrupt:
            print(f"Toplamda {currentMessageNo} mesaj gezildi ve {totalChars} karakter bulundu")
            break
        except:
            # Program buraya gelince de son mesaja gelmiş olmasından başka, beklenmedik bir hata olmamışsa
            # bitmiş olacak.
            break


if __name__ == "__main__":
    initialPage = sys.argv[1]
    calculateTotalChars(initialPage)

Programı çalıştırmak için python dosya_adı.py <ilk mesaj sayfa bağlantısı> komutunu kullanabilirsiniz. Buradaki "ilk mesaj sayfa bağlantısı"nı, mesaj sayınıza sağ tıklayıp bağlantıyı kopyalayarak veya sayıya tıklayınca açılan sayfanın adres çubuğundan elde edebilirsiniz:

1705707068388.webp

Biraz yavaş çalıştığını belirteyim. Ctrl + C kısayolunu programı istediğiniz an durdurmak için kullanabilirsiniz. Program mesajları yeniden eskiye doğru geziyor ve her bir mesaja geldiğinde o mesajın bağlantısını, geldiği kaçıncı mesaj olduğunu ve o ana kadarki toplam karakter sayısını söylüyor. Programı bir klavye kısayoluyla durdurduğunuzdaysa yine toplam kaç mesaj gezdiğini ve o ana kadar hesaplanmış toplam karakter sayısını söyleyecektir.

Örnek çıktı (29. mesajda Ctrl + C ile durdurdum):
[CODE title="Kendi mesajlarım için örnek çıktı"]Mesaj 1: https://techolay.net/sosyal/konu/r5-5600-rx-6800-xt-b450m-s2h-macos-sonoma-14-0.5632/#post-73831
Toplam 207 karakter

Mesaj 2: https://techolay.net/sosyal/uye/maat.4/#profile-post-1542
Toplam 251 karakter

Mesaj 3: https://techolay.net/sosyal/konu/korku-oyunlarini-sever-misiniz.5611/page-2#post-73634
Toplam 539 karakter

Mesaj 4: https://techolay.net/sosyal/konu/son-pismanlik-neye-yarar.5618/#post-73621
Toplam 760 karakter

Mesaj 5: https://techolay.net/sosyal/konu/ekmekara-siram.5606/page-5#post-73603
Toplam 824 karakter

Mesaj 6: https://techolay.net/sosyal/konu/moderatoerluek-anilariniz.5616/#post-73566
Toplam 900 karakter

Mesaj 7: https://techolay.net/sosyal/konu/moderatoerluek-anilariniz.5616/
Toplam 1276 karakter

Mesaj 8: https://techolay.net/sosyal/konu/ekmekara-siram.5606/page-4#post-73449
Toplam 1336 karakter

Mesaj 9: https://techolay.net/sosyal/konu/ekmekara-siram.5606/page-2#post-73401
Toplam 1374 karakter

Mesaj 10: https://techolay.net/sosyal/konu/ekmekara-siram.5606/#post-73372
Toplam 1407 karakter

Mesaj 11: https://techolay.net/sosyal/konu/baska-insanlar-olmasaydi-yasamanin-bir-anlami-olur-muydu.5336/page-2#post-73317
Toplam 1906 karakter

Mesaj 12: https://techolay.net/sosyal/konu/ekmekara-siram.5606/
Toplam 2064 karakter

Mesaj 13: https://techolay.net/sosyal/konu/oeneri-konularina-oy-verirken-oenceden-verilmis-oylar-goezuekmesin.4790/page-5#post-73149
Toplam 2237 karakter

Mesaj 14: https://techolay.net/sosyal/konu/benim-gibi-online-oyunlarin-hicbirinde-basarili-olamayan-var-mi.5585/page-2#post-73143
Toplam 2556 karakter

Mesaj 15: https://techolay.net/sosyal/konu/oeneri-konularina-oy-verirken-oenceden-verilmis-oylar-goezuekmesin.4790/page-5#post-73120
Toplam 2793 karakter

Mesaj 16: https://techolay.net/sosyal/konu/benim-gibi-online-oyunlarin-hicbirinde-basarili-olamayan-var-mi.5585/#post-73087
Toplam 3131 karakter

Mesaj 17: https://techolay.net/sosyal/konu/veri-kaybindan-dolayi-oezuer-dileriz.5527/page-6#post-73056
Toplam 3733 karakter

Mesaj 18: https://techolay.net/sosyal/konu/sony-psx.5558/page-2#post-72877
Toplam 3820 karakter

Mesaj 19: https://techolay.net/sosyal/konu/sony-psx.5558/#post-72862
Toplam 3923 karakter

Mesaj 20: https://techolay.net/sosyal/konu/dualshock-4te-gta-5-karakteri-yavas-kosuyor.5462/page-2#post-72768
Toplam 4131 karakter

Mesaj 21: https://techolay.net/sosyal/konu/lolde-rankiniz-ve-maininiz-nedir.5561/#post-72732
Toplam 4217 karakter

Mesaj 22: https://techolay.net/sosyal/konu/lolde-rankiniz-ve-maininiz-nedir.5561/#post-72702
Toplam 4367 karakter

Mesaj 23: https://techolay.net/sosyal/konu/yasuha-fly-day-chinatown.5552/#post-72654
Toplam 4456 karakter

Mesaj 24: https://techolay.net/sosyal/konu/herkes-masauestue-fotografini-atsin.73/page-17#post-72650
Toplam 4547 karakter

Mesaj 25: https://techolay.net/sosyal/konu/yasuha-fly-day-chinatown.5552/#post-72634
Toplam 4677 karakter

Mesaj 26: https://techolay.net/sosyal/konu/r5-5600-rx-6800-xt-b450m-s2h-macos-sonoma-14-0.5632/#post-73831
Toplam 4884 karakter

Mesaj 27: https://techolay.net/sosyal/uye/maat.4/#profile-post-1542
Toplam 4928 karakter

Mesaj 28: https://techolay.net/sosyal/konu/korku-oyunlarini-sever-misiniz.5611/page-2#post-73634
Toplam 5216 karakter

Mesaj 29: https://techolay.net/sosyal/konu/son-pismanlik-neye-yarar.5618/#post-73621
Toplam 5437 karakter

Toplamda 29 mesaj gezildi ve 5437 karakter bulundu[/CODE]

Programı bitene kadar çalıştırdığımda 852 mesajım içinde toplam 372356 karakter olduğunu buldu.

Maalesef anlatılacak çok şey olduğu için koddaki yorumlarla yetinmekle kalacağım, üşendim. Herhangi bir sorunuz olursa hiç çekinmeden sorun. Onun dışında kodu alıp istediğiniz gibi inceleyebilir, düzenleyebilir ve geliştirebilirsiniz. Kaçırdığım bazı uç durumlar olabilir, açıkçası biraz aceleye getirdim ama kendi mesajlarımı denerken iyi çalışıyor gibiydi.

Umarım işinize yarar. :) Eğer programı çalıştırma konusunda bilginiz yoksa benden sizin için çalıştırmamı isteyebilirsiniz. Müsait olduğum zaman çalıştırıp haber verebilirim bir ihtimal.

İyi Sosyal'ler!🐍

 
Son düzenleme:
Güncelleme: DevTools'taki Network sekmesinde herhangi bir API sorgusuna rastlayamadım maalesef. Sayfanın tamamı HTML dokümanı olarak geliyor, JS ile yapılan bir API sorgusu göremedim.
O zaman HTML'de işlem yapmak lazım. Selenium'dansa tabii tam yapıyı bilmiyorum ben de incelemedim.
 
O zaman HTML'de işlem yapmak lazım Selenium'dansa, tabii tam yapıyı bilmiyorum ben de incelemedim.

Mesaj liste sayfalarını gezebilmek için Selenium'a ihtiyaç duydum çünkü URL özellikle "Daha eski sonuçları görüntüle"ye basınca gelen yeni sayfada belirsizce değişiyor, .../ara/<sayı>/...: şuradaki sayıyı nasıl üreteceğimi çıkaramadım.

Onun dışında bir mesaj liste sayfası eldeyken sanırsam Selenium kullanmadan requests ve tercihen BeautifulSoup ile bir mesajın olduğu konu sayfasına gidip mesajı alabiliriz yine. Burayı Selenium'la yapmak yavaşlatıyor olabilir.
 
Son düzenleme:
Selenium cok is goren bir kutuphane. Zaten kutuphaneden de ote web scraping mantigini oturtmak pek cok seyde isinize yarar. Yarin obur gun universitede ders secimi yaparken herkes elle tiklarken siz bot yazarsiniz dersleri o secer direk, tenis kortu kiralamak icin millet alarm kurup sayfada F5 yaparken VPS'e kurdugunuz bir bot surekli tarar bosalan bir vakit oldugunda size haber verir vs. gunluk hayatta cok seye yariyor.

Kod yazim sekli de derli toplu nispeten ama daha duzenli olursaniz daha iyi olur ilerisi icin. Simdilik tek sayfalik seylerde sorun olmaz ama normalde methodlar cok az sayida satir icermeli ve sadece tek bir sey yapmali.

Cok guzel bir pratik olmus, devam etmeni umarim.
 
Öncelikle değerli yorum ve tavsiyeleriniz için teşekkür ederim.

Selenium cok is goren bir kutuphane. Zaten kutuphaneden de ote web scraping mantigini oturtmak pek cok seyde isinize yarar.

Kesinlikle bu bakımdan çok beğendim. Çok hoş bir API'ı var, hiç kendim özelleşmiş ek bir metot yazma ihtiyacı hissetmedim.

Yarin obur gun universitede ders secimi yaparken herkes elle tiklarken siz bot yazarsiniz dersleri o secer direkt.

Güya yasaklıydı bizde. :) Ufak JS scriptlerini yazan yazıyordu. İş benden geçti. 🫠 Tek dersim kaldı, o da bitirme. Zamanında ilgilenip eğlenseydik keşke.

Tenis kortu kiralamak icin millet alarm kurup sayfada F5 yaparken VPS'e kurdugunuz bir bot surekli tarar, bosalan bir vakit oldugunda size haber verir vs. gunluk hayatta cok seye yariyor.

Verdiğiniz örnek fazlasıyla spesifik, tenise ilgilisiniz anlaşılan. :) VPS ne oluyor bu arada? Virtual Private Server diye sallayasım geldi ama... Nasıl elde ediliyor ki?

Günlük hayatta çok işe yarayabileceğini tahmin edebiliyorum. Oldukça eğlenceli. :)

Kod yazim sekli de derli toplu nispeten ama daha duzenli olursaniz daha iyi olur ilerisi icin. Simdilik tek sayfalik seylerde sorun olmaz ama normalde metotlar cok az sayida satir icermeli ve sadece tek bir sey yapmali.

Böyle bir eleştirinin gelmesine çok sevindim. Kesinlikle haklısınız. Neden böyle geçiştirdim, biliyor musunuz? Kendim WebDriver tipinde parametre alan metotlar yazacaktım ama sonra sınıfı import edemeyince sinir oldum (typing kullanmadan yazasım gelmedi), araştırasım da gelmedi hangi alt modülün içinde bulunduğunu, hepsini tek metoda tıkıştırdım gitti. 😂

Cok guzel bir pratik olmus, devam etmeni umarim.

Çok teşekkürler, amaç oldukça motive ediciydi. Sosyal'de mesajlardaki toplam karakter sayısının dışında çok şey yapılabileceğinden başka fikirler türeyeceğini de öngörüyorum. Devamı gelecektir tahminimce.
 
Öncelikle değerli yorum ve tavsiyeleriniz için teşekkür ederim.



Kesinlikle bu bakımdan çok beğendim. Çok hoş bir API'ı var, hiç kendim özelleşmiş ek bir metot yazma ihtiyacı hissetmedim.



Güya yasaklıydı bizde. :) Ufak JS scriptlerini yazan yazıyordu. İş benden geçti. 🫠 Tek dersim kaldı, o da bitirme. Zamanında ilgilenip eğlenseydik keşke.



Verdiğiniz örnek fazlasıyla spesifik, tenise ilgilisiniz anlaşılan. :) VPS ne oluyor bu arada? Virtual Private Server diye sallayasım geldi ama... Nasıl elde ediliyor ki?

Günlük hayatta çok işe yarayabileceğini tahmin edebiliyorum. Oldukça eğlenceli. :)



Böyle bir eleştirinin gelmesine çok sevindim. Kesinlikle haklısınız. Neden böyle geçiştirdim, biliyor musunuz? Kendim WebDriver tipinde parametre alan metotlar yazacaktım ama sonra sınıfı import edemeyince sinir oldum (typing kullanmadan yazasım gelmedi), araştırasım da gelmedi hangi alt modülün içinde bulunduğunu, hepsini tek metoda tıkıştırdım gitti. 😂



Çok teşekkürler, amaç oldukça motive ediciydi. Sosyal'de mesajlardaki toplam karakter sayısının dışında çok şey yapılabileceğinden başka fikirler türeyeceğini de öngörüyorum. Devamı gelecektir tahminimce.

Hangi bolumde okuyorsunuz? Bilgisayar muhendisligi mi?

Evet tenis icin Istanbul'da bahsettigim seyi yapmistim. Aslinda verdigim diger ornekler de zamaninda yaptigim seyler. Kendini tekrar eden ve otomatiklestirebilecegim bir isi elle yapmaktan bana zulum gibi geliyor. O yuzden bu tarz isleri hep otomatiklestirmek istiyorum. Mesela kendi kendini karistiran tencere neden hala icat edilmedi aklim almiyor.

Ufak bir oneri daha yapayim o zaman, metodlari kucuk ve tek isi yapar hale getirince yorum satirlarina da ihtiyacin kalmayacak. Cunku metodun adi zaten ne is yaptigini soyleyecegi ve tek bir is yapacagi icin yorum eklemene bile gerek kalmamis olacak. Kendim de kod yazarken her zaman eger yorum satiri yazmam gerekiyorsa once bunu daha parcalayabilir miyim diye dusunuyorum. Ekstrem durumlar olmadikca da yorum satiri yazmamaya calisiyorum cunku kotu bir kod yazip yorum satiriyla aciklamaya calismak cok kolay. Guzel bir kod kendi kendini anlatmali, ekstra bir yorum satirina ihtiyac duymamali.

Aslinda import kisminda aldigin hatalarda takilmadan isi yapacak MVP (Minimum Viable Product) gelistirmis olman iyi bir yontem. Bazi insanlar detaylara ve mukemmelliyetcilige takildigindan gunun sonunda hic bir sey cikaramiyor ortaya. Bununla ilgili bir soz de var, ki ben de cok severim;


Gunluk hayatta kullandigin bazi seyleri Ya bunu nasil otomatiklestiririm? diye dusunursen bence cok daha yaratici seyler bulabilirsin.

Kolay gelsin 👋

Duzenleme: VPS sorusuna cevap vermemisim. Evet tahmin ettigin gibi, sanal bir sunucu. Sonucta mesela tenis orneginde yazdigin uygulamanin surekli bir loop halinde tenis kortlarini kontrol etmesi gerekli degil mi? Evde PC'ni acik birakip orada kosturabilrisin ama bu cok mantikli degil. Onun yerine ayda 30-40TL gibi rakamlara kiralayabilecegin kucuk sunucular oluyor. Bunlardan birini alip kendi sistemini kurup programini orada calistiriyorsun. Bu sayede 7/24 calisiyor o arkada.
 
Son düzenleme:
Hangi bolumde okuyorsunuz? Bilgisayar muhendisligi mi?

Evet. :) Adı bilgisayar mühendisliği, pratiği yazılım. Donanım kısmında da elbette ilgimi çeken şeyler var fakat %99.9 yazılım tarafındayım. %0.1 de işte bilgisayarı açıp kapatmak falan. :p

Kendini tekrar eden ve otomatiklestirebilecegim bir isi elle yapmaktan bana zulum gibi geliyor. O yuzden bu tarz isleri hep otomatiklestirmek istiyorum.

Kendim için küçük projeler üretme alışkanlığım yoktu hiç, belki o da zamanla olur, kim bilir? Motivasyonunuz mantıklı.

Mesela kendi kendini karistiran tencere neden hala icat edilmedi aklim almiyor.

Değil mi? Modern dünyanın modern saçmalıkları. 😁 Karıştırmasın canım kendini, biraz daha el işi değsin. :)

Yeni öneriniz ve arkasındaki sebep gayet mantıklı. Her yazılımcının bilincinde olması gereken kalitede açıklamışsınız.

Aslinda import kisminda aldigin hatalarda takilmadan isi yapacak MVP (Minimum Viable Product) gelistirmis olman iyi bir yontem. Bazi insanlar detaylara ve mukemmelliyetcilige takildigindan gunun sonunda hic bir sey cikaramiyor ortaya.

Sırf VS Code'da IntelliSense, nesnenin özelliklerine erişmek için noktaya bastığımda özellikleri listelemiyor diye ek metotlar yazmadım ya, var bende de biraz mükemmelliyetçilik. Hatta sırf bu gibi durumlar yüzünden dediğiniz şeyi yaşayabiliyorum. 🫠

Bununla ilgili bir soz de var, ki ben de cok severim;
👌

Size de kolaylıklar, teşekkürler 👋