#python #selenium #instagram
#python #селен #Instagram
Вопрос:
Я пытаюсь привлечь подписчиков с помощью python selenium. Но иногда python щелкает сам по себе. Я хочу создать программу без ошибок. Я пытаюсь Я пробовал конструкции «try catch», но это не сработало. Вот мой код:
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. Неясно, что вы подразумеваете под «он щелкает сам по себе». Что он щелкает? И что вы подразумеваете под «самим собой»?
2. Я имею в виду, что при просмотре списков пользователей щелчок любого пользователя переходит на их страницу и завершается
3. @RohanShah Спасибо за ваш блестящий ответ. Я собираюсь проверить это сейчас.
4. @RohanShah это работает!! Вы буквально спасли мой день. Я ценю это.
Ответ №1:
У меня была точно такая же проблема при прокрутке всплывающих окон. Что происходит dialog.click()
, так это то, что вы, пытаясь сфокусировать свой ключ на всплывающем окне, иногда щелкаете пользователя и загружаете его профиль. Затем ваш скрипт выходит из строя, поскольку всплывающее окно больше не отображается на экране.
После долгих исследований по решению этой проблемы я заметил, что это происходит только с длинными именами пользователей. Несмотря на это, я реализовал простой способ обойти эту проблему.
- Сначала мы получаем 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()
- Теперь мы должны указать нашему
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()
, что возвращает вас на страницу и обратно во всплывающее окно, и ваш цикл будет продолжаться, как будто ничего не произошло.