Что такое отказы в Яндекс Метрике, и как бороться с ботами и нулевыми заходами
Отказ в Яндекс Метрике – это просмотр страницы меньше 15 секунд и возвращение пользователя в поиск. В метрике показатель не должен превышать 20%, но каждый вебмастер пытается снизить показатель до минимальных значений.
Отказы считаются одним из важных показателей ранжирования. Если процент большой, поисковая система считает, что сайт не нравится пользователям, а значит, некачественный, и как следствие понижение позиций в выдаче. А значит, меньше посетителей, читателей и клиентов из поиска.
Но бывает что из-за неправильных настроек метрики или траблов этой системы, растет технический показатель отказов. К примеру, к одной из ваших страниц прилепливается бот и, заходя на нее несколько раз в день, а иногда в час, начисто валит всю статистику. Поэтому если у вас много отказов в метрике, на факт, что они от пользователей.
Моя история борьбы с отказами выбиваемыми ботами
Стоило моим сайтам выйти на посещаемость более 40 уников в сутки, как прилетало счастье со стороны нулевых отказов, сделанных не пользователями, а ботами.
Через неделю после перезапуска этого сайта я зашел на вебвизор, чтобы посмотреть, как идут дела. Картина была просто удручающая, суммарно отказы завалили за красную линию в 20%. Спустя 2 месяца работы над сайтом — просто опускаются руки. Примерно пятая часть заходов — по 0 сек. Яндекс учитывает эти заходы как отказы, и соответственно понижает его в выдаче.
Отказы зафиксированы как одиночные с разных IP, так и по несколько хитов с одних и тех же направлений.
Несколько недель упорного труда просто накрывается медным тазом. И так, далее я расскажу, как мне удалось вернуть отказы в норму и значительно сократить — нулевые заходы.
Как отсечь ботов в «Яндекс метрике»
Вначале я обратился в службу Яндекса. Что-то типа: «Эй, парни, вы тут ботов считаете, как посетителей и лепите отказы». На что мне ответили, что я могу самостоятельно отсечь их в Метрике.
По совету специалиста из службы поддержки я перешел в отчет «Роботы» по пути Отчеты — Стандартные отчёты — Мониторинг — Роботы. Внизу страницы находится подраздел называющийся «Фильтрация роботов». В нем три пункта:
- Учитывать визиты всех роботов.
- Фильтровать роботов по строгим правилам.
- Фильтровать роботов только по строгим правилам и поведению.
У меня стояла отметка на первом пункте. Она ставится по умолчанию на всех счетчиках Яндекс. Метрики. Я поставил на третью, и нужно признать, часть нулевых отказов ушла. Но только часть.
Фильтрация роботов по User-Agent
Следующим пунктом стала фильтрация ботов по User-Agent. Прежде всего, я установил в файл .htaccess фильтр, который отбрасывал ботов, нежелательных парсеров, грабберов контента по User-Agent.
SetEnvIfNoCase User-Agent "^Black Hole" bad_bot SetEnvIfNoCase User-Agent "^Titan" bad_bot SetEnvIfNoCase User-Agent "^WebStripper" bad_bot SetEnvIfNoCase User-Agent "^ExtractorPro" bad_bot SetEnvIfNoCase User-Agent "^CopyRightCheck" bad_bot SetEnvIfNoCase User-Agent "^Crescent" bad_bot SetEnvIfNoCase User-Agent "^Wget" bad_bot SetEnvIfNoCase User-Agent "^SiteSnagger" bad_bot SetEnvIfNoCase User-Agent "^ProWebWalker" bad_bot SetEnvIfNoCase User-Agent "^CheeseBot" bad_bot SetEnvIfNoCase User-Agent "^Teleport" bad_bot SetEnvIfNoCase User-Agent "^TeleportPro" bad_bot SetEnvIfNoCase User-Agent "^NetMechanic" bad_bot SetEnvIfNoCase User-Agent "^CherryPicker" bad_bot SetEnvIfNoCase User-Agent "^EmailCollector" bad_bot SetEnvIfNoCase User-Agent "^EmailSiphon" bad_bot SetEnvIfNoCase User-Agent "^WebBandit" bad_bot SetEnvIfNoCase User-Agent "^EmailWolf" bad_bot SetEnvIfNoCase User-Agent "^MIIxpc" bad_bot SetEnvIfNoCase User-Agent "^Telesoft" bad_bot SetEnvIfNoCase User-Agent "^Website Quester" bad_bot SetEnvIfNoCase User-Agent "^WebZip" bad_bot SetEnvIfNoCase User-Agent "^moget/2.1" bad_bot SetEnvIfNoCase User-Agent "^WebZip/4.0" bad_bot SetEnvIfNoCase User-Agent "^WebSauger" bad_bot SetEnvIfNoCase User-Agent "^WebCopier" bad_bot SetEnvIfNoCase User-Agent "^NetAnts" bad_bot SetEnvIfNoCase User-Agent "^Mister PiX" bad_bot SetEnvIfNoCase User-Agent "^WebAuto" bad_bot SetEnvIfNoCase User-Agent "^TheNomad" bad_bot SetEnvIfNoCase User-Agent "^WWW-Collector-E" bad_bot SetEnvIfNoCase User-Agent "^spanner" bad_bot SetEnvIfNoCase User-Agent "^InfoNaviRobot" bad_bot SetEnvIfNoCase User-Agent "^Harvest/1.5" bad_bot SetEnvIfNoCase User-Agent "^Bullseye/1.0" bad_bot SetEnvIfNoCase User-Agent "^Mozilla/4.0 (compatible; BullsEye; Windows 95)" bad_bot SetEnvIfNoCase User-Agent "^Crescent Internet ToolPak HTTP OLE Control v.1.0" bad_bot SetEnvIfNoCase User-Agent "^CherryPickerSE/1.0" bad_bot SetEnvIfNoCase User-Agent "^RMA" bad_bot SetEnvIfNoCase User-Agent "^libWeb/clsHTTP" bad_bot SetEnvIfNoCase User-Agent "^asterias" bad_bot SetEnvIfNoCase User-Agent "^httplib" bad_bot SetEnvIfNoCase User-Agent "^turingos" bad_bot SetEnvIfNoCase User-Agent "^CherryPicker /1.0" bad_bot SetEnvIfNoCase User-Agent "^WebBandit/3.50" bad_bot SetEnvIfNoCase User-Agent "^NICErsPRO" bad_bot SetEnvIfNoCase User-Agent "^Microsoft URL Control - 5.01.4511" bad_bot SetEnvIfNoCase User-Agent "^DittoSpyder" bad_bot SetEnvIfNoCase User-Agent "^Foobot" bad_bot SetEnvIfNoCase User-Agent "^WebmasterWorldForumBot" bad_bot SetEnvIfNoCase User-Agent "^SpankBot" bad_bot SetEnvIfNoCase User-Agent "^BotALot" bad_bot SetEnvIfNoCase User-Agent "^lwp-trivial/1.34" bad_bot SetEnvIfNoCase User-Agent "^lwp-trivial" bad_bot SetEnvIfNoCase User-Agent "^Wget/1.6" bad_bot SetEnvIfNoCase User-Agent "^BunnySlippers" bad_bot SetEnvIfNoCase User-Agent "^humanlinks" bad_bot SetEnvIfNoCase User-Agent "^LinkextractorPro" bad_bot SetEnvIfNoCase User-Agent "^Offline Explorer" bad_bot SetEnvIfNoCase User-Agent "^Mata Hari" bad_bot SetEnvIfNoCase User-Agent "^LexiBot" bad_bot SetEnvIfNoCase User-Agent "^Web Image Collector" bad_bot SetEnvIfNoCase User-Agent "^The Intraformant" bad_bot SetEnvIfNoCase User-Agent "^True_Robot/1.0" bad_bot SetEnvIfNoCase User-Agent "^True_Robot" bad_bot SetEnvIfNoCase User-Agent "^Microsoft URL Control - 6.00.8169" bad_bot SetEnvIfNoCase User-Agent "^URLy Warning" bad_bot SetEnvIfNoCase User-Agent "^Wget/1.5.3" bad_bot SetEnvIfNoCase User-Agent "^LinkWalker" bad_bot SetEnvIfNoCase User-Agent "^cosmos" bad_bot SetEnvIfNoCase User-Agent "^moget" bad_bot SetEnvIfNoCase User-Agent "^hloader" bad_bot SetEnvIfNoCase User-Agent "^BlowFish/1.0" bad_bot SetEnvIfNoCase User-Agent "^JennyBot" bad_bot SetEnvIfNoCase User-Agent "^MIIxpc/4.2" bad_bot SetEnvIfNoCase User-Agent "^BuiltBotTough" bad_bot SetEnvIfNoCase User-Agent "^ProPowerBot/2.14" bad_bot SetEnvIfNoCase User-Agent "^BackDoorBot/1.0" bad_bot SetEnvIfNoCase User-Agent "^toCrawl/UrlDispatcher" bad_bot SetEnvIfNoCase User-Agent "^WebEnhancer" bad_bot SetEnvIfNoCase User-Agent "^TightTwatBot" bad_bot SetEnvIfNoCase User-Agent "^suzuran" bad_bot SetEnvIfNoCase User-Agent "^VCI WebViewer VCI WebViewer Win32" bad_bot SetEnvIfNoCase User-Agent "^VCI" bad_bot SetEnvIfNoCase User-Agent "^Xenu's Link Sleuth 1.1c" bad_bot SetEnvIfNoCase User-Agent "^Xenu's" bad_bot SetEnvIfNoCase User-Agent "^Zeus" bad_bot SetEnvIfNoCase User-Agent "^RepoMonkey Bait & Tackle/v1.01" bad_bot SetEnvIfNoCase User-Agent "^RepoMonkey" bad_bot SetEnvIfNoCase User-Agent "^Zeus 32297 Webster Pro V2.9 Win32" bad_bot SetEnvIfNoCase User-Agent "^Webster Pro" bad_bot SetEnvIfNoCase User-Agent "^EroCrawler" bad_bot SetEnvIfNoCase User-Agent "^LinkScan/8.1a Unix" bad_bot SetEnvIfNoCase User-Agent "^Keyword Density/0.9" bad_bot SetEnvIfNoCase User-Agent "^Szukacz/1.4" bad_bot SetEnvIfNoCase User-Agent "^QueryN Metasearch" bad_bot SetEnvIfNoCase User-Agent "^Openfind data gathere" bad_bot SetEnvIfNoCase User-Agent "^Openfind" bad_bot SetEnvIfNoCase User-Agent "^Kenjin Spider" bad_bot SetEnvIfNoCase User-Agent "^Cegbfeieh" bad_bot <Limit GET POST HEAD> Order Allow,Deny Allow from all Deny from env=bad_bot </Limit>
Буквально спустя 3-4 часа поток нулевых заходов, которые выбивают отказ в поисковой системе, снизился вдвое! А что делать с остальными? Можно конечно побанить их через .htaccess добавив в файл следующие строки:
# BLACK LIST order allow,deny allow from all # далее прописать IP с которых идут отказы deny from 37.142.162.181 deny from 37.142.152.101
Но вебвизор не отображает IP адреса, с которых был заход с нулевым временем присутствия на сайте. Я разработал простое решение, основанное на модификации Яндекс счетчика таким образом, чтобы IP адрес каждого посетителя добавлялся в отдельную колонку, и можно было точечно ограничить в доступе к сайту адреса, с которых идут отказы.
Модификации Яндекс счетчика для отображения IP адресов
Для начала необходимо создать php файл, например ip.php в котором будет размещена функция, возвращающая IP посетителя, далее предлагаю исходный код функции:
<?php function getClientIP() { if ($_SERVER['HTTP_X_FORWARDED_FOR'] != '') { $client_ip = (!empty($_SERVER['REMOTE_ADDR'])) ? $_SERVER['REMOTE_ADDR'] : ((!empty($_ENV['REMOTE_ADDR'])) ? $_ENV['REMOTE_ADDR'] : "unknown"); $entries = split('[, ]', $_SERVER['HTTP_X_FORWARDED_FOR']); reset($entries); while (list(, $entry) = each($entries)) { $entry = trim($entry); if (preg_match("/^([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)/", $entry, $ip_list)) { $private_ip = array('/^0\./','/^127\.0\.0\.1/','/^192\.168\..*/','/^172\.((1[6-9])|(2[0-9])|(3[0-1]))\..*/','/^10\..*/'); $found_ip = preg_replace($private_ip, $client_ip, $ip_list[1]); if ($client_ip != $found_ip) { $client_ip = $found_ip; break; } } } } else { $client_ip = (!empty($_SERVER['REMOTE_ADDR'])) ? $_SERVER['REMOTE_ADDR'] : ((!empty($_ENV['REMOTE_ADDR'])) ? $_ENV['REMOTE_ADDR'] : "unknown"); } return $client_ip; } ?>
Теперь остаётся только модифицировать код счетчика Яндекса, чтобы он отображал IP в отдельную колонку. В моем случае код счетчика размещён в отдельном файле metrika.php, который просто инклудится в файле header.php директивой include.
<?php include("metrika.php");?>
ВНИМАНИЕ!
Файлы ip.php и metrika.php (в котором будет находится код счетчика Яндекс) необходимо создать в корневом каталоге сайта, или рядом с файлом header.php, в противном случае придется указывать путь в директиве include. В WordPress это будет ./wp-content/themes/название_темы/
Это очень удобно, разместил код в одном файле, а потом с помощью вставки прописал его там, где нужно и все. Далее я покажу что должно быть в файле metrika.php для того, чтобы все работало. Первым делом вставляем php код, который будет определять IP посетителя и присваивать его значение переменной $ip, в строке $ip=getClientIP().
<?php include("ip.php"); // указать путь к файлу, который определяет IP посетителя $ip=getClientIP(); // вызываем функцию ?>
Далее, код самого Яндекс счетчика
Внимание, недавно код счетчика изменился, поэтому статья исправлена с учетом этих изменений
Ниже показано, как выглядит код счетчика изначально, с учетом того, что были убраны лишние пробелы, комментирующий блок в начале строки <!– Yandex.Metrika counter –>, в конце строки <!– /Yandex.Metrika counter –>, изжившая себя временем бесполезная конструкция – <script type=”text/javascript”> заменена на <script> и идентификатор счетчика заменен на XXXXX, поскольку он у каждого свой.
<script>(function(m,e,t,r,i,k,a){m[i]=m[i]||function(){(m[i].a=m[i].a||[]).push(arguments)};m[i].l=1*new Date();k=e.createElement(t),a=e.getElementsByTagName(t)[0],k.async=1,k.src=r,a.parentNode.insertBefore(k,a)})(window,document,"script","https://mc.yandex.ru/metrika/tag.js","ym");ym(XXXXX,"init",{id:XXXXX,clickmap:true,trackLinks:true,accurateTrackBounce:true,webvisor:true});</script><noscript><div><img src="https://mc.yandex.ru/watch/47543962" style="position:absolute;left:-9999px" alt=""></div></noscript>
Код счетчика Яндекс отличается только идентификатором и дополнительными опциями, если они включены. Например, если у вас включен вебвизор, то в строке
{id:XXXXX,clickmap:true,trackLinks:true,accurateTrackBounce:true,webvisor:true} появляется webvisor:true
Теперь модифицируем счетчик так, чтобы он мог отображать IP посетителя, ниже показан завершенный пример файла metrika.php, то есть то, как он должен выглядеть.
<?php include("ip.php");$ip=getClientIP();?> <script>var yaParams={ip_adress:"<?php echo $ip;?>"};(function(m,e,t,r,i,k,a){m[i]=m[i]||function(){(m[i].a=m[i].a||[]).push(arguments)};m[i].l=1*new Date();k=e.createElement(t),a=e.getElementsByTagName(t)[0],k.async=1,k.src=r,a.parentNode.insertBefore(k,a)})(window,document,"script","https://mc.yandex.ru/metrika/tag.js","ym");ym(XXXXX,"init",{id:XXXXX,params:window.yaParams,clickmap:true,trackLinks:true,accurateTrackBounce:true,webvisor:true});</script><noscript><div><img src="https://mc.yandex.ru/watch/47543962" style="position:absolute;left:-9999px" alt=""></div></noscript>
Будьте внимательны, полученное значение IP вначале строки
<?php include("ip.php");$ip=getClientIP();?>
Необходимо создать параметр
Было:
<script>(function(m,e,t,r,i,k,a)
Стало:
<script>var yaParams={ip_adress:”<?php echo $ip;?>”};(function(m,e,t,r,i,k,a)
И передать его функции:
Было:
id:11111,clickmap:true,trackLinks:true
Стало:
id:11111,params:window.yaParams,clickmap:true,trackLinks:true
Остаётся только подключить счетчик в хедере header.php и настроить отображение столбцов в Яндекс вебмастере. Для этого в вебвизоре нажимаем «Настроить столбцы»
В левой части открывшегося окошка устанавливаем галочку напротив строчки «Параметры визитов».
А в левой хватаем мышкой появившейся блок и переносим в начало, как показано на рисунке. Это для того, чтобы отображение IP адресов шло сразу за колонкой «Время на сайте»
Вот в принципе и все, теперь можно адресно побанить всех посетителей с нулевым заходом. Причем операцию можно проводить раз в два дня, и со временем количество отказов с нулевым временем на сайте значительно снизится.
И еще, советую привязать свой счетчик к вебмастеру, это как минимум позволит Вам избежать неприятностей, которые смогут создать недоброжелатели, если разместят Ваш идентификатор на каком нибудь мусорном сайте.
Поскольку Яндекс счетчики отличаются только цифровым идентификатором, то ничего не мешает взять ваш идентификатор, который можно легко увидеть, посмотрев исходный код страницы, вставить его в базовый код счетчика и повесить это художество на какой нибудь помойке и начать лить на него адалт трафик.