1. Просто, но эффективно - заголовки запроса, в т.ч.
- User-Agent
- Cookie
- Referer
Также легко подделывается.
2. Использование штук типа prefetch и тому подобных. Если клиент запросил страницу, но не запросил сразу же стили/скрипты на ней - возможно, это бот. Просто, но рискованно (можно забанить обычных людей) и затратно (нужно анализировать отдачу статики).
3. Исполнение JS-кода - например, предлагает клиенту выполнить фоновый AJAX-запрос, который поставит специальную куку. Минус - работает только со второго запроса. Обходится безголовым браузером типа selenium.