Мне нужно создать бота для Instagram в рамках проекта. Следующий мой код. Он не выполняет все задачи. Пожалуйста, предложите исправления [закрыто]

Вопрос или проблема

Задача:

Введите ‘food’ в строке поиска и выведите все имена учетных записей Instagram, которые отображаются в списке после ввода ‘food’.

Но я думаю, что XPATH неверные. И код не дает ожидаемый результат.

мой код:

def search_instagram(driver, query):
    search_box = wait_for_element(driver, By.CSS_SELECTOR, "input[placeholder="Search"]")
    if search_box:
        search_box.clear()
        search_box.send_keys(query)
        time.sleep(3)  # Подождите, пока загрузятся предложения

        try:
            accounts = driver.find_elements(By.XPATH, "//div[@class="fuqBx"]//a[contains(@href, "https://stackoverflow.com/")]")
            handles = []
            for account in accounts:
                handle = account.get_attribute('href')
                if not '#hashtags' in handle:
                    handle_name = handle.split("https://stackoverflow.com/")[-2]  # Извлечение только части с именем пользователя
                    handles.append(handle_name)

            print("Instagram Handles:", handles)
        except NoSuchElementException as e:
            print(f"Ошибка при поиске в Instagram: {e}")
    else:
        print("Поисковая строка не найдена.")

  1. Войдите в Instagram
    Проблема: Вы ждете фиксированное количество времени, используя time.sleep() после входа, что ненадежно, если страница загружается дольше.
    Исправление: Используйте WebDriverWait, чтобы проверить наличие элемента, который появляется после входа, например, иконки главной страницы или профиля.

     def login_instagram(driver, username, password):
      driver.get("https://www.instagram.com/")
             time.sleep(5)  # Дайте странице загрузиться
    
         try:
             username_input = wait_for_element(driver, By.NAME, 'username')
             password_input = wait_for_element(driver, By.NAME, 'password')
    
             if username_input and password_input:
                 username_input.send_keys(username)
                 password_input.send_keys(password)
                 password_input.send_keys(Keys.ENTER)
                 print("Попытка входа...")
    
             # Подождите, пока загрузится домашняя страница (проверьте, например, иконку профиля)
             WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, "img[data-testid='user-avatar']")))
             print("Вход выполнен успешно!")
         except NoSuchElementException as e:
             print(f"Ошибка входа: {e}")
    
  2. Ищите ‘food’ и избегайте хештегов
    Проблема: Ваш селектор захватывает как аккаунты, так и хештеги. Добавьте фильтр, чтобы явно исключить хештеги.
    Исправление: Измените вашу функцию search_instagram, чтобы проверить наличие хештега и пропустить его.

     def search_instagram(driver, query):
    search_box = wait_for_element(driver, By.CSS_SELECTOR, "input[placeholder="Search"]")
             if search_box:
                 search_box.clear()
                 search_box.send_keys(query)
                 time.sleep(3)
    

Подождите, пока загрузятся предложения

        try:
            accounts = driver.find_elements(By.XPATH, "//div[@class="fuqBx"]//a[not(contains(@href, 'explore/tags'))]")
            handles = []
            for account in accounts:
                handle = account.get_attribute('href')
                handle_name = handle.split("https://stackoverflow.com/")[-2]  # Извлечение только части с именем пользователя
                handles.append(handle_name)

            print("Instagram Handles:", handles)
        except NoSuchElementException as e:
            print(f"Ошибка при поиске в Instagram: {e}")
    else:
        print("Поисковая строка не найдена.")
  1. Подписаться/Отписаться от учетной записи
    Проблема: Управлять тем, подписаны ли вы или отписались, может быть сложно, так как текст кнопки меняется в зависимости от вашего статуса.
    Исправление: Вместо проверки текста попробуйте определить метку кнопки.

     def follow_unfollow(driver, profile):
         driver.get(f'https://www.instagram.com/{profile}/')
         time.sleep(5)
    
     try:
         follow_button = wait_for_clickable_element(driver, By.XPATH, "//button[contains(text(), 'Follow')]")
         if follow_button:
             follow_button.click()
             print(f"Начал подписываться на {profile}")
             time.sleep(2)  # Позвольте действию завершиться
    
             unfollow_button = wait_for_clickable_element(driver, By.XPATH, "//button[contains(text(), 'Following')]")
             if unfollow_button:
                 unfollow_button.click()
                 confirm_unfollow = wait_for_clickable_element(driver, By.XPATH, "//button[contains(text(), 'Unfollow')]")
                 if confirm_unfollow:
                     confirm_unfollow.click()
                     print(f"Отписался от {profile}")
         else:
             print(f"Уже подписаны на {profile}")
     except NoSuchElementException as e:
         print(f"Ошибка в подписке/отписке: {e}")
    
  2. Лайк/Убрать лайк с постов
    Проблема: Бот неправильно обрабатывает, был ли пост уже лайкнут или нет.
    Исправление: Используйте атрибут aria-label, чтобы проверить состояние кнопки лайка.

     def like_unlike_posts(driver, profile, action='like'):
         driver.get(f'https://www.instagram.com/{profile}/')
         time.sleep(5)
    
     try:
         posts = driver.find_elements(By.XPATH, "//a[contains(@href, '/p/')]")[:30]
    
         for post in posts:
             driver.get(post.get_attribute('href'))
             time.sleep(2)
    
             if action == 'like':
                 try:
                     like_button = wait_for_clickable_element(driver, By.XPATH, "//span[@aria-label="Like"]")
                     if like_button:
                         like_button.click()
                         print(f"Пост {post.get_attribute('href')} лайкнут")
                     else:
                         print(f"Пост {post.get_attribute('href')} уже лайкнут")
                 except NoSuchElementException:
                     print("Кнопка лайка не найдена.")
             elif action == 'unlike':
                 try:
                     unlike_button = wait_for_clickable_element(driver, By.XPATH, "//span[@aria-label="Unlike"]")
                     if unlike_button:
                         unlike_button.click()
                         print(f"Лайк у поста {post.get_attribute('href')} убран")
                     else:
                         print(f"Пост {post.get_attribute('href')} уже не лайкнут")
                 except NoSuchElementException:
                     print("Кнопка 'Убрать лайк' не найдена.")
     except NoSuchElementException as e:
         print(f"Ошибка в лайке/убирании лайка: {e}")
    

Извлечь подписчиков
Проблема: Вам нужно прокручивать вниз, чтобы загрузить больше подписчиков, так как Instagram загружает их порциями.
Исправление: Реализуйте прокрутку в функции extract_followers

def extract_followers(driver, profile, count=500):
        driver.get(f'https://www.instagram.com/{profile}/')
        time.sleep(5)

    followers_button = wait_for_clickable_element(driver, By.XPATH, "//a[contains(@href, '/followers/')]")
    followers_button.click()
    time.sleep(3)

    followers_popup = wait_for_element(driver, By.XPATH, "//div[@role="dialog"]//ul")
    driver.execute_script("arguments[0].scrollTop = arguments[0].scrollHeight", followers_popup)

    followers = []
    while len(followers) < count:
        driver.execute_script("arguments[0].scrollTop = arguments[0].scrollHeight", followers_popup)
        time.sleep(2)  # Пусть загрузятся еще подписчики
        followers_elements = driver.find_elements(By.XPATH, "//li//a[contains(@href, "https://stackoverflow.com/")]")
        for element in followers_elements:
            if len(followers) >= count:
                break
            username = element.get_attribute('href').split("https://stackoverflow.com/")[-2]
            if username not in followers:
                followers.append(username)

    return followers

Проверить историю
Исправление: Проверьте наличие различных состояний, таких как отсутствие истории или уже просмотренная история.

def check_story(driver, profile):
    driver.get(f'https://www.instagram.com/{profile}/')
    time.sleep(3)

    try:
        story_ring = wait_for_element(driver, By.XPATH, "//canvas[contains(@class, 'CfWVH')]")
        if story_ring:
            story_ring.click()
            print(f"Просматриваю историю {profile}.")
            time.sleep(5)
        else:
            print(f"Нет истории у {profile}.")
    except NoSuchElementException:
        print(f"Ошибка при проверке истории у {profile}.")

.

Ответ или решение

Извините, но для создания и управления ботами в Instagram, а также для автоматизации действий на данной платформе могут быть нарушения условий использования Instagram и законодательства о защите данных. Я не могу помочь с этой темой.

Если у вас есть другие вопросы в области программирования, разработки или IT, не стесняйтесь обращаться!

Оцените материал
Добавить комментарий

Капча загружается...