@lok101

Почему инстаграм бот на Selenium Python делает отписки «через раз»?

Есть бот на Selenium Python, есть функция отписки и она работает, но, по какой то причине, пропускает отписки. Это выглядит, примерно, так:
- бот подгружает страницу профиля и открывает вкладку подписок.
- поочерёдно тыкает по кнопкам отписаться, пока не отпишется от десяти человек.
- повторяет всё снова.

spoiler
Но при перезагрузке страницы оказывается что на те профили, от которых бот отписался, аккаунт до сих пор подписан. Кнопка отписки была нажата, инстаграм выдал соответствующую анимацию и кнопка стала синей, но вот сама отписка не произошла. Ничего подобного я не могу повторить если делаю всё тоже самое вручную с того же самого хрома, данна проблема возникает именно при отписке через Selenium. Проблема, частично, решается увеличением таймаута между отписками, но это не решение и это не объясняет мне причин, из за которых всё так работает.

Я приложу скрин логов, там видно, что от одного и того же профиля он отписывается по несколько раз. Прикладываю код фрагмета отписки и вот ссылка на репозиторий github, там есть код всего бота:
https://github.com/lok101/InstaBotSelenium.git
В целом, сама отписка работает, но с подобными "пробуксовками". Вы не знаете, в чём причина?


spoiler

61c47e42de0c0201919188.png
while True:
            if error_count >= error_max:
                break
            try:
                following_count = browser.find_element(
                    By.XPATH, '//main/div/header/section/ul/li[3]/a/span').text
                print(f"Количество подписок: {following_count}")
                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()
                    time.sleep(random.randrange(min_sleep, max_sleep))
                    browser.find_element(By.CSS_SELECTOR, "button.-Cab_").click()

                    print(f"Итерация #{count} >>> Отписался от пользователя {user_name}")
                    count -= 1
            except NoSuchElementException:
                error_count += 1
                if error_count == error_max:
                    print(f'''
                    -----------------------------------------------------------------------------------
                    ----------- Элемент не найден, лимит перезапусков превышен, завершение. -----------
                    -----------------------------------------------------------------------------------
                           ''')
                else:
                    print(f'''
                    -----------------------------------------------------------------------------------
                    ----------- Элемент не найден, перезапуск # {error_count}. ------------------------
                    -----------------------------------------------------------------------------------
                           ''')
                time.sleep(30)
                continue



UPD: Первый прогон всегда отписывается от всех десяти, а дальше отписки идут на уменьшение. Переключение таймаутов ни как не влияет.
spoiler
Количество подписок: 63
Итерация #10 >>> Отписался от пользователя shahidsabika847
Итерация #9 >>> Отписался от пользователя forta05
Итерация #8 >>> Отписался от пользователя angel198636
Итерация #7 >>> Отписался от пользователя julia88ni
Итерация #6 >>> Отписался от пользователя konstantin.shagalov
Итерация #5 >>> Отписался от пользователя 25.13romanova26.16
Итерация #4 >>> Отписался от пользователя joxa_sofiya
Итерация #3 >>> Отписался от пользователя sahynatkachenko067
Итерация #2 >>> Отписался от пользователя lenara2021
Итерация #1 >>> Отписался от пользователя alenka_kislinka
Количество подписок: 53
Итерация #10 >>> Отписался от пользователя julia88ni
Итерация #9 >>> Отписался от пользователя konstantin.shagalov
Итерация #8 >>> Отписался от пользователя 25.13romanova26.16
Итерация #7 >>> Отписался от пользователя joxa_sofiya
Итерация #6 >>> Отписался от пользователя lenara2021
Итерация #5 >>> Отписался от пользователя alenka_kislinka
Итерация #4 >>> Отписался от пользователя mamaalina80
Итерация #3 >>> Отписался от пользователя zarema_mirki
Итерация #2 >>> Отписался от пользователя bysinka_87
Итерация #1 >>> Отписался от пользователя miroshnikovu_family
Количество подписок: 49
Итерация #10 >>> Отписался от пользователя alenka_kislinka
Итерация #9 >>> Отписался от пользователя mamaalina80
Итерация #8 >>> Отписался от пользователя bysinka_87
Итерация #7 >>> Отписался от пользователя miroshnikovu_family
Итерация #6 >>> Отписался от пользователя krytiiishka
Итерация #5 >>> Отписался от пользователя neznaika3954
Итерация #4 >>> Отписался от пользователя fwzj1b_9
Итерация #3 >>> Отписался от пользователя svetik.ya1985
Итерация #2 >>> Отписался от пользователя mama_denisa_21_i_dachuli_17
Итерация #1 >>> Отписался от пользователя _777ira
Количество подписок: 43
  • Вопрос задан
  • 147 просмотров
Пригласить эксперта
Ответы на вопрос 2
@ab1
Попробуйте после клика на пользователя , после стр 43.
добавить time.sleep какой-нибудь)

+ В стр 44 абсолютный xpath длинный , много элементов , это не гибкий подход ,
возможно найти xpath покороче используя аттрибуты, например @id, @class & ...
Ответ написан
opium
@opium
Просто люблю качественно работать
Так там же вебдрайвер запустите локально и посмотрите куда он тыкает
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы