İnstagram Selenium ScrollBar Sorunu

Merhabalar,

Selenium ile instagramda fotoğrafımı beğenen kişilerin kullanıcı adlarını çekeceğim.
Açılır boxa tıklıyorum, fakat scrollbar ile kaydırmak istediğimde sadece 2 kere aşağıya iniyor ve sonra duruyor. Tamamen aşağıya gitmesini nasıl sağlarım?

Aramıza hoş geldiniz! :partying_face:

Döngüye (while,for) almayı denediniz mi?

Bir de kodlarınızı atabilir misiniz

dialog = self.browser.find_element_by_css_selector("div[role=dialog] ul")
        followerCount = len(dialog.find_elements_by_css_selector("li"))

        print(f"first count: {followerCount}")

        action = webdriver.ActionChains(self.browser)

        while followerCount < max:
            dialog.click()
            action.key_down(Keys.SPACE).key_up(Keys.SPACE).perform()
            time.sleep(2)

            newCount = len(dialog.find_elements_by_css_selector("li"))

            if followerCount != newCount:
                followerCount = newCount
                print(f"second count: {newCount}")
                time.sleep(1)
            else:
                break
        
        followers = dialog.find_elements_by_css_selector("li")

        followerList = []
        i = 0
        for user in followers:
            link = user.find_element_by_css_selector("a").get_attribute("href")            
            followerList.append(link)            
            i += 1
            if i == max:
                break

        with open("followers.txt", "w",encoding="UTF-8") as file:
            for item in followerList:
                file.write(item + "\n")

Hala henüz yanıt alamadım

Web sayfalarında, space tuşu aşağı doğru kaydırma (scroll) yapar. Siz iki kere space tuşuna basmasını istemişsiniz. Yani aslında istediğiniz işi yapıyor.

Şu JavaScript kodunu deneyin:

	self.browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")

Dilerseniz bu örneği de inceleyebilirsiniz:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.keys import Keys


def main():
	chrome_options = Options()
	chrome_options.add_experimental_option("detach", True)
	driver = webdriver.Chrome(options=chrome_options)

	driver.get("https://selenium-python.readthedocs.io/")

	driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")


if __name__ == "__main__":
	main()

Hocam çalıştırdım kodu ama bu sefer sayfada aşağıya iniyor. şöyle atayım

browser.find_element_by_xpath("//*[@id='react-root']/section/main/div/header/section/ul/li[3]/a").click()```

bu kod'da instagramda takipçilerime tıklıyor ve açılıyor. sonrasında sizin verdiğiniz js ile aşağıya indirme kodunu yazdığımda ise arka tarafta kalan profilde iniyor. Bu açılan box'da nasıl inmesini sağlarım?

Çünkü scroll’u aşağı indirme işlemini doğrudan driver’a uyguladık.

execute_script metoduna parametre olarak seçtiğiniz element’i verip dener misiniz? JavaScript kodunu da şununla değiştirin:

takipciler = browser.find_element_by_xpath("//*[@id='react-root']/section/main/div/header/section/ul/li[3]/a").click()
driver.execute_script("arguments[0].scrollIntoView(true);", takipciler)

Hocam, instagram her bir indirişte 12 kişiden sonra durduruyordu. Ben de takipçi sayımı 12 ye bölüp bir while döngüsüne soktum ve sizin verdiğiniz kodla kişileri aşağıya indirdim. Çok teşekkür ederim. Şimdi sorun şu, while döngüsünde indikten sonra, i’yi arttırmadan önce dosyaya kişilerin adlarını yazdırmak istedim fakat olmadı. o kodu da yazıyorum şimdi

while scrollx<346:
        time.sleep(4)
        browser.execute_script("arguments[0].scrollTop = arguments[0].scrollHeight", tutus)
        begenil = browser.find_elements_by_css_selector("li")
        followerList = []
        i = 0
        for user in begenil:
            link = user.find_element_by_css_selector("a").get_attribute("title")            
            followerList.append(link)
            with open("begenen.txt", "a+",encoding="UTF-8") as file:
                for item in followerList:
                    file.write(item + "\n")
            i += 1
            if i == max:
                break

        scrollx+=1

Problem ne tam olarak, 'olmadı’dan kasıt nedir?

1 Beğeni

Hocam şöyle söyleyeyim. Önce get ile bir fotoğrafıma gidiyorum. Sonra beğenenlere basıyorum. Scroll aşağı da iniyor. Fakat kişilerin title sini almam. Kullanıcı adları orası. Fakat bir tane alıp alt taraftakileri almıyor txt’ye.
İnstagramınız varsa eğer, bir fotoğrafınıza girip, fotoğrafınızı beğenen kişilerin titlesini alacağım python kodunu yazma şansınız var mı? Txt’ye kaydedecek

    browser.get("https://www.instagram.com/p/fotografID/")
    time.sleep(5)
    browser.find_element_by_xpath("//*[@id='react-root']/section/main/div/div[1]/article/div[3]/section[2]/div/div[2]/button").click()
    time.sleep(5)


    tutus=browser.find_element_by_xpath("/html/body/div[5]/div/div/div[2]/div")
    time.sleep(2)
    scrollx=1
    while scrollx<346:
        time.sleep(4)
        browser.execute_script("arguments[0].scrollTop = arguments[0].scrollHeight", tutus)
        scrollx+=1

Ek olarak şu kısma böyle bir for ekledim boş list döndürüyor

    while scrollx<346:
        time.sleep(4)
        for i in range(1,12):
            tuttu= browser.find_elements_by_css_selector("body > div:nth-child(4) > div > div > div:nth-child(1) > div > div>div:nth-child("+str(i)+") > div >div:nth-child(1) > div > div >  a").get_attribute("title")
            print(tuttu)

        browser.execute_script("arguments[0].scrollTop = arguments[0].scrollHeight", tutus)
        scrollx+=1```

find_element_by_css_selector ile find_elements_by_css_selector farklı metodlar.
Bkz. Locating Elements
Sizin kullandığınız metod, sadece bir element döndürüyor. Muhtemelen bu yüzden sadece ilk kişinin ismini alabiliyorsunuz.

Üzgünüm, bunun için pek vaktim olduğunu söyleyemem.

Scroll bir kere aşağıya indiğinde ne kadar uzunlukta aşağı iner bunu nasıl bulabilirim?

Bu tür soruları arama motorlarına sorarsanız çok daha fazla yanıt elde edebilirsiniz.

1 Beğeni

Yazdım ve tam olarak bulamadım. Teşekkürler. Bunu düşünememiştim(!)

Bu çok büyük kabalık. Ben size yardım etmeye çalışıyorum, elimden geldiğince. Selenium kütüphanesini bildiğimi mi sanıyorsunuz? Bilmiyorum, ama sırf size yardımcı olabilmek için vakit ayırıp araştırıyorum. İlk 2 probleminizi çözdüm, sonuncusunu ise sizin çözmenizi istedim. Çünkü hem fazla vaktim yok hem de araştırılarak çözülebilecek bir problem. Ancak siz, hazır kod istediğiniz için ve bende bunu vermediğim için, kabalık edip kendinizi haklı çıkarmayı tercih ettiniz.
Söyleyecek bir şey bulamıyorum, iyi çalışmalar.

3 Beğeni

Açık konuşmak gerekirse araştırma yapan biriyim. Verdiğiniz kodu siz yazmadan yaklaşık 10 dakika önce bulmama rağmen uğraştığınız için yine de teşekkür ettim. Araştırma yaptığımda bulabiliyor olsaydım zaten buraya sormazdım. İyi çalışmalar.

Araştırma yaparak bulmuşsunuz işte.Demek ki önceden bulamamışsınız.Dalga geçtiğiniz kişinin profiline bakın bi isterseniz.

Beğenenlerin sayısı çok ise, hepsini elde etmek için beğenenlerin bulunduğu sekmede aşağı kaydırmak gerek. Bunun için orada bulunan herhangi bir butonu bulup, kodun sonuna .send_keys(Keys.PAGE_DOWN) ekleyebilirsiniz. Sekmenin sonuna ulaşıp ulaşmadığını kontrol etmek için de bir döngü oluşturup, döngünün başında ve sonunda beğenenlerin sayısını çekerek onları karşılaştırabilirsiniz. Eğer sayı aynı ise döngüyü doğrudan durdurabilir veya bunun için bir sayaç tanımlayıp sayac değerine 1 ekleyebilirsiniz.
Beğenenlerin isimlerini elde ederken de find_elements ile veya tüm isimleri kapsayan bir sınıfı bulup find_element ile çekebilirsiniz. Kodun sonuna .text eklerseniz istediğinizi elde edebilirsiniz diye düşünüyorum.