Почему инстаграм бот на Selenium Python делает отписки «через раз»?
Есть бот на Selenium Python, есть функция отписки и она работает, но, по какой то причине, пропускает отписки. Это выглядит, примерно, так:
- бот подгружает страницу профиля и открывает вкладку подписок.
- поочерёдно тыкает по кнопкам отписаться, пока не отпишется от десяти человек.
- повторяет всё снова.
Но при перезагрузке страницы оказывается что на те профили, от которых бот отписался, аккаунт до сих пор подписан. Кнопка отписки была нажата, инстаграм выдал соответствующую анимацию и кнопка стала синей, но вот сама отписка не произошла. Ничего подобного я не могу повторить если делаю всё тоже самое вручную с того же самого хрома, данна проблема возникает именно при отписке через Selenium. Проблема, частично, решается увеличением таймаута между отписками, но это не решение и это не объясняет мне причин, из за которых всё так работает.
Я приложу скрин логов, там видно, что от одного и того же профиля он отписывается по несколько раз. Прикладываю код фрагмета отписки и вот ссылка на репозиторий github, там есть код всего бота:
https://github.com/lok101/InstaBotSelenium.git
В целом, сама отписка работает, но с подобными "пробуксовками". Вы не знаете, в чём причина?
while True:
if error_count >= error_max:
break
try:
count = 10
browser.get(f"https://www.instagram.com/{username}/")
time.sleep(2)
following_button = browser.find_element(By.XPATH, "//li[3]/a")
following_button.click()
time.sleep(2)
# забираем все li из ul, в них хранится кнопка отписки и ссылки на подписки
following_div_block = browser.find_element(By.XPATH, "/html/body/div[6]/div/div/div[3]/ul/div")
following_users = following_div_block.find_elements(By.TAG_NAME, "li")
time.sleep(2)
for user in following_users:
if not count:
time.sleep(sleep_between_iterations)
break
user_url = user.find_element(By.TAG_NAME, "a").get_attribute("href")
user_name = user_url.split("/")[-2]
user.find_element(By.TAG_NAME, "button").click()
browser.find_element(By.XPATH, "/html/body/div[7]/div/div/div/div[3]/button[1]").click()
print(f"Итерация #{count} >>> Отписался от пользователя {user_name}")
count -= 1
time.sleep(random.randrange(min_sleep, max_sleep))
except NoSuchElementException:
error_count += 1
if error_count == error_max:
print(f'''
-----------------------------------------------------------------------------------
----------- Элемент не найден, лимит перезапусков превышен, завершение. -----------
-----------------------------------------------------------------------------------
''')
else:
print(f'''
-----------------------------------------------------------------------------------
----------- Элемент не найден, перезапуск # {error_count}. ------------------------
-----------------------------------------------------------------------------------
''')
time.sleep(30)
continue