Python Selenium Instagram Bot Yapımı
Python Selenium Instagram Bot Yapımı
Merhaba arkadaşlar bu günkü yazımda python selenium modülünü kullanarak instagram için basit bir bot geliştireceğiz. Bu botu geliştirirken en azından ortalama düzeyde Python veya yazılım bilgisine sahip olmanız gerekiyor aksi taktirde yazılan bazı yerleri anlamakta zorluk çekebilirsiniz, en azından Python class, fonksiyon ve self yapısını bilmeniz gerekiyor.
Selenium kurulumu ve Web Driveri indirmek için buradaki yazıya bakın.
Kütüphaneleri Ekleyelim
from time import sleep ## Saniye bazlı geciktirme işlemi yapabilmemiz için gereken kütüphane from selenium.common.exceptions import NoSuchElementException ## Selenium hata ayıklamaları için gerekli kütüphane from selenium.webdriver.common.keys import Keys ## Selenium ile birlikte klavyeyi simüle etmemize yarayan kütüphane from selenium import webdriver ## Selenium web driver kütüphanesi tarayiciDriverKonum = "C:\\Users\\ahmet\\Desktop\\Python\\Selenium\\geckodriver.exe" ## Web driver konumu
**Web Driver olarak hangi tarayıcıyı kullanıyorsanız kodları ona göre düzenlemeniz gerekiyor, ben bu botu firefox baz alarak yazıyorum.
Class Oluşturup İlk Fonksiyonumuzu Yazalım
Kütüphaneleri eklediğimize göre devam edelim, şimdi Instagram adında bir class oluşturalım ve classımızın içerisine fonksiyonlarımızı yazmaya başlayalım.
class Instagram: def __init__(self, tarayiciKonum, url="https://www.urhoba.net", kullaniciAdi="kullanıcı adı", sifre="şifre"): self.tarayici = webdriver.Firefox(executable_path=tarayiciDriverKonum) self.url = url self.girisurl = "https://www.instagram.com/accounts/login/" self.kullaniciAdi = kullaniciAdi self.sifre = sifre self.girisYapilmismi = False self.tumTakipciler = [] self.tumTakipEdilenler = []
Burada ilk fonksiyonumuz "def __init__ (self, a,b,c)" bu fonksiyonu burada basit bir şekilde açıklamak istiyorum.
__init__ fonksiyonu python da class a özgü değişkenler atamamızı ve class ı çağırırken değiştirebileceğimiz, ekleyebileceğimiz değişkenler oluşturmamızı sağlar.
Biz Instagram için bot hazırlarken __init__ ile bazı değişkenleri burada tanımlayacağız ki ileride yazacağımız fonksiyonlar içerisinde kullanıcıya sormadan direkt olarak bize gerekli olan bilgiyi buradan çekebilelim diye.
Bu __init__ kısmında bu botu yazarken aslında en önemli kısım self.tarayici kısmı olduğunu söyleyebilirim çünkü yaptığımız bütün işlemleri bu tarayıcı değişkeni sayesinde yapacağız.
Tarayıcıyıcı Açma ve Kapatma Fonksiyonlarımızı Yazalım
__init__ kısmının ne işe yaradığını basit olarak anlattığımıza göre artık selenium kontrolünde tarayıcıyı açmak ve kapatmak için gerekli fonksiyonlarımızı oluşturalım.
def TarayiciAc(self): try: self.tarayici.get(self.url) print("Tarayıcı açıldı.") self.tarayici.implicitly_wait(10) except: print("Tarayıcı açılırken bir sorun ile karşılaşıldı!") def TarayiciKapat(self): self.tarayici.close()
Tarayıcıyı açma fonksiyonunda try ve except komutlarını görmüşsünüzdür, bunlar bir hata olduğu zaman kullanıcıya direkt sistemin çökmesi yerine kullanıcıya bilinçli bir şekilde hata mesajları göstermek için kullandığımız komutlardır.
Selenium kütüphanesinde tarayıcımızı belirledikten sonra ".get("siteadresi")" ile tarayıcı açılır ve açılması istenen siteye gidilir,".implicity_wait(süre)" komutu ile sayfa yüklenene kadar bir gecikme konulur.
".close()" komutu ile birlikte tarayıcı kapatılır. bizler bunları fonksiyonların içerisine attık ki botumuz tamamen bittiği zaman bunların hepsini peş peşe sıralayıp çok daha kolay bir şekilde kullanabilelim diye.
Instagram Hesabına Giriş Yapma Fonksiyonumuzu Yazalım
Şimdi herhangi bir instagram hesabına giriş yapma kısmının kodlarını yazalım.
def GirisYap(self, url): try: self.tarayici.get(url) self.tarayici.implicitly_wait(10) kullaniciAdiInput = self.tarayici.find_element_by_css_selector( "input[name='username']") sifreInput = self.tarayici.find_element_by_css_selector( "input[name='password']") girisButon = self.tarayici.find_element_by_xpath( "//button[@type='submit']") kullaniciAdiInput.send_keys(self.kullaniciAdi) sifreInput.send_keys(self.sifre) girisButon.click() print("Hesaba başarılı bir şekilde giriş yapıldı.") self.girisYapilmismi = True sleep(10) except: print("Hesaba giriş yapılırken bir sorun ile karşılaşıldı!")
Burada "GirisYap(self, url)" şeklinde bir fonksiyon tanımladık. self ile __init__ içerisinde bulunan değişkenleri çekebiliyoruz ve buna ek olarak kullanıcıdan bir adet url istedim çünkü buraya kullanıcı instagramın kullanıcı giriş sayfasını eklemesi daha iyi olacaktır.
Sonrasında kullanıcıAdiInput adında bir değişken oluşturduk ve selenium özelligi olan css selector kullanarak kullanıcı adı giriş inputunu seçtirdik, aynısını şifre içinde yaptıktan sonra birde giriş butonu için yapıyoruz.
Bu seçmeleri yapmak için instagram giriş sayfasında f12 tuşuna basın ve sonra seçmek istediğiniz inputun üzerine sağ tıklayın "incele" (Edge) seçeneğine basın, sonra sağ taraftaki yerde sağ tıklayın ve "copy" yazan yerden hangisini kullanmak isterseniz onu seçin. Tabi seçtiğiniz kopyalama yöntemine göre kodlarınızda değişiklik yapmayı unutmayın.
Örneğin xpath seçtiyseniz css_selector yerine "self.tarayici.find_element_by_xpath" yapmayı unutmayın.
kullanıcı adı ve şifre inputlarını seçtiğimiz için artık ".send_keys("")" komutu ile bu inputların içerisine kullanıcı adı ve şifremizi girmesini sağlıyoruz.
girisButon.click() komutu ile giriş butonuna tıklamasını sağlıyoruz. __init__ içerisinde giriş yapılmışmı boolunu true yapıyoruz.
Bu boolu ileride takip etme veya takipten çıkma işlemlerinde güvenlik amacı ile oluşturduğumuzu söylemeliyim.
Takip Et ve Takipten Çık Fonksiyonlarını Yazalım
def TakipEt(self, kullaniciAdi): if self.girisYapilmismi == True: try: self.tarayici.get(self.url + kullaniciAdi) self.tarayici.implicitly_wait(10) takipEtButton = self.tarayici.find_element_by_css_selector( 'button') if takipEtButton.text == "Takip Et": takipEtButton.click() print(kullaniciAdi + " Takip edildi") else: print(kullaniciAdi + " Zaten takip ediliyor..") except: print(kullaniciAdi + " Takip edilirken bir hata ile karşılaşıldı!") else: print("Lütfen birini takip etmek için önce bir hesap ile giriş yapın!") def TakiptenCik(self, kullaniciAdi): if self.girisYapilmismi == True: try: self.tarayici.get(self.url + kullaniciAdi) self.tarayici.implicitly_wait(10) takiptenCikButton1 = self.tarayici.find_element_by_xpath( '//*[@id="react-root"]/section/main/div/header/section/div[1]/div[1]/div/div[2]/div/span/span[1]/button/div/span') takiptenCikButton1.click() self.tarayici.implicitly_wait(10) takiptenCikButton2 = self.tarayici.find_element_by_xpath( '/html/body/div[4]/div/div/div/div[3]/button[1]') if takiptenCikButton2.text == "Takibi Bırak": takiptenCikButton2.click() self.tarayici.implicitly_wait(10) print(kullaniciAdi + " Takipten çıkıldı.") except: print(kullaniciAdi + "Takipten çıkılırken bir sorun ile karşılaşıldı!") else: print("Lütfen birini takipten çıkmak için önce bir hesap ile giriş yapın!")
Profil Analiz Fonksiyonu Yazalım
def ProfilAnaliz(self, kullaniciAdi): try: self.tarayici.get(self.url + kullaniciAdi) self.tarayici.implicitly_wait(10) gonderiSayisi = self.tarayici.find_element_by_xpath( '/html/body/div[1]/section/main/div/header/section/ul/li[1]/a/span') takipciSayisi = self.tarayici.find_element_by_xpath( '/html/body/div[1]/section/main/div/header/section/ul/li[2]/a/span') takipEdilenSayisi = self.tarayici.find_element_by_xpath( '/html/body/div[1]/section/main/div/header/section/ul/li[3]/a/span') kullaniciIsim = self.tarayici.find_element_by_xpath( '/html/body/div[1]/section/main/div/header/section/div[2]/h1') kullaniciBio = self.tarayici.find_element_by_xpath( '/html/body/div[1]/section/main/div/header/section/div[2]/span') kullaniciURL = self.tarayici.find_element_by_xpath( '/html/body/div[1]/section/main/div/header/section/div[2]/a') print("Hesap : " + kullaniciAdi + "\nİsim : " + kullaniciIsim.text + "\nBiyografi : " + kullaniciBio.text + "\nURL : " + kullaniciURL.text + "\nGönderi sayısı : " + gonderiSayisi.text + "\nTakipci sayısı : " + takipciSayisi.text + "\nTakip edilen sayısı : " + takipEdilenSayisi.text) except: print(kullaniciAdi + " Profili analiz edilirken bir sorun ile karşılaşıldı!")
Hesap Gizlimi Kontrol Etme
def HesapGizlimi(self, kullaniciAdi): try: self.tarayici.get(self.url + kullaniciAdi) self.tarayici.implicitly_wait(10) hesapGizlimi = self.tarayici.find_element_by_xpath( '/html/body/div[1]/section/main/div/div/article/div/div/h2') if hesapGizlimi.text == "Bu Hesap Gizli": return True else: return False except NoSuchElementException: return False else: print("Hesap gizlimi kontrol edilirken bir sorun ile karşılaşıldı!")
Takip Edenleri ve Takip Ettiklerimizi Gösteren Fonksiyonu Yazalım
Takip Edenleri bulmak için kodumuz
def TakipEdenleriGoster(self, kullaniciAdi, gosterGizle = False): if self.HesapGizlimi(kullaniciAdi): print("Hesap gizli olduğu için takip edenleri göremiyorum!") else: self.tarayici.get(self.url + kullaniciAdi) self.tarayici.implicitly_wait(10) takipEdenlerLink = self.tarayici.find_element_by_xpath( "//*[@id='react-root']/section/main/div/header/section/ul/li[2]/a").click() self.tarayici.implicitly_wait(10) pencere = self.tarayici.find_element_by_css_selector("div[role=dialog] ul") takipEdenSayac = len(pencere.find_elements_by_css_selector("li")) print("Şu anda "+ str(takipEdenSayac) +" takip edeniniz var.") self.action = webdriver.ActionChains(self.tarayici) pencere.click() while True: self.action.key_down(Keys.END).key_up(Keys.SPACE).perform() sleep(5) yeniSayac = len(pencere.find_elements_by_css_selector("li")) if takipEdenSayac != yeniSayac: takipEdenSayac = yeniSayac print("Toplam takipçi " + str(yeniSayac)) self.tarayici.implicitly_wait(15) else: break takipciler = pencere.find_elements_by_css_selector("li") for hesap in takipciler: link = hesap.find_element_by_css_selector("a").get_attribute("href") self.tumTakipciler.append(link) if gosterGizle: print(link)
Takip Edilenleri bulmak için kod
def TakipEttikleriniGoster(self, kullaniciAdi, gosterGizle = False): if self.HesapGizlimi(kullaniciAdi): print("Hesap gizli olduğu için takip ettiklerini göremiyorum!") else: self.tarayici.get(self.url + kullaniciAdi) self.tarayici.implicitly_wait(10) takipEttikleriLink = self.tarayici.find_element_by_xpath( "//*[@id='react-root']/section/main/div/header/section/ul/li[3]/a").click() self.tarayici.implicitly_wait(10) pencere = self.tarayici.find_element_by_css_selector("div[role=dialog] ul") takipEttikleriSayac = len(pencere.find_elements_by_css_selector("li")) print("Şu anda "+ str(takipEttikleriSayac) +" kişiyi takip ediyorsunuz.") self.action = webdriver.ActionChains(self.tarayici) pencere.click() while True: self.action.key_down(Keys.END).key_up(Keys.SPACE).perform() sleep(5) yeniSayac = len(pencere.find_elements_by_css_selector("li")) if takipEttikleriSayac != yeniSayac: takipEttikleriSayac = yeniSayac print("Toplam takip ettiğin " + str(yeniSayac)) self.tarayici.implicitly_wait(15) else: break takipedilenler = pencere.find_elements_by_css_selector("li") for hesap in takipedilenler: link = hesap.find_element_by_css_selector("a").get_attribute("href") self.tumTakipEdilenler.append(link) if gosterGizle: print(link)
Takip Etmeyenlerin Bulunması
def TakipEtmeyenler(self): if len(self.tumTakipEdilenler) != 0 and len(self.tumTakipciler) != 0: print("Takip Etmeyenler") for takipEdilenler in self.tumTakipEdilenler: if takipEdilenler not in self.tumTakipciler: print(takipEdilenler) else: print("Lütfen ilk olarak takipcileri ve takip edilenleri gösterin!")
Şimdi gelelim bu yazdığımız class ı nasıl kullanacağız ?
Ins = Instagram(tarayiciDriverKonum, "https://instagram.com/", "kullanıcı adı", "şifre") Ins.TarayiciAc() Ins.ProfilAnaliz("urhob") Ins.GirisYap("https://www.instagram.com/accounts/login/") Ins.TakipEdenleriGoster("urhoba",True) Ins.TakipEttikleriniGoster("urhoba",True) Ins.TakipEtmeyenler() Ins.TakiptenCik("urhoba") Ins.TakipEt("urhoba") Ins.TarayiciKapat()
Herhangi bir değişken oluşturup sonrasında sınıfımızı çekecek, gerekli bilgileri gireceğiz ve kullanmak istediğimiz fonksiyonları yazacağız. Kullanmak istediğimiz fonksiyonları yazarken dikkat etmemiz gereken bir kaç koşul var bunlar
Birini takip etmek veya takipten çıkmak için ilk olarak giriş fonksiyonunu çağırmanız gerekiyor.
Birinin takip etmeyenlerini bulmak için ilk olarak takip edenler ve takip edilenler fonksiyonunu çağırmanız sonrasında takip etmeyenler fonksiyonunu çağırmanız gerekiyor.
Not : Eğer işlemler bittikten sonra konsol hemen kapanıyorsa kodlarınızın sonuna "print(input())" ekleyin. Böylelikle siz konsolda herhangi bir tuşa basıp yollayana kadar bekleyecektir.
Kullandığımız kodların tümü
from time import sleep ## Saniye bazlı geciktirme işlemi yapabilmemiz için gereken kütüphane from selenium.common.exceptions import NoSuchElementException ## Selenium hata ayıklamaları için gerekli kütüphane from selenium.webdriver.common.keys import Keys ## Selenium ile birlikte klavyeyi simüle etmemize yarayan kütüphane from selenium import webdriver ## Selenium web driver kütüphanesi tarayiciDriverKonum = "C:\\Users\\ahmet\\Desktop\\Python\\Selenium\\geckodriver.exe" ## Web driver konumu """ Özellikler Takip Et Takipten Çık Takip Edenler Takip Ettikleri Takip Etmeyenler Profil Analiz """ class Instagram: def __init__(self, tarayiciKonum, url="https://www.urhoba.net", kullaniciAdi="kullanıcı adı", sifre="şifre"): self.tarayici = webdriver.Firefox(executable_path=tarayiciDriverKonum) self.url = url self.girisurl = "https://www.instagram.com/accounts/login/" self.kullaniciAdi = kullaniciAdi self.sifre = sifre self.girisYapilmismi = False self.tumTakipciler = [] self.tumTakipEdilenler = [] def TarayiciAc(self): try: self.tarayici.get(self.url) print("Tarayıcı açıldı.") self.tarayici.implicitly_wait(10) except: print("Tarayıcı açılırken bir sorun ile karşılaşıldı!") def TarayiciKapat(self): self.tarayici.close() def GirisYap(self, url): try: self.tarayici.get(url) self.tarayici.implicitly_wait(10) kullaniciAdiInput = self.tarayici.find_element_by_css_selector( "input[name='username']") sifreInput = self.tarayici.find_element_by_css_selector( "input[name='password']") girisButon = self.tarayici.find_element_by_xpath( "//button[@type='submit']") kullaniciAdiInput.send_keys(self.kullaniciAdi) sifreInput.send_keys(self.sifre) girisButon.click() print("Hesaba başarılı bir şekilde giriş yapıldı.") self.girisYapilmismi = True sleep(10) except: print("Hesaba giriş yapılırken bir sorun ile karşılaşıldı!") def TakipEt(self, kullaniciAdi): if self.girisYapilmismi == True: try: self.tarayici.get(self.url + kullaniciAdi) self.tarayici.implicitly_wait(10) takipEtButton = self.tarayici.find_element_by_css_selector( 'button') if takipEtButton.text == "Takip Et": takipEtButton.click() print(kullaniciAdi + " Takip edildi") else: print(kullaniciAdi + " Zaten takip ediliyor..") except: print(kullaniciAdi + " Takip edilirken bir hata ile karşılaşıldı!") else: print("Lütfen birini takip etmek için önce bir hesap ile giriş yapın!") def TakiptenCik(self, kullaniciAdi): if self.girisYapilmismi == True: try: self.tarayici.get(self.url + kullaniciAdi) self.tarayici.implicitly_wait(10) takiptenCikButton1 = self.tarayici.find_element_by_xpath( '//*[@id="react-root"]/section/main/div/header/section/div[1]/div[1]/div/div[2]/div/span/span[1]/button/div/span') takiptenCikButton1.click() self.tarayici.implicitly_wait(10) takiptenCikButton2 = self.tarayici.find_element_by_xpath( '/html/body/div[4]/div/div/div/div[3]/button[1]') if takiptenCikButton2.text == "Takibi Bırak": takiptenCikButton2.click() self.tarayici.implicitly_wait(10) print(kullaniciAdi + " Takipten çıkıldı.") except: print(kullaniciAdi + "Takipten çıkılırken bir sorun ile karşılaşıldı!") else: print("Lütfen birini takipten çıkmak için önce bir hesap ile giriş yapın!") def ProfilAnaliz(self, kullaniciAdi): try: self.tarayici.get(self.url + kullaniciAdi) self.tarayici.implicitly_wait(10) gonderiSayisi = self.tarayici.find_element_by_xpath( '/html/body/div[1]/section/main/div/header/section/ul/li[1]/a/span') takipciSayisi = self.tarayici.find_element_by_xpath( '/html/body/div[1]/section/main/div/header/section/ul/li[2]/a/span') takipEdilenSayisi = self.tarayici.find_element_by_xpath( '/html/body/div[1]/section/main/div/header/section/ul/li[3]/a/span') kullaniciIsim = self.tarayici.find_element_by_xpath( '/html/body/div[1]/section/main/div/header/section/div[2]/h1') kullaniciBio = self.tarayici.find_element_by_xpath( '/html/body/div[1]/section/main/div/header/section/div[2]/span') kullaniciURL = self.tarayici.find_element_by_xpath( '/html/body/div[1]/section/main/div/header/section/div[2]/a') print("Hesap : " + kullaniciAdi + "\nİsim : " + kullaniciIsim.text + "\nBiyografi : " + kullaniciBio.text + "\nURL : " + kullaniciURL.text + "\nGönderi sayısı : " + gonderiSayisi.text + "\nTakipci sayısı : " + takipciSayisi.text + "\nTakip edilen sayısı : " + takipEdilenSayisi.text) except: print(kullaniciAdi + " Profili analiz edilirken bir sorun ile karşılaşıldı!") def HesapGizlimi(self, kullaniciAdi): try: self.tarayici.get(self.url + kullaniciAdi) self.tarayici.implicitly_wait(10) hesapGizlimi = self.tarayici.find_element_by_xpath( '/html/body/div[1]/section/main/div/div/article/div/div/h2') if hesapGizlimi.text == "Bu Hesap Gizli": return True else: return False except NoSuchElementException: return False else: print("Hesap gizlimi kontrol edilirken bir sorun ile karşılaşıldı!") def TakipEdenleriGoster(self, kullaniciAdi, gosterGizle = False): if self.HesapGizlimi(kullaniciAdi): print("Hesap gizli olduğu için takip edenleri göremiyorum!") else: self.tarayici.get(self.url + kullaniciAdi) self.tarayici.implicitly_wait(10) takipEdenlerLink = self.tarayici.find_element_by_xpath( "//*[@id='react-root']/section/main/div/header/section/ul/li[2]/a").click() self.tarayici.implicitly_wait(10) pencere = self.tarayici.find_element_by_css_selector("div[role=dialog] ul") takipEdenSayac = len(pencere.find_elements_by_css_selector("li")) print("Şu anda "+ str(takipEdenSayac) +" takip edeniniz var.") self.action = webdriver.ActionChains(self.tarayici) pencere.click() while True: self.action.key_down(Keys.END).key_up(Keys.SPACE).perform() sleep(5) yeniSayac = len(pencere.find_elements_by_css_selector("li")) if takipEdenSayac != yeniSayac: takipEdenSayac = yeniSayac print("Toplam takipçi " + str(yeniSayac)) self.tarayici.implicitly_wait(15) else: break takipciler = pencere.find_elements_by_css_selector("li") for hesap in takipciler: link = hesap.find_element_by_css_selector("a").get_attribute("href") self.tumTakipciler.append(link) if gosterGizle: print(link) def TakipEttikleriniGoster(self, kullaniciAdi, gosterGizle = False): if self.HesapGizlimi(kullaniciAdi): print("Hesap gizli olduğu için takip ettiklerini göremiyorum!") else: self.tarayici.get(self.url + kullaniciAdi) self.tarayici.implicitly_wait(10) takipEttikleriLink = self.tarayici.find_element_by_xpath( "//*[@id='react-root']/section/main/div/header/section/ul/li[3]/a").click() self.tarayici.implicitly_wait(10) pencere = self.tarayici.find_element_by_css_selector("div[role=dialog] ul") takipEttikleriSayac = len(pencere.find_elements_by_css_selector("li")) print("Şu anda "+ str(takipEttikleriSayac) +" kişiyi takip ediyorsunuz.") self.action = webdriver.ActionChains(self.tarayici) pencere.click() while True: self.action.key_down(Keys.END).key_up(Keys.SPACE).perform() sleep(5) yeniSayac = len(pencere.find_elements_by_css_selector("li")) if takipEttikleriSayac != yeniSayac: takipEttikleriSayac = yeniSayac print("Toplam takip ettiğin " + str(yeniSayac)) self.tarayici.implicitly_wait(15) else: break takipedilenler = pencere.find_elements_by_css_selector("li") for hesap in takipedilenler: link = hesap.find_element_by_css_selector("a").get_attribute("href") self.tumTakipEdilenler.append(link) if gosterGizle: print(link) def TakipEtmeyenler(self): if len(self.tumTakipEdilenler) != 0 and len(self.tumTakipciler) != 0: print("Takip Etmeyenler") for takipEdilenler in self.tumTakipEdilenler: if takipEdilenler not in self.tumTakipciler: print(takipEdilenler) else: print("Lütfen ilk olarak takipcileri ve takip edilenleri gösterin!") Ins = Instagram(tarayiciDriverKonum, "https://instagram.com/", "kullanıcı adı", "şifre") Ins.TarayiciAc() Ins.ProfilAnaliz("urhob") Ins.GirisYap("https://www.instagram.com/accounts/login/") Ins.TakipEdenleriGoster("urhoba",True) Ins.TakipEttikleriniGoster("urhoba",True) Ins.TakipEtmeyenler() Ins.TakiptenCik("urhoba") Ins.TakipEt("urhoba") Ins.TarayiciKapat() print(input())
Bu projenin kaynak kodlarına GitHub üzerinden bakabilirsiniz.
4 yorum