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:
Son düzenleme:
Kod başlığını sildim, şu an düzgün olmalı.

Çok teşekkürler :) Oradan kaynaklandığını asla tahmin etmezdim.

Not: Program son mesajı halletikten sonra hata vererek kapanıyordu, onu düzelteceğini düşündüğüm bir ekleme yaptım.
 
Selenium'dan sonra requests, lxml gibi kütüphaneleri, sitenin yaptığı API sorgularını vb. kullanarak bu projeyi bir sonraki seviyeye taşımayı deneyebilirsin.

Teşekkürler, aynı işlevleri ilk requests'le yerine getirmeyi denemiştim (sayfa verisini çekmek, tam kastınız o olmasa da) ancak URL formatının değiştiğini görünce Selenium'u deneyeyim dedim. Direkt butonlarla işi halletmek çok kolayıma geldi.

API sorgularını göremiyordum, üstünde duracak olursam bir daha incelerim. Bu konuda bilginiz varsa paylaşmanızı çok isterim. Çok teşekkürler. :)

Sitenin yaptığı API sorgularını...

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.
 
Son düzenleme: