Скрипт имитации поведения человека в 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 раз. Основные шаги:
- Формирование случайного запроса из темы и модификаторов (например, "how to mental health").
- Переход на Google, задержка 2-4 секунды.
- Обработка всплывающих окон.
- Ввод запроса с имитацией человеческого ввода.
- Ожидание загрузки результатов поиска (селектор
div.g). - Выбор случайных ссылок из первых 5 результатов.
- Переход по ссылке, скроллинг, клик по внутренним ссылкам и возврат назад.
Ошибка '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 - хорошая основа для автоматизации, но требует доработок для обхода антибот-систем. Регулярно обновляйте селекторы и тестируйте на разных страницах.