Хабр Курсы для бэкендеров
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!

Надо смотреть не только на меняющийся user-agent во время одной сессии, но и на все другие заголовки, который не должны меняться, а также на порядок, в котором заголовк идут в запросе.
Еще из личного опыта - учитывать количество запросов, полученных по текущему tcp соединению c учетом keep-alive. Но для этого надо настраивать nginx чтобы прокидывал в окружение скрипта переменную CONNECTION_REQUESTS
Как показала аналитика, боты всегда декларируют поддержку keep-alive, но в реальности частенько открывают для каждой страницы новое соединение.
Анти Бот для 1C Битрикс: как антиспам для WordPress обзавёлся родственником на Битриксе