Наконец-то готовы результаты эксперимента с индексацией javascript-текста в Google и работы ссылок, спрятанных через яваскрипт. Ниже приведены подробности этого исследования.
Гипотеза
Судя про проведенным ранее экспериментам, результаты которых актуальны и поныне, javascript из всех поисковиков читает лишь Google. Поэтому, в данном исследовании затрагивается лишь эта поисковая система. Многие знают, что от Google контент спрятать сложно, но интересно было все же разобраться, парсит ли Google яваскрипт любой сложности или только простые выражения?
Гипотеза состояла в том, что поисковая ситема Google распознает лишь простые варианты скриптов и контент можно спрятать, усложнив скрипт.
Цель эксперимента
Целью данного исследования является подтвердить или опровергнуть гипотезу, а также в случае опровержения определить, какие все же скрипты Google не распознаст.
Проведение эксперимента
Для проведения эксперимента 20 февраля 2011 г. была создана отдельная страница, на которой расположен контент с ссылками с помощью javascript в разных вариантах: с помощью обычного document.write, кусочного, вызова функции, подключения внешних файлов, в том числе обфускейченных (запутанных), а также с помощью работы с DOM документа.
Ссылка на экспериментальную страницу была добавлена в Твиттере с просьбой заретвитить (спасибо всем за помощь, в сумме было 27 ретвитов). Другими словами, тви-друзья помогли сделать страницу популярной для Google, чтобы ускорить индексацию и быстрее узнать результаты. Через несколько минут страница уже была в индексе, но ссылки пока не работали. На данный момент основной робот Google проиндексирвал весь необходимый контент и можно проверять результаты.
Результаты эксперимента
Рассмотрим полученные результаты по каждому из видов используемого javascript-подхода.
1. Безатрибутная ссылка
Этот приём использует ссылку без атрибута href и для роботов такой тег не является ссылкой. На экспериментальной странице с помощью DOM был добавлен атрибут href:
<a name="a" id="a">безатрибутный индекс</a>. <script type="text/javascript">document.getElementById("a").setAttribute("href","http://seodic.ru/terms/%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81");</script>
Результаты в данном случае показали, что такая ссылка не работает для Google, то есть, вес не передаёт. По уникальному анкору “безатрибутный индекс” страница-акцептор не находится.
2. Кусочный document.write
Здесь использовалось небольшое усложнение, когда строка была разбита на несколько строк с их конкатенацией:
document.write("Немного контента с уникальной фразой devjslink и обещанной ссылкой " + "<" + "a h" + "ref" + "=\"h" + "tt" + "p:" + "//" + "seodic" + "." + "ru" + "/terms/" + "%D0%B6%D0%B8%D1%80%D0%BD%D0%B0%D1%8F-%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B0" + "\"" + ">" + "кусочная js ссылка" + "<" + "/" + "a" +">" + ".");
Такая конструкция не помогла, Google проиндексировал контент, как видит это пользователь. По уникальному тексту devjslink можно найти экспериментальную страницу, а по уникальному тексту анкора кусочная js ссылка находится акцептор (страница, куда ведет ссылка). То есть, в этом случае вес по ссылке передался, она учлась.
3. Вызов внутренней функции и document.write
Внутри документа была описана функция, содержащая document.write с выводом определенного текста и ссылки. В нужном месте документа была вызвана эта функция.
Результаты показывают, что в этом случае яваскрипт-контент индексируется и ссылка находится. Такая ссылка тоже передает вес.
4. Вызов функции из внешнего файла и document.write
Эта часть похожа не предыдущую, только функция была определена во внешнем доступном файле file2.js, подключенном в документе.
Результаты показали, что вызов функции из внешнего файла также обрабатывается Google и результаты аналогичные предыдущим – контент индексируется, ссылка работает.
Интересно было посмотреть серверные логи, когда именно поисковый робот заходил за дополнительными .js файлами. Анализ логов показал, что Google читает внешние файлы не сразу, а через какой-то промежуток времени (около недели) и приходит с тем же юзер-агентом “Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)”. Также интересно, что внешние файлы для страниц запрашиваются, практически, одновременно (в отличие от html-страниц сайта) с частотой около 2 раз в месяц.

5. Внешний скрипт и document.write
Во внешнем скрипте (file1.js) сразу был описан document.write без дополнительных функций. По текущим результатам контент проиндексирован, так как экспериментальная страница находится по уникальному тексту из скрипта devjsrelink, однако, ссылка не работает (проверка). Очень странное явление, так как подобная конструкция оказалась не самой сложной и Google её распарсил (распознал), но ссылке вес не передал. Полагаю, что это временно и после следующей переиндексации ссылка сработает.
6. Обфускейченный внешний скрипт с document.write
В этой части эксперимента было создано два обфускейченных файла: file3.js, file4.js. Различаются они лишь методом обфускации.
Результаты показали, что и в первом и во втором случае ссылка работает и акцептор находится. Другими словами, обфускация не помогает для скрытия алгоритма, Google видит контент также, как и пользователь.

7. Запрет индексации внешнего скрипта в robots.txt
В этой части был создан файл file5.js, содержащийся, в отличие от других, в папке /robots/, которая закрыта от индексации с помощью корневого файла robots.txt.
Результаты показывают, что контент из этого файла так и не проиндексировался (проверочная ссылка). Анализ серверных логов показал, что в папку /robots/ Google не заходил, а соответственно, file5.js не индексировал.
8. Работа с DOM документа
Следующий текст с ссылкой были созданы с помощью работы с DOM документа.
var a = document.createElement("A");
a.setAttribute("href", "http://seodic.ru/terms/%D1%80%D0%B5%D0%BB%D0%B5%D0%B2%D0%B0%D0%BD%D1%82%D0%BD%D0%BE%D1%81%D1%82%D1%8C");
a.innerHTML = "экспериментальная dom ссылка";
var s = document.createElement("SPAN");
s.innerHTML = "Этот текст и ссылка добавлены с помощью работы объектной модели DOM… ";
s.appendChild(a);
var span = document.getElementById("b");
span.appendChild(s);
Проверочная ссылка показывает, что ссыка в данном случае не сработала (вес не передала), но контент все же попал в индекс (страница находится по уникальной фразе, присутствовавшей в скрипте).
9. Комплексный вариант скрипта
И последний случай – комплексный вариант, в котором задействованы все предыдущие модели: обфускейченный внешний файл размещаем в папку, закрытую от индексации в robots.txt, при этом в файле используем функцию, работающую с DOM. В нужном месте вызываем функцию, печатающую контент с ссылкой.
Результаты такого варианта прогнозируемы, контент не индексируется, ссылка соответственно.
Выводы
Как видно из результатов эксперимента, от робота Google не так просто что-то скрыть. Все варианты ссылок работают, за исключением тех, что размещены во внешних файлах, закрытых от индексации. Также в ряде случаев при работе с объектной моделью документа, поисковый парсер не всегда распознает ссылки, но посмотрим, что будет в будущем. Наша гипотеза не подтвердилась.
Если у вас есть какие-то комментарии – делитесь!
Постовой: Эксперимент частично проведен по просьбе Dimox.


Dmitrii
Март 30, 2011 at 15:03
1Отличный эксперимент.
Походу гугль парсит сайты своим браузером и скоро научится кликать на flash-контент :)
АлаичЪ
Март 30, 2011 at 15:11
2Очень мощный эксперимент! Сергей, ты просто крут.
Значит на некоторых своих сайтах придется изменить способ скрытия ненужных кусков кода во внешний файл. По идее такой способ будет работать всегда, если запретить к индексации этот файл.
Еще раз спасибо, за такой эксперимент.
toxa
Март 30, 2011 at 15:12
3Про document.write() еще давно где-то читал, что гугль парсит его. DOOMаю и DOM-скрипты парсить скоро начнет) Прекрасная статья. Честно говоря, был о Гугле более высокого мнения))
Иван
Март 30, 2011 at 15:22
4Интересный эксперимент, нужный…
Я недавно столкнулся с сылками в ява в виджете случайных постов http://get.2leep.com/. Переписывался с разработчиками, заверили что поисковики ссылки не видят, и действительно на это и похоже… Это дополнение к Вашему эксперименту)))…
Dimox
Март 30, 2011 at 15:23
5Сергей, правильно ли я понимаю, что Гугл учитывать ссылки из такого скрипта? – http://pastie.org/1734880
Zerohold
Март 30, 2011 at 15:27
6Эксперимент отличный.
Но и результат закономерный и очевидным тем кто занимается программирование профессионально.
На самом деле document.write довольно легко распознать результат этой функции и плевать как она будет зашифрована. Другой вопрос когда контент подгружается динамически и подгружается в DOM объекты по событию.
В любом случае стоит отметить что Google движется в правильном направлении ибо рано или поздно встанет вопрос очень актуальным по индексации контента обработанного AJAX способами.
Aleks Revo
Март 30, 2011 at 15:58
7Возможно дело даже не в опознании, а в выполнении кода – какой-нибудь облегчённой версией v8 – тогда ни о каком шифровании не может идти и речи, если шифрограмма содержит ключ к самой себе. Хотя против этой версии вроде бы говорят результаты с потерянными ссылками, но возможно это всего лишь банальные ошибки алгоритма распознавания.
Было бы интересно проверить как гугл борется с ошибками JS – например, бесконечным циклом или рекурсией: ставит лимит по времени, ставит лимит по количеству проходов/вложенностей или отбрасывает результат вообще во избежание замусоривания?
Есть ещё варианты с заменой контента по событиям key*, mouse*, *click, timeout, а также в зависимости от random.
В любом случае – огромное спасибо за проделанное исследование, которое интересно как с точки зрения сокрытия нерелевантной части контента, так и с точки зрения увеличения доступности целевой.
staurus
Март 30, 2011 at 16:04
8Отличный эксперимент! Сергей, а ты не проверял случаем onclick window.open заключенный в dive? Анализаторы ссылку не видят, видит ли Google ее?
Devaka
Март 30, 2011 at 16:29
9@Aleks Revo:
Вероятно, что гугл не борется с js-ошибками. Хотя, подозреваю, что такие сайты у него входят в определенный список :) все же это одна из косвенных метрик поведенческого фактора.
@Dimox:
По всей видимости, этот вариант будет распознан гуглом.
@staurus:
Подробно не проверял, но сотрудники Google у себя на блоге как-то этот момент освещали, что они понимают onclick и location.href.
Андрей Мухачев
Март 30, 2011 at 16:32
10очень любопытный эксперимент
Dimox
Март 30, 2011 at 16:42
11Понятно. Большое спасибо за эксперимент!
Alex
Март 30, 2011 at 17:21
12Видел в беках ссылки из PDF файлов, есть ли с них толк?
Akceptor
Март 30, 2011 at 18:12
13Alex, ПДФки вроде нормально индексируются. Видел даже где-то эксперимент по продвижению ими
rushter
Март 30, 2011 at 22:53
14Вообще было глупо не верить что гугл на 100% понимает js, когда у них самые лучшие наработки по работе с ним. Например V8 JavaScript.
Это я не про автора статьи, а про вебмастеров в целом :)
Boris
Март 30, 2011 at 23:14
15Чувствую, что все закончится в итоге необходимостью действительно убирать лишние ссылки, а не прятать.
Ustas
Март 31, 2011 at 00:26
16‘Пост года’ в моем ридере ! Супер!
Олег
Март 31, 2011 at 06:28
17Да, серьезная работа. Только я, отличие от toxa был о Гугле МЕНЕЕ высокого мнения :) Оказывается, он не так прост
Юмиком
Март 31, 2011 at 09:52
18Большое спасибо за эксперимент! Будем убирать все лишние ссылки.
Compplace
Апрель 1, 2011 at 03:47
19А по-моему так при большом желании можно и скрыть от гугля всё что угодно.
Например через jQuery в какой-нибудь div или span выводить ссылку. Сам код положить в зашифрованный через escape и eval файл, или там сделать так чтобы эти jQuery скрипты качали с какого-то PHP скрипта код и выводили его в какие-то дивы… Извратиться можно очень даже хорошо. А то что варианты с createElement и document.write легко распознаются это очевидно…
basken
Апрель 1, 2011 at 13:01
20Очень хорошая статья! Спасибо за эксперемент, ваша информация очень полезна!
armid
Апрель 3, 2011 at 09:53
21А как обстоит дело с популярным методом go.php? Когда ссылка имеет вид http://say.com/goto/http://sayt.com.ua По идее так вес не должен передаваться.
И еще вопрос. Как вы точно определяли передачу веса? Ведь наличия фразы анкора ссылки в индексе не говорит о передачи веса.
Филя
Апрель 3, 2011 at 19:33
22Экспериментами интересуюсь неохотно, но информация будет полезна, если потребуется скрыть что-то от поисковика – лишний раз не полезу её искать.
Что-то запустили Вы, Сергей, немного свой блог: по запросу “seo блог” в Google на двадцатое место переместились, а пару месяцев назад (плюс/минус месяц) были на первом. Или конкуренты просто начали активнее участвовать…
sharpmaster
Апрель 4, 2011 at 03:09
23Товарищ, не смешивайте в кучу DOM, DHTML и JS.
И почитайте историю этих вещей.
Лично меня результат не удивил.
Андрей
Апрель 5, 2011 at 12:06
24А как обстоит дело с популярным методом go.php? Когда ссылка имеет вид http://say.com/goto/http://sayt.com.ua По идее так вес не должен передаваться.
————————-
Тоже интересен этот метод? Работает ли он сейчас для запрета индексации ссылки и запрета передачи веса?
LEXASOFT
Апрель 8, 2011 at 09:45
25Андрей, если закрыть папку goto в robots.txt то гугл не передаст вес
Ondevices
Апрель 18, 2011 at 23:35
26Великолепный эксперимент! Мы в офисе все спорили, и мне все доказывали, что гугл видит любые ссылки с использованием javascript, однако, это не так. Спасибо.
PS 9 вариант – это жесть =))
yuriki
Апрель 30, 2011 at 11:04
27Я когда-то сделал сервис по кодированию ссылки с помощью ява скрипта http://domservisa.com/allfiles/java-encoder-decoder-html.php но судя с эксперимента – это уже неэффективный метод для гугла?
Дмитрий
Май 4, 2011 at 14:41
28Добрый день Сергей, получается, что на данный момент скрыть от поисковика ссылку, можно только последним методом? Спасибо.
Николай
Май 6, 2011 at 14:05
29Статья крайне пользительная. А вот такой вопрос. На странице в Фэйсбуке добавлен таб, который черех iframe вызывает скрипт на сервере. Результат работы скрипта – контент со ссылками.
Я скачал страницу этого таба менеджером закачек – ХТМЛ-код содержит адрес скрипта на сервере. Правда, этот урлик напрочь заслешованный, типа:
http:\/\/www.myserver.com\/php\/rss\/rss-news-display.php
Вот что в этой истории интересно.
Полагаю, гуглбот эту ссылку также видит. А вот “учтет” ли он её и пойдет ли он по ней дальше?
SeoMurzikof
Май 14, 2011 at 10:30
30Сильная статья!Кстати, вы мне открыли глаза на некоторые скрипты…думал что они работают, а на самом деле нет(((
svoloth
Июнь 25, 2011 at 18:32
31На самом деле document.write довольно легко распознать результат этой функции и плевать как она будет зашифрована.
svoloth
Июль 12, 2011 at 15:47
32Спасибо за эксперемент, информация очень полезна!
Альберт
Июль 27, 2011 at 11:24
33Любопытный эксперимент. Получается, что индексируется практически все. Действительно полезный эксперимент.
Genichesk
Август 1, 2011 at 10:07
34гугл учитывает и скрипты и даже флеш (по крайней мере, первый уровень вложенности) – точно знаю: сайт кроме флеш-контента не имел ничего. А пункты меню в спипете выдавались, когда набрать название сайта в посике гугла.
А чего так удивляться про скрипты – гугл хром же всё видит. Вот, возможно, и боты будут по такому же принципу работать, кто знает?
Aleks Revo
Август 1, 2011 at 16:26
35Ну, собственно, тут народ рецепты предлагает: python + SpiderMonkey/V8 + PyWebKit = практически готовый браузер. А разобрать DOM загруженной и отрендеренной странички после исполнения всех (или почти всех) скриптов – задача не архисложная, благо всё уже за нас сделано. С флэшем сложнее – нужно написать свой плеер. Несмотря на то, что протокол открытый, и есть реальные проблемы с самим проприетарным флэшем – никто в OpenSource не спешит писать свой плеер, видимо есть останавливающие причины.
Живущий в интернете
Сентябрь 22, 2011 at 10:59
36Полезно, надо продолжать искать способы скрытия информации от гугла. Наверняка что-то должно быть такое простое без всяких выносов в отдельный файл и скрытия от индексации в роботс
Coca Cola
Сентябрь 22, 2011 at 21:12
37гугль можно обмануть js’ом, т.к. там не искусственный интеллект…
lamer
Октябрь 29, 2011 at 16:09
38А что будет со ссылками вида <a ustr=“урл сссылки”>ссылка</a>, где ustr jquery-скриптом заменяется на href? Будет ли данный урл распознаваться гуглем, если у него параметр href не задан, но сама ссылка присутствует в невалидном параметре.
Seiku
Декабрь 9, 2011 at 14:01
39Полезный эксперимент. Етого низнал (google sees everething).
Andrii
Декабрь 26, 2011 at 08:19
40т.е. можно во внешнем файле с стилями прописать display: none потом закрыть его через robots.txt и будет вам счастье?
oroom
Январь 18, 2012 at 14:48
41Ага, до первого стука с жалобой на клоакинг. За не спрятанный display:none тоже не банится сайт обычно сам по себе.
Дмитрий
Февраль 7, 2012 at 14:45
42скоро вообще сложно будет что-либо скрыть от ПС, а эксперимент действительно полезный.
Весельчак
Март 4, 2012 at 20:48
43А, все-таки, Гугл window.open распознает или как?
JuliaWeb
Март 19, 2012 at 15:24
44Сергей, читаю Ваш блог с интересом, вроде бы занимаюсь SEO почти 10 лет, а все равно узнаю что-то новое в Ваших статьях. Подписалась на рсс. Спасибо :)
Виталий
Апрель 18, 2012 at 21:30
45Здравствуйте.
Статья очень любознательная, только не понял одной детали.
У меня на site1.ru есть такой код:
<script src=“http://site2.ru/file.js”></script>
<script>example()</script>
В file.js написано:
function example() { document.write(’<div onclick=“window.open(‘http://site1.ru’)”>ссылка</div>’)
}
Растолкуйте, пожалуйста, пойдёт ли Гугл по такой ссылке и передаст ли вес? И то же самое, если заменить onclick на href.