Technopat çekiliş script'i

  • Konuyu başlatan 89069
  • Başlangıç Tarihi
  • Mesaj 12
  • Görüntüleme 2.148

89069

Megapat
Zamanın Tanığı
Katılım
19 Aralık 2015
Mesajlar
4.001
Makaleler
5
Çözümler
36
Çekiliş konularının sayısında artış görünce @Kerem00 ile bu işi otomatikleştiren bir şeyler deneyesimiz geldi, 1-2 günlük uğraş sonucunda ortaya böyle bir şey çıktı. En çok kullanılan iki tarayıcı Chrome ve Firefox desteği var şimdilik. Test eden arkadaşların deneyimlerine, düzeltme ve geliştirme önerilerine açığız.

Konunun ilk sayfa bağlantısını giriyorsunuz, o sayfa tarayıcı üzerinde açılıyor, foruma giriş yapıp script'i devam ettiriyorsunuz. Ardından sayfa sayfa herkesin adını alarak usernames listesine ekliyor. En son da random kütüphanesi ile o listeden istenilen kişi sayısı kadar kişi çekiyor.

  • Selenium tarayıcıyı kendisi açtığı zaman konu, ziyaretçi görünümüyle açıldığı için güncel mesajları göstermiyor. Bu yüzden üye olarak giriş yapmak gerekiyor.
  • Çerez pop-up'ını try-except kullanarak kapatmaya çalıştık.
  • Selenium'un çalışabilmesi için geckodriver ya da ChromeDriver gerekiyor.

  • Dimension temada, makale ve soru tipi konularda çalışmıyor çünkü buton yerleri farklı.
  • Birden fazla kez aynı kişileri çekme ihtimali var.
  • Pyinstaller ile çalıştırılabilir hale dönüştürüldüğünde son satır çalışmıyor.
  • Giriş yapan kullanıcının göz ardı ettiği bir üye, çekiliş konusuna yazmışsa listede boş bir satır görünüyor.
  • Konu sahibini de listeye ekliyor:)

Python:
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
from selenium.common.exceptions import SessionNotCreatedException
from selenium.common.exceptions import WebDriverException
import time
import random
global browser
usernames = []
while True:
    URL = input("Çekiliş konusunun linkini girin\n")
    if URL.startswith("https://www.technopat.net/sosyal/konu/"):
        break
try:
    browser = webdriver.Chrome(executable_path="chromedriver.exe")
    print("Chrome kullanılacak")
except WebDriverException:
    print("Chrome bulunamadı, Firefox aranıyor")
    try:
        browser = webdriver.Firefox(executable_path="geckodriver.exe")
        print("Firefox kullanılacak")
    except SessionNotCreatedException:
        print("Firefox da bulunamadı")
        input("Çıkmak için Enter'a basın")
        quit()
    except WebDriverException:
        print("Firefox ya da geckodriver.exe bulunamadı")
        input("Çıkmak için Enter'a basın")
        quit()
browser.get(URL)
try:
    time.sleep(1)
    browser.find_element_by_xpath("/html/body/div[4]/div/div[1]/a").click()
    browser.find_element_by_xpath("/html/body/div[1]/div[1]/nav/div/div[3]/div[1]/a[1]").click()
except NoSuchElementException:
    try:
        browser.find_element_by_xpath("/html/body/div[2]/div[1]/nav/div/div[3]/div[1]/a[1]/span").click()
    except NoSuchElementException:
        browser.find_element_by_xpath("/html/body/div[1]/div[1]/nav/div/div[3]/div[1]/a[1]").click()
input("Giriş yaptıktan sonra Enter'a basın")
print("-"*20)
pagenumber = browser.find_element_by_css_selector("div.block-outer:nth-child(2) > div:nth-child(1) > nav:nth-child(1) > div:nth-child(1) > ul:nth-child(1) > li:nth-child(5)")
for i in range(1, int(pagenumber.text)+1):
    try:
        for x in browser.find_elements_by_class_name("message-name"):
            if x.text not in usernames:
                usernames.append(x.text)
        if i == 1:
            browser.find_element_by_xpath("/html/body/div[1]/div[4]/div/div[2]/div[3]/div/div[1]/div[1]/div[1]/nav/div[1]/a").click()
        else:
            browser.find_element_by_xpath("/html/body/div[1]/div[4]/div/div[2]/div[3]/div/div[1]/div[1]/div[1]/nav/div[1]/a[2]").click()
    except NoSuchElementException:
        print(f"{i} sayfa tarandı")
        print("-"*20)
usernames.sort(key=str.lower)
for q in usernames:
    print(q)
print("-"*40)
while True:
    try:
        total_number = int(input(f"Listede {len(usernames)} kişi var, kaç kişi seçilecek?\n"))
        if total_number <= len(usernames):
            for _ in range(0, total_number):
                print(random.choice(usernames))
            break
        else:
            print(f"{len(usernames)}'den küçük bir sayı girin")
    except ValueError:
        print(f"{len(usernames)}'den küçük bir SAYI girin")
input("\nÇıkmak için Enter'a basın")

İsterseniz kaynak kodundan çalıştırabilir, isterseniz de şu bağlantıdan çalıştırabilir sürümü indirebilirsiniz.

Bir de son olarak ricam, çekiliş konunuzda bu script'i kullanırsanız çıktıyı herkesi almış mı diye kontrol edin, dolaylı yoldan hak yemiş olmayayım:)
 
Bir kişi çekilişi birden fazla kez kazanamıyorsa, kazanan kişiyi kişiler listesinden çıkartmak isteyebilirsiniz.
Katılan sayısı az, çekilecek kişi sayısı çok olunca bir kişi iki kez çıkabiliyor. Bu fikire ayırdığımız zamanın çoğu Xenforo'nun garipliklerini çözmekle geçtiği için çekiliş fonksiyonu biraz yarım kaldı. Yine de tüm üyeleri tek tek yazmaktan iyidir deyip paylaşma kararı aldık. Geri dönüş için teşekkürler, koda güncelleme yaparsak dikkate alacağız bunları.
Hangi programlama dilini kullandınız?
Kolaylığından dolayı Python kullandık.
 
Katılan sayısı az, çekilecek kişi sayısı çok olunca bir kişi iki kez çıkabiliyor. Bu fikire ayırdığımız zamanın çoğu Xenforo'nun garipliklerini çözmekle geçtiği için çekiliş fonksiyonu biraz yarım kaldı. Yine de tüm üyeleri tek tek yazmaktan iyidir deyip paylaşma kararı aldık. Geri dönüş için teşekkürler, koda güncelleme yaparsak dikkate alacağız bunları.

Kolaylığından dolayı Python kullandık.
Biraz kodlara baktım da c# daha kolay geldi ona alıştığımızdan dolayı olabilir.
 
Katılan sayısı az, çekilecek kişi sayısı çok olunca bir kişi iki kez çıkabiliyor. Bu fikire ayırdığımız zamanın çoğu Xenforo'nun garipliklerini çözmekle geçtiği için çekiliş fonksiyonu biraz yarım kaldı. Yine de tüm üyeleri tek tek yazmaktan iyidir deyip paylaşma kararı aldık. Geri dönüş için teşekkürler, koda güncelleme yaparsak dikkate alacağız bunları.

Listeden çıkartmak denildiği zaman çoğu kişi remove kullanır.
Bunun yerine pop kullanabilirsiniz. Remove sadece çıkartır, Pop ise hem çıkartır hem de çıkarttığı item'ı return eder.

Python:
import random

list = ["foo", "bar", "fiz", "buz", "biz", "funky_pants"]
winners = []
for _ in range(5):
    winners.append(list.pop(random.randint(0, len(list) - 1)))
print(winners)

Örnek olduğu için exception vs yok. 6 kişi içerisinden 5 kişi seçilmesine rağmen hiç bir zaman aynı kişi birden fazla kez seçilemiyor.
 
Biraz kodlara baktım da C# daha kolay geldi ona alıştığımızdan dolayı olabilir.
Aslında çok karmaşık bir kod değil fakat Xenforo biraz uğraştırdığı için try-except'lere sığınmak durumunda kaldık. Girişe tıkla; toplam sayfa sayısını bul; sonraki butonuna bu sayı kadar tıkla ve her sayfada message-name sınıfının içeriğini usernames listesine ekle, son olarak da bu listeden input kadar üye çekten ibaret. Sabah uyandığımda ekleyebilirsem yorumla açıklayacağım her satırın ne yaptığını.
 
Uyarı! Bu konu 5 yıl önce açıldı.
Muhtemelen daha fazla tartışma gerekli değildir ki bu durumda yeni bir konu başlatmayı öneririz. Eğer yine de cevabınızın gerekli olduğunu düşünüyorsanız buna rağmen cevap verebilirsiniz.

Technopat Haberler

Geri
Yukarı