BotBan

Как обнаружить парсер на сайте

Где именно парсер выдаёт себя и какими командами найти его в логах — укладывается в пять минут.

3 мин чтения

Парсер редко прячется всерьёз. Он оставляет в логах характерный след, и чтобы его увидеть, хватает нескольких команд.

Признак первый: темп

Человек читает страницу товара минимум полминуты. Парсер обходит по несколько страниц в секунду.

Посчитайте самые активные адреса за день:

awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -20

Если у верхних строк счётчик в тысячах, а сайт небольшой — это не люди.

Признак второй: только HTML

Браузер, открыв страницу, тут же тянет стили, шрифты и картинки. На одну страницу приходится десяток-другой дополнительных запросов. Парсеру нужны только данные.

Посчитайте для подозрительного адреса соотношение:

grep '203.0.113.7' access.log | grep -c '\.html\|/catalog'
grep '203.0.113.7' access.log | grep -c '\.css\|\.js\|\.jpg\|\.png\|\.woff'

У человека вторая цифра больше первой в разы. У парсера вторая близка к нулю.

Признак третий: последовательность

Человек прыгает: открыл товар, вернулся, ушёл в другую категорию. Парсер идёт подряд.

grep '203.0.113.7' access.log | awk '{print $7}' | head -40

Если видите ?page=1, ?page=2, ?page=3 подряд — вопрос закрыт.

Признак четвёртый: User-Agent

awk -F'"' '{print $6}' access.log | sort | uniq -c | sort -rn | head -20

Ищите python-requests, Go-http-client, curl, Scrapy, Java, okhttp. Одинаковый User-Agent у сотен тысяч запросов с разных адресов тоже подозрителен: настоящие браузеры дают разброс версий.

Признак пятый: нет Referer

При переходе внутри сайта браузер сообщает, с какой страницы пришёл. Парсер, дёргающий адреса из списка, обычно нет.

Как отличить от поискового робота

Робот тоже обходит каталог подряд и тоже не грузит картинки. Отличие одно, зато надёжное: принадлежность адреса.

host 66.249.66.1

У настоящего Googlebot ответ будет вида crawl-66-249-66-1.googlebot.com. Дальше проверьте обратно:

host crawl-66-249-66-1.googlebot.com

Адрес должен совпасть с исходным. Если хоть одна из проверок не прошла — это не поисковик, а кто-то, прикрывшийся его именем. У Яндекса зоны yandex.ru, yandex.net, yandex.com.

Никогда не определяйте робота по строке User-Agent. Она подделывается одной строкой кода, а заблокированный настоящий робот — это выпадение сайта из выдачи.

Что делать дальше

Найденный адрес можно закрыть в конфиге сервера. Это работает ровно до тех пор, пока парсер не сменит адрес — а с резидентными прокси у него их тысячи.

Устойчивее считать не адреса, а поведение: темп, соотношение запросов, последовательность путей. Тогда смена адреса не помогает, потому что новый ведёт себя точно так же.

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

Читайте также