вторник, 29 марта 2011 г.

Как сделать sitemap блога на Blogspot для Яндекса




Вобще данная тема достаточно избитая и Google и Яндекс выдадут вам кучу ссылок и массу информации на данную тему. Но как показала практика все что мне попадалось на деле из рецептов фактически не работало. С индексацией Google можно вобще не экспериментировать - Blogspot принадлежит Google и индексируется там все чертовски быстро. А вот с Яндексом все гораздо интереснее оказалось. Но я прошел этот квест и добился того что Яндекс стал принимать sitemap моего блога, размещенного на Blogspot.

Скажу сразу - мой путь несколько тернист и имеет ряд особенностей. Во первых для своего блога на Blogspot я использую свое доменное имя. Поэтому если у вас его нет вам мой способ скорее всего не подойдет. Во вторых потребуется дополнительный хостинг с поддержкой php и возможностью привязки к нему отдельного имени. Так как все это у меня в наличии и избытке, то и проэксперементировать мне было легко.

Сразу скажу что попытки скормить разного рода URL стандартной RSS от блога заканчивались всегда тем что в разделе Яндекс вебмастер появлялась ошибка "Невалидный XML". Дело в том что RSS поток от блога с Blogspot не совсем соответствует формату который хочет получить Яндекс. Именно поэтому все попытки изменения параметров ленты в URL приводят к одному - Яндекс ее игнорирует.

Наиболее подходящим источником для получения sitemap Яндекса является запрос, аналогичный вот этому (естественно вместо моего домена следует указывать ваш)

http://www.unsam.ru/atom.xml?redirect=false&start-index=1&max-results=999

В этом URL достаточно все понятно, сначала ваш домен, к которому привязан блог на Blogspot, и затем в параметрах номера ваших статей - данный запрос выдает с 1 по 999. Google его проглатывает весьма успешно в отличии от Яндекса.

Но раз так, значит надо данную ленту предварительно обработать в необходимый формат. Поможет нам в этом скрипт который возьмет ленту с блога и переделает ее в нужный формат для Яндекса. Скрипт следует размещать ну естественно на сервере который во первых сможет его обработать (данный скрипт реализован на php), во вторых он должен находится в том же домене, таковы правила описанные в документации. В моем случае мой блог имеет адрес www.unsam.ru - соответственно я добавил в ДНС у себя имя fs.unsam.ru, привязал к своему хостингу и на этом адресе разместил свой скрипт. Скрипт получает URL запроса RSS ленты, преобразует его в формат Яндекса и выдает тут же результат.

В результате я наконец получил правильную картину в Яндекс Вебмастере!



Как видно из скриншота - срипт отработал все корректно, а всякие рецепты по подсовыванию URL стандартной ленты RSS как видите закончились ни чем. ( Я не удаляю эти ленты по одной причине - вдруг однажды Яндекс одумается и начнет их принимать - тогда и данные костыли отпадут).

В своих поисках я еще натыкался на разные рецепты - размещение статического файла где-либо на другом вашем сайте, полученного с помощью какого-либо генератора, но это получается статическое решение, которое требует постоянных хоть и незначительных но трудов. В тоже время размещение sitemap на домене отличном от индексируемого вступает в некоторое противоречие с документацией по sitemap и далеко не факт что будет корректно принято и обработано.

При всем при этом я не могу сказать что Яндекс как то плохо индексирует блоги Blogspot, но иногда этот процесс слишком затянут по времени, а иногда будто не видит отдельные URL. Поэтому нужен ли вам этот танец с бубном решать непосредственно вам.

Исходный код скрипта:

<?php

header('Content-Type: text/xml;charset=utf-8;');
ini_set('display_errors',0);

$url = isset($_GET['url'])?$_GET['url']:null;

if ( !$url ) exit('no url');

$context = stream_context_create(array(
 'http' => array(
  'method' => 'GET',
  'timeout' => 10,
 )
));

$xml_in = new DOMDocument();
$xml_in->load($url);

$out = new DOMDocument('1.0','UTF-8');
$urlset = $out->createElement('urlset');
$changefreq = $out->createElement('changefreq','daily');

if ( !$xml_in ) exit('not XML file');

foreach( $xml_in->getElementsByTagName('entry') as $entry ){
 
 $updated = $entry->getElementsByTagName('updated')->item(0)->nodeValue;
  
 $links = $entry->getElementsByTagName('link');  
 $link = $links->item( $links->length - 1 );  
 
 $locnode = $out->createElement('loc',$link->getAttribute('href'));
 $lastmodnode = $out->createElement('lastmod',$updated);
 
 $urlnode = $out->createElement('url');
 $urlnode->appendChild( $locnode );
 $urlnode->appendChild( $lastmodnode );
 $urlnode->appendChild( $changefreq->cloneNode(true) );
 
 $urlset->appendChild($urlnode);
}

$out->appendChild($urlset);
echo $out->saveXML();
?>



URL адрес для получения sitemap будет выглядеть приблизительно так (естественно используйте свой домен):

http://fs.unsam.ru/sitemap.php?url=http%3A%2F%2Fwww.unsam.ru%2Fatom.xml%3Fredirect%3Dfalse%26start-index%3D1%26max-results%3D999


Удачи!В случае копирования данного мануала - оставляйте ссылку - возможны коррективы, скрипт написан сутки назад моим другом, возможны коррективы.

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

Наиль комментирует...

А куда именно в коде вставлять этот скрипт?

Uncle_Sam комментирует...

В коде самого блога ничего делать не требуется. Этот скрипт должен работать на внешнем сервере которым вы полностью управляете.

Отправить комментарий