Selenium ile Instagram'da Takipten Çıkanları Bulmak

08 Eylül 2023

1. Giriş

Instagram’da karşılıksız takip ettiğimiz hesapları bulmak için 3. taraf uygulamalara giriş bilgilerimizi vermek yerine kendimiz Selenium ile web scraping metodunu kullanarak istediğimiz analizleri gerçekleştirebiliriz. İlk adım olarak gerekli kütüphaneleri import edelim.

import os\nimport random\nimport time\nfrom selenium import webdriver\nfrom selenium.webdriver.chrome.service import Service\nfrom selenium.webdriver.common.by import By

2. Instagram Sınıfı

Instagram sınıfı, takipçi analizi için kullanacağımız metodları ve attribute'ları barındırıyor. Sınıfın oluşturucusunda Selenium için Firefox tarayıcısı kuruluyor. Firefox tarayıcısı kurulurken gerçek bir user agent ayarlamak Instagram'ın robot olduğumuzu fark etmemesi için önemli. Siz de Firefox Driver'ı kullanmak isterseniz buradan indirip Python dosyanızla aynı yere FirefoxDriver adında bir klasör oluşturup geckodriver'ı içine koyabilirsiniz.

class Instagram:\n\tdef __init__(self, username: str, password: str):\n\t\toptions = webdriver.FirefoxOptions()\n\t\toptions.set_preference("general.useragent.override",\n\t\t\t\t\t"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/117.0")\n\t\tservice = Service(executable_path="FirefoxDriver/geckodriver")\n\t\tself.__browser = webdriver.Firefox(options=options, service=service)\n\t\tself.__url = "https://www.instagram.com/"\n\t\tself.__loginUrl = "https://www.instagram.com/"\n\t\tself.__username = username\n\t\tself.__password = password\n\t\tself.followers = []\n\t\tself.followings = []\n\t@staticmethod\n\tdef __sleep_randomly(minimum_interval: int = 1):\n\t\tpass\n\tdef __write_file(self, items: list):\n\t\tpass\n\tdef login(self):\n\t\tpass\n\tdef __enter_verification_code(self):\n\t\tpass\n\tdef pick_nonfollowers(self, profile_url: str):\n\t\tpass\n\tdef __get_followings(self, profile_url: str):\n\t\tpass\n\tdef __get_followers(self, profile_url: str):\n\t\tpass\n\tdef __pick_items(self, mode) -> list:\n\t\tpass

3. Yardımcı Metodlar

sleep_randomly metodu [minimum_interval, minimum_interval + 1) saniye aralığında bir süre beklemek için kullanılıyor. Yine robot olduğumuzun anlaşılmaması için işin içine biraz rastgelelik katmak gerekli.

@staticmethod\ndef __sleep_randomly(minimum_interval: int = 1):\n\tinterval = (random.random() + minimum_interval)\n\ttime.sleep(interval)

write_file metodu ise topladığımız verileri nonfollowers.txt dosyasına yazdırmak için kullanılıyor.

def __write_file(self, items: list):\n\tfile = open("nonfollowers.txt", "w+")\n\tfile.write("Followings:" + os.linesep)\n\tfor item in self.followings:\n\t\tfile.write(item + os.linesep)\n\tfile.write("Followers:" + os.linesep)\n\tfor item in self.followers:\n\t\tfile.write(item + os.linesep)\n\tfile.write("Nonfollowers:" + os.linesep)\n\tfor item in items:\n\t\tfile.write(item + os.linesep)

4. Giriş Yapma

login metodu sınıf attribute'larındaki kullanıcı adı ve şifreyi gerekli input alanlarına girip giriş yap butonuna tıklamak için kullanılıyor.

def login(self):\n\tself.__browser.get(self.__loginUrl)\n\tself.__sleep_randomly(15)\n\tusername_input = self.__browser.find_element(by=By.CSS_SELECTOR, value="input[name=username]")\n\tpassword_input = self.__browser.find_element(by=By.CSS_SELECTOR, value="input[name=password]")\n\tlogin_button = self.__browser.find_element(by=By.CSS_SELECTOR, value="button[type=submit]")\n\tusername_input.send_keys(self.__username)\n\tself.__sleep_randomly()\n\tpassword_input.send_keys(self.__password)\n\tself.__sleep_randomly()\n\tlogin_button.click()\n\tself.__sleep_randomly(20)\n\tself.__enter_verification_code()
Kullanıcı adı input elementi
Şifre input elementi
Giriş yap butonu

5. İki Adımlı Doğrulama Kodunu Girme

Eğer hesabınızda iki adımlı doğrulama etkinse bu metod consoldan girilen 2FA kodunu input alanına girip göndermek için kullanılıyor.

def __enter_verification_code(self):\n\tverification_code_input = self.__browser.find_element(by=By.CSS_SELECTOR,\n\t\t\t\t\t\t\t\t\t value="input[name=verificationCode]")\n\tsubmit_button = self.__browser.find_element(by=By.CSS_SELECTOR, value="button[type=button]")\n\tverification_code = input("Enter 2FA code: ")\n\tverification_code_input.send_keys(verification_code)\n\tself.__sleep_randomly()\n\tsubmit_button.click()\n\tself.__sleep_randomly(20)
Doğrulama kodu input elementi
Doğrulama kodu onaylama butonu

6. Takip Etmeyenleri Bulma

pick_nonfollowers metodu ilk önce takip ettiğimiz hesapları daha sonra da takipçilerimizi toplayıp takip ettiğimiz hesaplardan hangilerinin takipçi listemizde olmadığını buluyor.

def pick_nonfollowers(self, profile_url: str):\n\tnonfollowers = []\n\tself.__get_followings(profile_url)\n\tself.__get_followers(profile_url)\n\tfor item in self.followings:\n\t\tif item not in self.followers:\n\t\t\tnonfollowers.append(item)\n\t\t\tprint(item)\n\tself.__write_file(nonfollowers)
def __get_followings(self, profile_url: str):\n\tself.__browser.get(profile_url + "/following/")\n\tself.__sleep_randomly(20)\n\tself.followings = self.__pick_items("followings")
def __get_followers(self, profile_url: str):\n\tself.__browser.get(profile_url + "/followers/")\n\tself.__sleep_randomly(20)\n\tself.followers = self.__pick_items("followers")
Programın en önemli metodu olan pick_items metodu açılan takipçi veya takip edilen listesinden profillerin adreslerini topluyor. Yeni kullanıcı eklenmeyene kadar stilinde overflow-y: scroll olan element aşağıya kaydırıyor.
def __pick_items(self, mode) -> list:\n\tlinks = []\n\telements = []\n\twhile True:\n\t\telements = self.__browser.find_elements(by=By.CSS_SELECTOR, value="div[role=dialog] a[href]")\n\t\telement_count = len(elements)\n\t\tif mode == "followings":\n\t\t\tself.__browser.execute_script(\n\t\t\t"document.querySelectorAll('div[role=dialog]')[1].childNodes[0].childNodes["\n\t\t\t"0].childNodes[3].scrollTop += 1500")\n\t\telse:\n\t\t\tself.__browser.execute_script(\n\t\t\t"document.querySelectorAll('div[role=dialog]')[1].childNodes[0].childNodes["\n\t\t\t"0].childNodes[2].scrollTop += 1500")\n\t\tself.__sleep_randomly(5)\n\t\telements = self.__browser.find_elements(by=By.CSS_SELECTOR, value="div[role=dialog] a[href]")\n\t\tif len(elements) == element_count:\n\t\t\tbreak\n\tfor element in elements:\n\t\tlinks.append(element.get_attribute("href"))\n\treturn list(set(links))
Takip edilenleri kaydırmak için seçilen element
Takipçileri kaydırmak için seçilen element
Kullanıcının linki için seçilen element

7. Kullanım

Programı çalıştırmak için kullanıcı adı ve şifrenizle Instagram sınıfının örneğini oluşturup login metodunu çalıştırmak, sonrasında da karşılıksız takip ettiği hesapları analiz edeceğimiz profil adresi ile beraber pick_nonfollowers metodunu çalıştırmak yeterli.

if __name__ == '__main__':\n\tinstagram = Instagram("mert_ozgen", "enter_your_password_here")\n\tinstagram.login()\n\tinstagram.pick_nonfollowers("https://www.instagram.com/mert_ozgen")