Поиск по блогу

воскресенье, 6 июня 2010 г.

User-Agent и идентификация. Взгляд с разных сторон

Думаю, что все, кто занимается программированием для web, знают, что такое User-Agent и с чем его едят. Я решила немного обобщить знания и собрать их в одной статье. Сначала определение (Википедия в помощь).

User Agent — это клиентское приложение, использующее определённый сетевой протокол. Термин обычно используется для приложений, осуществляющих доступ к веб-сайтам, таким как браузеры, поисковые роботы (и другие «пауки»), мобильные телефоны и другие устройства.
При посещении веб-сайта клиентское приложение обычно посылает веб-серверу информацию о себе. Это текстовая строка, являющаяся частью HTTP запроса, начинающаяся с User-agent: или User-Agent:, и обычно включающая такую информацию, как название и версию приложения, операционную систему компьютера и язык. У «пауков» эта строка часто содержит URL и email-адрес, по которым веб-мастер может связаться с оператором «паука».


User-Agent и вебмастер


Что дает вебмастеру и оптимизатору знание о таком понятии как User-Agent? Если знать названия поисковых роботов (и роботов различных ресурсов, краулеров и т.д.), то можно самостоятельно регламентировать доступ этих роботов к различным частям сайта. Это делается в небезызвестном файле robots.txt, который должен находиться в корневой папке сайта.

Вот как описан механизм работы робота Яндекса в зависимости от настроек в robots.txt (полная версия мануала по использованию robots.txt):

В роботе Яндекса используется сессионный принцип работы, на каждую сессию формируется определенный пул страниц, которые планирует закачать робот. Сессия начинается с закачки robots.txt сайта, если его нет, он не текстовый или на запрос робота возвращается HTTP-код отличный от '200', считается, что доступ роботу не ограничен. В самом robots.txt проверяется наличие записей, начинающихся с 'User-agent:', в них ищутся подстроки 'Yandex', либо '*' (регистр значения не имеет), причем, если обнаружено 'User-agent: Yandex', директивы для 'User-agent: *' не учитываются. Если записи 'User-agent: Yandex' и 'User-agent: *' отсутствуют, считается, что доступ роботу не ограничен.


Итак, для "управления" зоной видимости определенного робота надо добавить в robots.txt несколько строк. "Распознаются" директивы Allow и Disallow, соответственно разрешающие и запрещающие доступ роботу/краулеру/и т.д. к определенным частям вашего ресурса.

Списки названий роботов поисковиков открыты, их можно без проблем найти в интернете. Вот, например, совсем недавно, буквально месяц назад (6 мая 2010 года), на блоге Яндеска был опубликован свеженький список User-Agent-ов его роботов.

Итак, вы можете редактировать robots.txt, чтобы запретить или разрешить доступ определенных роботов к разным частям сайта. Рассмотрим конкретный случай: у Гугля есть новостной робот, но архивы вашего сайта не нуждаются в полном обходе этим роботом, поэтому пишем:

User-agent: Googlebot-News
Disallow: /archives


Если у вас чисто новостной сайт, вы можете захотеть запретить индексацию всего сайта всеми роботами Гугля кроме новостного. Тогда вам понадобится уже две группы директив:

User-agent: Googlebot
Disallow: /

User-agent: Googlebot-News
Disallow:


Первая группа определит правило для всех гуглеботов, а вторая изменит установленные ранее правила конкретно для Googlebot-News.

Помимо роботов поисковых систем по сети шарят множество всяких краулеров, собирающих контент для разных нужд. В буржунете их наблюдается больше, по крайней мере больше жалоб :) Краулеры могут поднимать нагрузки на ваш сервак на нежелательный уровень. А "палятся" некоторые из них, как вы уже, наверное, догадались, своими User-Agent-ами. В буржунете я не раз встречала целые списки юзерагентов для блокировки, выложенные в паблик. При желании вы можете их найти. Например: The top 10 spam bot user agents you MUST block. NOW. ("Десять User-agent-ов спам-ботов, которые вы ДОЛЖНЫ заблокировать. НЕМЕДЛЕННО.") Или, как вариант, можете посмотреть сайт Bots vs Browsers, на котором в момент написания статьи собрана информация о 499551 юзерагентах, из которых ботов - 4439. Или уже известный многим сайт www.user-agents.org.

User-Agents vs browsers

Информацию о юзерагентах ваших "посетителей" вы можете посмотреть в лог-файле статистики. Если увидите что-нибудь подозрительное — уже знаете, как поступить :)

Отмечу также, что для каждого движка есть отдельные наборы рекомендаций к правилам составления robots.txt для роботов поисковых систем. Прежде чем самостоятельно придумывать конфигурацию, поищите в Интернете.


User-Agent и программист парсеров :)


Постоянные читатели, наверное, в недоумении: чего это я распространяюсь о том, как защититься от ботов? Для вновь прибывших повторюсь: я сама против воровства контента и его несанкционированного использования. Но целями парсинга может быть всякое (тут уж каждому по способностям).

Итак, рассмотрю вопрос применения знаний о User-Agent-ах со стороны создателя парсеров. Все более-менее серьезные библиотеки работы с HTTP поддерживают возможность подстановки в заголовки формируемых запросов "левой" информации о браузере. Не забудьте поменять установленные по умолчанию значения на что-нибудь более правдоподобное. (Отсутствие информации о браузере подозрительно в первую очередь). У Indy, например, по умолчанию стоит

Mozilla/3.0 (compatible; Indy Library)


Ну как тут не спалиться? Это первый претендент на добавление в black-list.

libwww, lwp-trivial, curl, PHP/, urllib, GT::WWW, Snoopy, MFC_Tear_Sample, HTTP::Lite, PHPCrawl, URI::Fetch, Zend_Http_Client, http client, PECL::HTTP — все это может вас выдать с головой.

Самый простой способ, это создать файлик со всевозможными браузерами, а потом при организации запроса подставлять рандомно одну из записей. Ресурсов с базами подходящих User-Agent-ов - масса, ссылки на них я приводила в первой части статьи.
___

Чтобы быть в курсе обновлений блога, можно подписаться на RSS.

Статьи схожей тематики:



4 комментария:

  1. Машенька, спасибо тебе большое за статьи!
    Год назад я учился программированию под протокол HTTP по твоим статьям, и многого добился.
    На данный момент, я отoшел от использования Indy, и пришел к ICS.
    Вопрос с юзер-агентом решаю тем, что создал наследника от HTTP-клиента и в конструкторе задаю рандомного юзер-агента из наиболее популярных по статье в википедии.
    Ну впрочем, в этом наследнике я не только это решаю.
    Еще раз спасибо.

    ОтветитьУдалить
  2. И вам спасибо, за то, что читаете :)

    А с ICS я не работала пока, но, кто знает, может и попробую когда-нибудь.

    ОтветитьУдалить
  3. "User-agent: Googlebot
    Disallow: /
    User-agent: Googlebot-News
    Disallow:"

    Если я правильно понял по смыслу текста, описывающего этот код, то вместо второго "Disallow" должно быть "Allow" !?

    ОтветитьУдалить
  4. Почему? Если Allow - то надо было бы еще указать, что именно. А тут - Disallow и пустой параметр.

    Я брала этот участок кода из официальной новости Гугля, не надо меня запутывать!)

    ОтветитьУдалить

Комментарии модерируются, вопросы не по теме удаляются, троллинг тоже.

К сожалению, у меня нет столько свободного времени, чтобы отвечать на все частные вопросы, так что, может, свой вопрос лучше задать на каком-нибудь форуме?

Поделиться