Как индексаторы поисковых систем обрабатывают javascript? 40

Недавно нами был проведен эксперимент, целью которого являлось доподлинно установить, как роботы-индексаторы различных поисковых систем обрабатывают HTML-код сайтов с включениями javascript и, в частности, редиректов.

Во время опыта на главной странице сайта с хорошей посещаемостью и высокими позициями в выдаче Google по профильным ключевым словам было размещено несколько страниц с разными фрагментами js-кода на каждой из них. Javascript различными способами перенаправлял браузеры пользователей на другие страницы, специально созданные для эксперимента, нигде не «засвеченные», и никоим образом не слинкованные с самим сайтом для обеспечения чистоты эксперимента. Таким образом, поисковый бот мог попасть на конечные страницы только через страницы с тестовыми скриптами. Оставалось только спустя некоторое время проследить по логам сервера, на какие из страниц заходили поисковые боты, а на какие – нет.

В итоге выяснилось, что Googlebot и прочие индексирующие боты различных поисковых систем смогли обработать почти все команды на javascript, включенные в код страниц, то есть, автоматически перенаправлялись, видели, и индексировали конечную страницу.

В первом примере кода, обработанного поисковым роботом, мы видим стандартную команду редиректа.

<script language=»JavaScript»>
document.location.href = «www.
site.com/directory/1.html»;
</script>

Во втором примере редирект осуществляется при помощи зашифрованного скрипта:

<script language=’JavaScript’>var str = ‘wbs%21s%3Eepdvnfou%2Fsfgfssfs-u%3E%23%23-r%3C

%0B%21%21%21%21%21%21%21%21%21%21%21%21%21%21

epdvnfou%2Fmpdbujpo%3E%23iuuq%3B00xxx%2Fbetpgu.efwfmpqnfou

%2Fdpn0uftukt03fod%2Fiunm%23%3C’; str = unescape(str); res = »; for (var i = 0; i < str.length; i++){ res += String.fromCharCode(str.charCodeAt(i)-1); } eval(res);</script>

В третьем примере индексирующему роботу предстояло обработать часть скрипта в iframe, с чем он успешно справился и перешел по ссылке:

<iframe xsrc=»www.site.com/directory/f.html» width=»100%» height=»100%» frameborder=0 hspace=0 vspace=0 marginwidth=0 marginheight=0 allowtransparency=true scrolling=no></iframe>

Но были и исключения. Вот фрагменты javascript-кода, которые могли бы служить редиректом для пользовательского Интернет-проводника, но не для поискового робота.

На одной из страниц редирект был сделан таким образом, что обработать и исполнить его мог либо браузер, либо краулер с функциями форматирования и обработки блоков HTML страницы, подобными браузерным. Скрипт выглядел примерно так:

<div style=»overflow:auto; height: 1px;»>
<table width=»100%»>
<tr>
<td id=»first»>aassssssdddddffffgggghhhhjjjkklll</td>
<td>aassssssdddddffffgggghhhhjjjkklll</td>
<td>aassssssdddddffffgggghhhhjjjkklll</td>
<td>aassssssdddddffffgggghhhhjjjkklll</td>
<td>aassssssdddddffffgggghhhhjjjkklll</td>
<td>aassssssdddddffffgggghhhhjjjkklll</td>
<td>aassssssdddddffffgggghhhhjjjkklll</td>
<td>aassssssdddddffffgggghhhhjjjkklll</td>
<td>aassssssdddddffffgggghhhhjjjkklll</td>
<td>aassssssdddddffffgggghhhhjjjkklll</td>
</tr>

<tr>
<td>aassssssdddddffffgggghhhhjjjkklll</td>
<td>aassssssdddddffffgggghhhhjjjkklll</td>
<td>aassssssdddddffffgggghhhhjjjkklll</td>
<td>aassssssdddddffffgggghhhhjjjkklll</td>
<td>aassssssdddddffffgggghhhhjjjkklll</td>
<td>aassssssdddddffffgggghhhhjjjkklll</td>
<td>aassssssdddddffffgggghhhhjjjkklll</td>
<td>aassssssdddddffffgggghhhhjjjkklll</td>
<td>aassssssdddddffffgggghhhhjjjkklll</td>
<td id=»second»>aassssssdddddffffgggghhhhjjjkklll</td>
</tr>

</table>
</div>

<script language=»JavaScript»>

var D=document;

function AbsPos(O, Parent){
var X=0, Y=0, Next, D=document;

Next=O; if (Parent==null) Parent=D;
while (Next!=null && Next!==Parent){
Y+=Next.offsetTop; X+=Next.offsetLeft; Next=Next.offsetParent;
}
return [X, Y];
}

var first = AbsPos(D.getElementById(‘first’));

var second = AbsPos(D.getElementById(’second’));

if (first[0] != second[0]) {
document.location.href = «http:/’+’/www.
site.com/directory/t.html»;
}

else {
document.write(‘
whatever‘);
}

</script>

Как выяснилось, боты поисковых систем такими свойствами (к слову, совершенно лишними для робота индексатора) не обладают. Воспользовавшись этим наблюдением, можно редиректить только браузеры реальных пользователей, полностью скрывая истинное назначение объекта javascript от краулеров поисковых систем.

В следующем примере редирект должен был срабатывать при наведении курсора мыши на активное окно браузера:

<script language=»JavaScript»>

function f(){
document.location.href = «www.
site.com/directory/x.html»;
}

window.onFocus = f()

</script>

Разумеется, по этой ссылке краулер не прошел, так как не мог выполнить требуемых действий.

В третьем образце кода URL-ссылка помещалась в теле js-объекта, но не служила редиректом.

<script language=»JavaScript»>
function rnb() {
www.
site.com/directory/abc.html
}
</script>

По этой ссылке краулеры тоже не прошли, из чего следует еще один вывод. Команды языка javascript индексирующие роботы компании Google и других поисковых систем обрабатывают корректно, то есть исполняют скрипт, и “видят” результат выполнения скрипта. Однако раскладывать скрипт на составляющие, т.е. парсить, не умеют.

Итак, подведем итоги: краулеры основных поисковых систем и Google, в частности, умеют исполнять, но не парсить команды javascript. То есть, они способны понять, для чего данный скрипт сделан, и является ли он безобидным скриптом, составляющим часть динамического оформления страницы, или же коварным ходом поисковых оптимизаторов. Если скрипт составлен с учетом специфики его обработки браузером и поисковым роботом, то можно утаить от поисковых систем истинное назначение ваших скриптов. Все это выглядит как прием Black Hat SEO, но в ряде случаев такая техника может быть необходима для более удобной реализации вполне миролюбивых целей.

Комментарии к “Как индексаторы поисковых систем обрабатывают javascript?

  1. Ответить Alex Dec 25, 2006 20:45

    Неплохо для бесплатного совета =)

  2. Ответить Sergei Dec 26, 2006 11:53

    «либо браузер, либо краулер с функциями форматирования и обработки блоков HTML страницы, подобными браузерным»

    Да я думаю есть еще много таких способов которые поймет только браузер, просто надо хорошенько усложнить логику проверки и применить что-то такое чего действительно может сделать только браузер, т.е. посмотреть список всех свойств объектов в DOM. Да и не обязательно наверное городить скрытый элемент с лишним текстом – позиции сравнивать можно и у любых открытых элементов, и даже не надо вычислять точную позицию – достаточно просто сравнить offsetTop.
    Кстати, пример явно крупноват, можно было бы и поменьше строчек с «aassssssdddddffffgggghhhhjjjkklll» сделать :).

    «когда окно браузера становится активным»

    Как выяснилось в результате экспериментов, первый раз событие onfocus срабатывает тогда же когда и onload, т.е. после полной загрузки страницы со всеми картинками, что обычно очень долго, но здесь ошибка – функция вызывается в выражении присваивания window.onFocus = f() и поэтому она выпоняется сразу. Почему это не выполняет Google – вопрос.

    «обрабатывают корректно, то есть исполняют скрипт, и “видят” результат выполнения скрипта. Однако раскладывать скрипт на составляющие, т.е. парсить, не умеют» – что значит эта фраза?

  3. Ответить Alex Dec 26, 2006 13:32

    Интересно, если заменить
    if (first[0] != second[0])

    на
    if (first[0] > 0)

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

  4. Ответить RedLine Dec 26, 2006 15:29

    >> Sergei Says:
    >> Да я думаю есть еще много таких способов которые поймет только браузер, просто надо хорошенько усложнить логику проверки и >> применить что-то такое чего действительно может сделать только браузер, т.е. посмотреть список всех свойств объектов в DOM.

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

    >> Да и не обязательно наверное городить скрытый элемент с лишним текстом – позиции сравнивать можно и у любых открытых
    >> элементов, и даже не надо вычислять точную позицию – достаточно просто сравнить offsetTop
    У любых открытых по моему не очень удобно, тк в таком случае часть скрипта будет находится вне блока
    Что если ,например абзац с айдишником используемый для скрипта, удаляется в процее работы над сайтом, а в скрипт внести изменения забыли? и обозначить новый элемент тоже?

    >> но здесь ошибка – функция вызывается в выражении присваивания window.onFocus = f() и поэтому она выпоняется сразу.

    Вот из за этой «ошибки» редирект как раз таки и происходит сразу же. Попробовал сам, сделал на странице с картинками, медленной, и находящейся на медленном серваке :-)

    >> Почему это не выполняет Google – вопрос.
    А почему же он должен это выполнять по вашему?

  5. Ответить RedLine Dec 26, 2006 15:42

    >> Alex Says:
    >> Интересно, если заменить
    >> if (first[0] != second[0])
    >> на
    >> if (first[0] > 0)
    >> что что-то изменится в плане индексируемости роботом? Если нет, то незачем и огород городить, и можно легко унифицировать функцию для любого сайта.

    А как? В приведенном скрипте, first[0] это координата по иксам первого элемента (aassssssdddddffffgggghhhhjjjkklll), а second[0] – второго соответственно. И они по условию, не должны быть равны, для того чтобы редирект сработал.
    В Вашем же случае, if (first[0] > 0) он будет редиректить если координата по иксам первого элемента, больше нуля.
    Может я не совсем понимаю, тогда поправьте.
    Но что, если это первый отображаемый элемент вообще? Так как он стоит перед основным телом документа? Тогда его координата по иксам в любом случае, и при любом раскладе будет равна нулю, например.
    А больше нуля, она может быть и так и сяк, независимо от того, бот ли зашел ,или человек. Тут же вся суть в сравнении координат двух элементов.

  6. Ответить Diplomat Dec 27, 2006 00:18

    Отлично, остается испробовать на практике ;-)

  7. Ответить Anonymous Dec 27, 2006 15:51

    >> А как? В приведенном скрипте, first[0] это координата по иксам первого элемента (aassssssdddddffffgggghhhhjjjkklll), а second[0] – второго соответственно. И они по условию, не должны быть равны, для того чтобы редирект сработал.

    Ты в браузере открой и посмотри координаты – они же на разных строках ! Значит разные.
    А робот не отображает на экран и соответственно не может знать координат вообще. Вот и вся тема.

  8. Ответить RedLine Dec 27, 2006 17:01

    >> Ты в браузере открой и посмотри координаты – они же на разных строках ! Значит разные.
    >> А робот не отображает на экран и соответственно не может знать координат вообще. Вот и вся тема.

    НУ мля, Анонимус, я это и талдычу! Просто Алекс предлагает упростить, я ему и попытался объяснить, что не совсем понимаю предложенный им вариант! :-)

  9. Ответить Set Dec 27, 2006 19:17

    Хорошее исследование.

    Вот только парсинг – это процесс синтаксического анализа. В данном случае, наверно, лучше бы подошёл термин рендеринга страницы.

  10. Ответить Navigator Dec 28, 2006 00:13

    По-моему глупо предполагать что боты тупые. Лично я не вижу препятствий использования ботами виртуальных ява-скрипт машин. Есть реализация ява-скрипт на яве: чем не вариант?! И тогда игры с DOM не помогут. Начнутся извращения наподобие первых вирусов, использовавших работу с портами, чтобы обойти эмулирование антивируса.

  11. Ответить Navigator Dec 28, 2006 00:22

    >> А робот не отображает на экран и соответственно не может знать координат вообще.

    Это почему же? Если не отображает, это не значит что не знает!
    Построить DOM структуру страницы можно и самому, можно класс написать.
    Думаю есть и готовые варианты :-)

  12. Ответить evgwest Dec 28, 2006 03:14

    Интересно, а Яндексовый хитробот как относится к таким скриптам?:)

  13. Ответить Offshore Dec 28, 2006 12:12

    Интересное исследование… Спасибо!

    Только вот у меня есть небольшое сомнение по поводу этого. Возможно, я не достаточно внимательно все читал, но как вы определили, что бот исполнил редирект? По тому, что он проиндексировал страницы, на которые был js-редирект? В таком случае, думаю, могло быть так, что, к примеру, Гугл проиндексировал страницы только из-за того, что вы (в ходе эксперимента) заходили на него с браузера, где был установлен Google Toolbar, что само по себе уже дает Гуглу информацию об этих страницах и повод к их индексированию (заходу ботов туда).

    И если можно, попутный вопрос (думаю, всем будет интересно)… Как долго времени прошло с момента появления редиректов до первых заходов ботов в каждом из случаев?

  14. Ответить Sergey S. Kostyliov Dec 28, 2006 12:31

    >> Гугл проиндексировал страницы только из-за того, что вы (в ходе эксперимента) заходили на него с браузера, где был установлен Google Toolbar, что само по себе уже дает Гуглу информацию об этих страницах и повод к их индексированию (заходу ботов туда).

    По никем не оспоренному утверждению Matt Cutts: Toolbar doesn’t lead to page being indexed.

  15. Ответить Дима Dec 28, 2006 13:29

    >> В таком случае, думаю, могло быть так, что, к примеру, Гугл проиндексировал страницы только из-за того, что вы (в ходе эксперимента) заходили на него с браузера, где был установлен Google Toolbar

    Нет, такого быть не могло. Конечно, мы не открывали эти страницы в браузере с тулбаром :)

  16. Ответить нуб Dec 28, 2006 15:11

    То есть какой скрипт витоге круче подойдет для доров ??

  17. Ответить Frenzy Dec 28, 2006 20:38

    Камменты не дочитал, но:
    - С Яндексом до поры до времени подобные хитрости проходили :)
    - Ошибочные, хитрые, DOM и т.п скрипты… зачем все они, когда есть onmouseover! :)

  18. Ответить Женя Dec 29, 2006 03:43

    C точки зрения белого SEO очень даже интересно, а вот с дорами не поможет.
    Один хрен гугля попалит, что это по тому куда оно идет, уж очень много пользователей с гуглтулбарами уже сейчас. Колличество зафиксированных переходов за условную еденицу времени и все капец – фильтр, и мы переезжаем из первого десятка даже не во второй. Тоесть время жизни счастливой и топовой определяется скоростью отдачи инфецированными тулбаром серчерами отчета о том где побывали.

    это конечно все ИМХО – я параноик =)

    з.ы.
    Как то раз дорвался до компа своей подружки, гружу IE, а там тулбар!!!… спрашиваю у милого создания, «Дорогая, а нахуа?»
    Создание хлопает ресницами и говорит: «Я не помню и вообще не знаю, что это такое»… Эта же хрень предлогается к установке с популярными пакетами, чайники и ставят себе все подряд. чайников много – демократия побеждает и тут мля.

  19. Ответить Sergey S. Kostyliov Jan 5, 2007 17:04

    Хорошая статья. Перевёл её на английский. Перевод уже успел прочитать Matt Cutts. Откомментил: «Интересно» ;)

  20. Ответить fornex Jan 7, 2007 02:10

    Олег, можно перевести Вашу статью на немецкую мову с указанием ссылки на оригинал?

  21. Ответить Vladimir Jan 24, 2007 23:14

    зачем им это светить спрашивается (может и в курсе конечно) чтоб прикрыли то что работает на вас?
    p.s сам пока не проверил токо прочел :(

  22. Ответить alexf2000 Jan 26, 2007 00:54

    Насчёт варианта редитекта, неотлавливаемого ботами – функция AbsPos в разных браузерах одинаково работает? Может быть с этим связано, что боты не могут вычислить координаты? Потому что делать интерпретатор жабаскрипта оторванный от остальных браузерных потрохов врядли бы кто-то стал.

  23. Ответить TWteam Jan 26, 2007 03:41

    То что боты шустро обрабатывают все onmousedown, onclick и т.д. я заметил давно.
    Интересно как, если вообще google относится к коду в *.js файлах
    типа …

    Кто либо имел опыт?

  24. Ответить KS Feb 1, 2007 17:09

    Ссылка та на английском не работает. Раз это blogspot (=Google) то наверное они и прикрыли. Теперь это есть здесь:
    64.233.183.search?q=cache:C0ql3XhRS70J:rathamahata.blogspot.com/how-do-search-engines-bots-handle.html+how-do-search-engines-bots-handle.html&hl=en&ct=clnk&cd=1

    (http://www.google.com/search?complete=1&hl=en&q=how-do-search-engines-bots-handle.html)

    И сколько оно там будет неизвестно. Был блог и нету. Вот и перевел человек статью про black SEO.

  25. Ответить alex Feb 10, 2007 02:54

    Блин, не ужели они на столько жестоко все удаляют.
    Обидно :-(

  26. Ответить fisherman Feb 10, 2007 03:42

    А что там было такого свехестественного?

  27. Ответить Google Adsense M May 11, 2007 01:38

    Вряд ли у поисковиков имеються полноценные JS-парсеры (ресурсов много есть будет), хотя кто знает. Надо тестировать.

  28. Ответить tikibu May 25, 2007 15:11

    Зачем поисковиками, конкретно, Googl’у обрабатывать js? У него есть toolbar, который использует куча людей, и на сайте с большой посещаемостью с большой вероятностью наёдётся хотя бы один с тулбаром. А toolbar отсылает гуглу сведения о странице, на которую произошел переход. Есть некоторые но в таком варианте, но менее ресурсоёмко, чем парсить js(imho).

  29. Ответить TerVer May 26, 2007 01:34

    Что-то все пугают этим тулбаром. А вот снифирить пактеты с работающим тулбром никто не пробовал?
    Займусь. Можно я так думаю хотя бы проанализировать пакеты с включеным и выключенным тулбаром.
    Хотя если тулбар так работает скрытно – это чистой воды шпионство. И такое врядли приветсвуется в развитых странах. Ну а post еще проще отследить…

  30. Ответить Promo Jul 8, 2007 10:11

    в качестве эксперимента, закрывал ссылки от роботов так:
    URL: mag.ru
    после прочтения вашей статьи прошелся по всем ссылкам. Упоминаний у Гугла нет.

  31. Ответить Promo Jul 8, 2007 10:17

    факир был пьян!!!
    URL: hits.ruo

  32. Ответить Aero Aug 30, 2007 13:10

    Спасибо за статью. Много мыслей породила и еще больше вопросов :)

  33. Ответить Drive Sep 7, 2007 21:53

    Немного позновато прочитал,продолжение будет?Хотелось бы :)

  34. Ответить Я тут новый Oct 18, 2007 19:33

    Вот тут еще мысль появилась – как на счет try{}catch(e){}

    script

    try{
    document.getElementById(«anything»);
    } catch(e){
    // тут будет редирект
    }
    /script

    в хедере этот блок выдаст ошибку. так как документ еще не загрузился, а dom не знает про него

  35. Ответить Саша Feb 19, 2008 01:24

    Исходники Google toolbar для Firefox должны быть по идее открыты. Поэтому можно просто посмотреть.

  36. Ответить vadik May 30, 2008 22:20

    ботам вобще вроде плевать на редирект и куда он ведет доры с редиректами
    var a1=’win’, a2=’dow.’, a3=’loca’, a4=’tion.’, a5=’replace’,
    a6=’(«www.seoweblog.ru»)’;
    var i,str=»”;
    for(i=1;i<=6;i++)
    {
    str += eval(«a»+i);
    }
    eval(str);

    висят месяцами пока хостер не удалит,если они не в топе конечно,все абузы руками делаются

  37. Ответить andrew13 Jun 3, 2008 12:03

    to vadik – не все руками. Если вы так считаете вы очень сильно заблуждаетемь.
    Почитайте тот же умаксфорум – тама на эту тему много обсуждений.

  38. Ответить alexei Oct 10, 2008 16:45

    Не совсем понятно – что значит-(….. то есть исполняют скрипт, и “видят” результат выполнения скрипта. Однако раскладывать скрипт на составляющие, т.е. парсить, не умеют.)
    -…исполняют скрипт, и “видят” результат выполнения скрипта.- значит ли это что в результате исполнения javascript-та например с помощью XMLHttpRequest полученный контент будет проиндексирован?

  39. Ответить Nik Jun 18, 2009 22:02

    Эх, спалили тему…

Комментировать

  

  

  

Рассказать друзьям: