Python + Selenium Instagram Fotoğraf Beğeni Botu, Instagram Photo Like Automation

Python3 kütüphanelerinden biri olan Selenium ile bir instagram botu veya instagram otomasyonu kodlayacağız. Selenium ve Chrome Webdriver'ını kullanarak programımızı yapacağız. Ek olarak yüklü gelen time kütüphanesinden de yararlanacağız.

,


Import İşlemleri ve Ana Sayfaya Gitmek

from selenium import webdriver
from time import sleep
driver = webdriver.Chrome()
driver.get('https://www.instagram.com') #Go to instagram login page.
sleep(2) #Wait for loading page.

İlk satırlarda selenium içerisinden webdriver'ı; time içerisinden ise sleep fonksiyonunu projemize dahil edeceğiz.
3. satırda Chrome Webdriver'ını başlatıyoruz. Ve bir sonraki satırda get() komutunun içine, adres parametresi olarak instagram'ın adresini veriyoruz. Ve sayfa doğru düzgün yüklenene kadar bekleyeceğiz. Ben iki saniye yeter diye düşünüyorum.

Input ve Buttonu Bulmak

Instagram hesabına giriş yapmak için doğru input alanına doğru değerleri yazıp, giriş yap butonuna tıklamamız gerekiyor. Input'ları bulmak için name sıfatlarını kullanacağız. Kullanıcı adı inputunun name sıfatı username, şifre inputunun name sıfatı ise password olarak belirlenmiş. Input'lara yazı yazabilmek, içini doldurmak için send_keys() fonksiyonunu kullanacağız.

Butonu bulabilmek için find_element_by_xpath() fonksiyonunun içine geçerli sayfada var olan ve type sıfatı submit olan bir button elementi bul anlamına gelen bir string vereceğiz. Button'ları kullanmak için ise yani tıklamak için click() fonksiyonunu çalıştaracağız.

Ve en sonda giriş işlemini yine 2 saniye bekleyeceğiz.

username = driver.find_element_by_name('username').send_keys('KULLANICI ADI') 
password = driver.find_element_by_name('password').send_keys('ŞİFRE')
girisbutton = driver.find_element_by_xpath('//button[@type="submit"]').click() #Log-in button
sleep(2) 

Şimdi Değil Butonları

Giriş yapıldıktan sonra iki kere kullanıcıya soru soruyor instagram. Birincisi şifreyi kaydetmek ikincisi ise bildirimlere izin vermek konusunda. İkisini de içinde şimdi değil yazan butonlara tıklayıp atlayacağız. 

Butonların içerisinde yazan yazı farklı dillerde farklı olacaktır. Türkçede 'Şimdi Değil', İngilizcede 'Not Now' gibi değişiklik gösterecektir. 

Bu butonlara erişmek için find_element_by_xpath() fonksiyonuna başvuracağız yine. Bu fonksiyonu, içinde Şimdi Değil yazan butonu bul anlamına gelen bir string ile çalıştaracağız. Ve her ikisinden sonra da sleep() ile biraz bekleyeceğiz.

simdidegil = driver.find_element_by_xpath('//button[contains(text(), "Şimdi Değil")]').click() #Answer to 'save your password?'
sleep(1.5)
simdidegil = driver.find_element_by_xpath('//button[contains(text(), "Şimdi Değil")]').click() #Answer to 'open notification?'
sleep(0.5)

Kullanıcı Aramak ve Hedef Profile Gitmek

Fotoğraflarını beğeneceğimiz kullanıcıyı bulmak için ilk önce instagram'ın arama kutusuna, hedef profilimizin ismini yazacağız. Daha sonra çıkan ilk öneriye tıklayarak profili görünteleyeceğiz.

Arama kutusunu bulmak için find_element_by_xpath() kullanacağız gene ve bu sefer geçerli sayfadaki input'lar içerisinden type sıfatı text olan elementi bul diyeceğiz.

Çıkan ilk öneriye gitmek için ise kolay yolu kullanacağız. Arama kutusuna rastgele bir şeyler yazın ve çıkan ilk önerinin a elementinin xpath yolunu kopyalacağız ve aynı fonksiyonu kullanacağız.


 

aramakutusu = driver.find_element_by_xpath('//input[@type="text"]').send_keys('HEDEF HESAP') #The search bar that we type target username
sleep(2) #Wait for loading suggestions
profile = driver.find_element_by_xpath('//*[@id="react-root"]/section/nav/div[2]/div/div/div[2]/div[3]/div[2]/div/a[1]').click() #Click on the first suggestion
sleep(3) #Wait for loading target profile

Sayfanın En Aşağısına Gitmek ve Tüm Fotoğrafları Yüklemek

Instagram profildeki fotoğrafların ilk önce bir kısmını yüklüyor. Sayfanın en aşağısına gittiğinizde ise bir kısmını daha yüklüyor. Tüm fotoğrafları yüklemek için fotoğraflar bitene kadar sürekli sayfanın aşağına kadar gitmeniz gerek. Bunun için bir fonksiyon yazacağız. Ve while loop kullanacağız. Sayfanın dibi olarak footer elementini referans alacağız. 

Footer elementini bulmak için find_element_by_tag_name() komutuna tag_name parametresini gireceğiz.

Daha sonra sayfanın geçerli yüksekliğini bulmak için bir JavaScript komutu çalıştaracağız. JS komutunu execute_script() adlı fonksiyon aracılığıyla yürüteceğiz. Daha sonra location_once_scrolled_into_view ile sayfayı footer elementini görene kadar indireceğiz. 

Ve birkaç saniye bekledikten sonra geçerli yükseklik ile sayfayı hareket ettirmeden önceki yüksekliği kıyaslayacağız. Eğer yeterli süre bekledikten sonra(bu internet bağlantısına göre değişebilir) yükseklik değişmemişse bu profilde başka fotoğraf olmadığı anlamına geliyor. Eğer değişmişse geçerli yüksekliği kaydedip, sayfayı tekrar en aşağıya kadar çekeceğiz ve yine kontrol edeceğiz.

def scrollAllWayDown():
    #This function scroll down to see the footer element and wait for a couple second. If page scroll length has changed then scroll again because that mean there is other pictures.
    global driver
    footer = driver.find_element_by_tag_name('footer') #The footer element
    last_height = driver.execute_script('return document.body.scrollHeight') #Before scroll down note scroll length
    while True:
        footer.location_once_scrolled_into_view #Scroll down to see footer
        sleep(2) #Wait for internet
        new_height = driver.execute_script('return document.body.scrollHeight') #Run javascript code again to check scroll length.
        if new_height == last_height: #If scroll height hasnt changed then there is no more pictures.
            print('sayfa bitti!!!')
            break
        else: #If it changed set the last height equal new height and repeat function.
            last_height = new_height

scrollAllWayDown()

Fotoğrafları Açmak ve Beğenmek

A) Fotoğrafları açmak için a elementlerini bulmalıyız ve click fonksiyonunu çalıştırmalıyız. Her fotoğrafın a elementi'ni bulmak için onların ayırt edici bir özellikleri olmalıdır. Ancak a elementleri'nde bizim kullanabileceğimiz bir sıfat yok. 

Ama onların parent elementi olan div elementlerinde ayırt edici olarak kullanabileceğimiz class sıfatları var. 

find_elements_by_class_name() kullanarak aynı class sıfatına sahip div elementlerini bulacağız. Sonra onların child elementi ve bizim hedefimiz olan a elementleri'ne erişeceğiz.

tumKutular = driver.find_elements_by_class_name('v1Nh3') #Every photo attribute has a parent div so first find divs
tumLinkler = []
for i in tumKutular:
    tumLinkler.append(i.find_element_by_tag_name('a')) #And find attribute in divs

B) Burada tumLinkler isimli bir dizi oluşturduk. Bu dizinin her üyesi tıklanabilir. Tıklayıp fotoğrafı açacağız ve kalp butonunu bulup, tıklayacağız. Ve yukarıdaki çıkış butonuna tıklayıp o fotoğrafı kapatmış olacağız. 

Kalp ve çıkış butonlarının xpath adreslerini kullanacağız. Bunun için elementi seçip, sağ tıklayıp, Copy Xpath ile xpath adresini temin edeceğiz. Ve find_element_by_xpath() 'in içine yapıştaracağız.



for i in tumLinkler:
    i.click() #Click link and open photo
    sleep(2)
    begenbuton = driver.find_element_by_xpath('/html/body/div[4]/div[2]/div/article/div[3]/section[1]/span[1]/button') 
    begenbuton.click() #Click heart button
    sleep(0.2)
    cikis = driver.find_element_by_xpath('/html/body/div[4]/div[3]/button').click() #Click exit button
    

Kodun Son Hali:

from selenium import webdriver
from time import sleep
driver = webdriver.Chrome()
driver.get('https://www.instagram.com') #Go to instagram login page.
sleep(2) #Wait for loading page.

username = driver.find_element_by_name('username').send_keys('YOUR USERNAME') 
password = driver.find_element_by_name('password').send_keys('YOUR PASSWORD')
girisbutton = driver.find_element_by_xpath('//button[@type="submit"]').click() #Log-in button
sleep(2) 

simdidegil = driver.find_element_by_xpath('//button[contains(text(), "Şimdi Değil")]').click() #Answer to 'save your password?'
sleep(1.5)
simdidegil = driver.find_element_by_xpath('//button[contains(text(), "Şimdi Değil")]').click() #Answer to 'open notification?'
sleep(0.5)

aramakutusu = driver.find_element_by_xpath('//input[@type="text"]').send_keys('HEDEF HESAP') #The search bar that we type target username
sleep(2) #Wait for loading suggestions
profile = driver.find_element_by_xpath('//*[@id="react-root"]/section/nav/div[2]/div/div/div[2]/div[3]/div[2]/div/a[1]').click() #Click on the first suggestion
sleep(3) #Wait for loading target profile

def scrollAllWayDown():
    #This function scroll down to see the footer element and wait for a couple second. If page scroll length has changed then scroll again because that mean there is other pictures.
    global driver
    footer = driver.find_element_by_tag_name('footer') #The footer element
    last_height = driver.execute_script('return document.body.scrollHeight') #Before scroll down note scroll length
    while True:
        footer.location_once_scrolled_into_view #Scroll down to see footer
        sleep(2) #Wait for internet
        new_height = driver.execute_script('return document.body.scrollHeight') #Run javascript code again to check scroll length.
        if new_height == last_height: #If scroll height hasnt changed then there is no more pictures.
            print('sayfa bitti!!!')
            break
        else: #If it changed set the last height equal new height and repeat function.
            last_height = new_height

scrollAllWayDown()

tumKutular = driver.find_elements_by_class_name('v1Nh3') #Every photo attribute has a parent div so first find divs
tumLinkler = []
for i in tumKutular:
    tumLinkler.append(i.find_element_by_tag_name('a')) #And find attribute in divs

for i in tumLinkler:
    i.click() #Click link and open photo
    sleep(2)
    begenbuton = driver.find_element_by_xpath('/html/body/div[4]/div[2]/div/article/div[3]/section[1]/span[1]/button') 
    begenbuton.click() #Click heart button
    sleep(0.2)
    cikis = driver.find_element_by_xpath('/html/body/div[4]/div[3]/button').click() #Click exit button
    

Yorum Gönder

1 Yorumlar