Я пытаюсь получить подписчиков с помощью python selenium. Но иногда питон щелкает сам по себе. Я хочу сделать программу без ошибок. Я пробовал, я пробовал конструкции "попробовать поймать", но это не сработало. Вот мой код:

def getFollowers(self):
        try:
            self.browser.get(f"https://www.instagram.com/{self.username}")
            time.sleep(2)
            followers=self.browser.find_element_by_xpath("//*[@id='react-root']/section/main/div/header/section/ul/li[2]/a").click()
            time.sleep(2)
            dialog=self.browser.find_element_by_xpath("/html/body/div[5]/div/div/div[2]")
            followerCount=len(dialog.find_elements_by_tag_name("li"))
            print(f"first count:{followerCount}")
            action=webdriver.ActionChains(self.browser)
//*******************************************Probly my problem is here****************************************
            while True:
                dialog.click()
                action.key_down(Keys.SPACE).key_up(Keys.SPACE).perform()
                time.sleep(3)
                newCount=len(dialog.find_elements_by_tag_name("li"))
                if followerCount!=newCount or newCount==24:
                    print(f"New count:{newCount}")
                    time.sleep(3)
                    followerCount=newCount
                else:
                    break
//**********************************************************************************************************
            followers=dialog.find_elements_by_tag_name("li")
            followersList=[]
            for user in followers:
                link=user.find_element_by_css_selector("a").get_attribute("href")
                # print(link)
                followersList.append(link)
            with open("followers.txt","w",encoding="UTF-8") as file:
                for item in followersList:
                    file.write(item+"\n")
            time.sleep(5)
        except:
            pass

У меня также есть def getfollowing, и он работает безупречно. Если хочешь, я тоже могу показать. Но они почти такие же.

РЕДАКТИРОВАТЬ: @RohanShah решил мою проблему. Внизу страницы вы можете увидеть решение.

Изменить: я здесь новичок, поэтому иногда мои вопросы могут быть бессмысленными, но, пожалуйста, не уменьшайте мои очки. Stackoverflow больше не будет принимать мои вопросы. Пожалуйста, увеличьте мои баллы.

-1
Cihan İçelliler 3 Дек 2020 в 12:20

1 ответ

Лучший ответ

У меня была такая же проблема при прокрутке всплывающих окон. Происходит то, что ваш dialog.click(), пытаясь сфокусировать нажатой клавишу на всплывающем окне, время от времени нажимает на пользователя и загружает его профиль. Затем ваш скрипт аварийно завершает работу, поскольку всплывающее окно больше не отображается на экране.

После долгих исследований по решению этой проблемы я заметил, что это происходит только с длинными именами пользователей. Тем не менее, я реализовал простой прием, чтобы обойти эту проблему.

  1. Сначала мы получаем URL-адрес стандартной прокрутки. При открытии и прокрутке всплывающего окна это URL-адрес, на котором мы находимся. https://www.instagram.com/some_username/followers/

2.Теперь я создал функцию для хранения кода открытия всплывающего окна. Это будет очень полезно, поэтому поместите необходимый код в функцию. (У меня нет имен классов или xpath, поэтому настройте функцию для себя)

    def openPopup():
        self.browser.get(f"https://www.instagram.com/{self.username}")
        global popup # we will need to access this variable outside of the function
        popup = driver.find_element_by_class_name('popupClass') #you don't have to use class_name
        popup.click()
  1. Теперь мы должны указать нашему while loop не сканировать, когда Selenium случайно нажимает на пользователя. Мы будем использовать наш URL-адрес из шага 1. Убедитесь, что следующий оператор if вставлен в начало вашего цикла, поэтому, если есть разрыв, он сначала обработает его, прежде чем пытаться получить доступ к всплывающему окну.
    while True:  
      check_url = self.browser.current_url #returns string with current_url

      if check_url != 'https://www.instagram.com/some_username/followers/':
        #if this code is executed, this means there has been an accidental click
        openPopup() #this will bring back to the page and reopen popup
    
     #the rest of your code
      popup.click() # variable from our function
      action.key_down(Keys.SPACE).key_up(Keys.SPACE).perform()
      time.sleep(3)
      newCount=len(dialog.find_elements_by_tag_name("li"))           
      if followerCount!=newCount or newCount==24:
        print(f"New count:{newCount}")
        time.sleep(3)
        followerCount=newCount
      else:
        break
      check_url = self.browser.current_url #we must recheck the current_url every time the loop runs to see if there has been a misclick

Теперь, когда ваш цикл обнаруживает, что URL больше не является одним из всплывающих окон, он автоматически вызывает openPopup(), который вернет вас на страницу и обратно во всплывающее окно, и ваш цикл будет продолжаться, как будто ничего не произошло.

0
Rohan Shah 3 Дек 2020 в 14:34