Скрипт имитации поведения человека в Google и YouTube

    Веб-скрапинг и автоматизация поиска требуют реалистичной имитации действий пользователя. Представленный код на Python с использованием Playwright реализует класс HumanBehavior, который эмулирует задержки, ввод текста, скроллинг и обработку всплывающих окон. Однако разработчики часто сталкиваются с ошибкой 'NoneType' object is not subscriptable и проблемами с циклическим выполнением. Разберём, как доработать скрипт для стабильной работы.

    Как работает класс HumanBehavior?

    Класс содержит статические методы, каждый из которых отвечает за определённый аспект поведения:

    • random_delay(a, b) - создаёт случайную паузу с небольшим разбросом, имитируя человеческую непредсказуемость.
    • human_type(page, selector, text) - посимвольно вводит текст с возможными опечатками (Backspace) и паузами после пробелов.
    • human_scroll(page) - прокручивает страницу вниз или вверх на случайную величину, повторяя 3-7 раз.
    • handle_popups(page) - проверяет наличие всплывающих окон (cookie, реклама) и закрывает их с заданной вероятностью.

    Основная функция perform_search_session

    Функция выполняет полный цикл поиска: открывает Google, вводит запрос, выбирает случайные результаты, переходит по ним, скроллит и возвращается назад. Цикл повторяется 3-7 раз. Основные шаги:

    1. Формирование случайного запроса из темы и модификаторов (например, "how to mental health").
    2. Переход на Google, задержка 2-4 секунды.
    3. Обработка всплывающих окон.
    4. Ввод запроса с имитацией человеческого ввода.
    5. Ожидание загрузки результатов поиска (селектор div.g).
    6. Выбор случайных ссылок из первых 5 результатов.
    7. Переход по ссылке, скроллинг, клик по внутренним ссылкам и возврат назад.

    Ошибка 'NoneType' object is not subscriptable

    Эта ошибка возникает, когда код пытается обратиться к элементу списка или словаря, который равен None. В данном контексте проблема часто связана с методом query_selector_all, возвращающим пустой список. Если результаты поиска не найдены, переменная results остаётся пустой, и при попытке random.choice(results[:5]) возникает исключение. Решение: перед выбором ссылки проверяйте длину списка:

    if len(results) > 0:    link = random.choice(results[:min(5, len(results))])else:    break

    Автоматизация YouTube

    Для имитации просмотра видео на YouTube подойдёт похожий подход. Используйте класс HumanBehavior для скроллинга страницы канала, клика по видео и ожидания загрузки. Добавьте методы для взаимодействия с плеером: пауза, перемотка, изменение громкости. Пример:

    async def watch_youtube(page, video_url):    await page.goto(video_url)    await HumanBehavior.random_delay(2, 5)    # Имитация просмотра: скролл вниз для комментариев    await HumanBehavior.human_scroll(page)    # Ожидание 5-10 минут (в реальности используйте timeouts)    await asyncio.sleep(random.randint(300, 600))

    Практические советы по улучшению

    • Увеличьте случайность в выборе запросов: используйте несколько тем и комбинаций.
    • Добавьте обработку капчи через сервисы распознавания или ручное решение.
    • Используйте прокси для смены IP-адресов.
    • Логируйте каждое действие для отладки: записывайте URL и время.

    Скрипт HumanBehavior - хорошая основа для автоматизации, но требует доработок для обхода антибот-систем. Регулярно обновляйте селекторы и тестируйте на разных страницах.

    Часто задаваемые вопросы