February
2009
Генерация Google Sitemap и нюансы его использования (googlesitemap)
Posted in: Интернет Маркетинг, SEO, Java technologies, J2SE |
Sitemap позволяет владельцам сайтов и веб-мастерам сообщить поисковым системам о структуре сайта и обновлении контента на его страницах. Таким образом при правильном использовании sitemap можно добиться луч?его индексирования страниц веб-ресурса поисковыми системами. Соответственно, при неправильном использовании данной технологии можно навредить самому себе (точнее своему интернет детищу).
В этой статье я хочу коротко рассказать вам о Google Sitemap, предоставить программный код на Java для простой генерации sitemap.xml, ну и открыть некоторые нюансы обнаруженные моим другом и мной, и о которых, как мне кажется, многие не знают.
Sitemap состоит из набора блоков, каждый из которых описывает одну страницу сайта и предоставляет некоторую информацию о динамике ее обновления. Вот неболь?ой пример sitemap.xml, сгенерированный с помощью программы на java, которую я предоставлю ниже:
<?xml version='1.0' encoding='UTF-8'?>
<urlset xmlns='http://www.sitemaps.org/schemas/sitemap/0.9'>
<url>
<loc>http://www.javenue.info/post/20</loc>
<changefreq>weekly</changefreq>
<priority>0.5</priority>
<lastmod>2009-02-20T15:32:20+02:00</lastmod>
</url>
<url>
<loc>http://www.javenue.info/post/73</loc>
<changefreq>daily</changefreq>
<priority>0.3</priority>
</url>
<url>
<loc>http://www.javenue.info/post/2</loc>
<changefreq>weekly</changefreq>
<priority>0.5</priority>
</url>
</urlset>
Расскажу о каждом элементе входящем в блок url:
1. loc - собственно URL страницы
2. changefreq - как часто данная страница может изменяться. Возможные значения - always, hourly, daily, weekly, monthly, yearly, never. Судя по всему, данный параметр еще используется поисковиками, для того чтобы вычислить приблизительную дату следующего захода на страницу.
3. priority - приоритет страницы, помогает поисковому спайдеру определить, какие из страниц более приоритетные для краулинга по ва?ему мнению. Так как обычно количетсов страниц, которые скачает краулер ограничено, данный параметр может оказаться очень полезным для сайтов, где контент меняется очень часто. На выдачу поисковиков данный параметр не влияет.
4. lastmod - время последнего обновления конетнта страницы. Для сайтов со статическим контентом можно не использовать lastmod, changfreq будет более чем достаточно.
Ну а вот ужасная вещь: практически во всех статьях, которые я читал о google sitemap и о генерации сайтмеп, есть очень подозрительная вещь:
<lastmod>2009-02-20</lastmod>
Здесь не указано время обновления страницы. Google конечно понимает разные форматы дат, но давайте рассмотрим такой случай:
1. вы обновили страничку, например 2009-02-20.
2. crawler заходит на сайт, скачиавет страничку. Скорее всего он помечает, что заходил на эту страницу 2009-02-20.
3. В этот же день вы находите ужасные недочеты в контенте страницы и полностью переделываете ее. После изменений дата lastmod все равно остается 2009-02-20.
4. в следующий раз spider скачивает sitemap.xml и видит, что та самая страничка последний раз менялась 2009-02-20. Но в этот день гугл уже якобы скчивал страницу. А значит нет смысла заново ее загружать. Таким образом гугл никогда не узнает о ва?их изменениях, если конечно вы еще раз не обновите lastmod.
Так что настоятельно вам рекомендую использовать формат с датой, временем и time зоной.
Ну а вот и обещаный программный код для генерации sitemap:
public class GoogleSitemap {
private String publicUrl;
private List<Url> urls = new ArrayList<Url>();
public String getPublicUrl() { return publicUrl; }
public void setPublicUrl(String publicUrl) { this.publicUrl = publicUrl; }
public List<Url> getUrls() { return new ArrayList<Url>(urls); }
public Url addUrl(Url url) { urls.add(url); return url; }
public void removeUrl(Url url) { urls.remove(url); }
private String w3cDateTime(Date date) {
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
String formated = df.format(date);
return formated.substring(0, 22) + ":" + formated.substring(22);
}
public void write(Writer writer) {
PrintWriter xml = new PrintWriter(writer);
xml.println("<?xml version='1.0' encoding='UTF-8'?>");
xml.println("<urlset xmlns='http://www.sitemaps.org/schemas/sitemap/0.9'>");
for (Url url : urls) {
xml.println("<url>");
xml.println("<loc>" + (publicUrl == null ? "" : publicUrl) + url.loc + "</loc>");
xml.println("<changefreq>" + url.changefreq.name().toLowerCase() + "</changefreq>");
xml.println("<priority>" + url.priority + "</priority>");
if (url.lastModified != null)
xml.println("<lastmod>" + w3cDateTime(url.lastModified) + "</lastmod>");
xml.println("</url>");
}
xml.println("</urlset>");
xml.flush();
}
public static class Url {
private String loc;
private float priority = 0.5f;
private Changefreq changefreq = Changefreq.WEEKLY;
private Date lastModified = null;
public Url(String loc) {
this.loc = loc;
}
public Url(String loc, Changefreq changefreq) {
this.loc = loc;
this.changefreq = changefreq;
}
public Url(String loc, Changefreq changefreq, float priority) {
this.loc = loc;
this.changefreq = changefreq;
this.priority = priority;
}
public String getLoc() { return loc; }
public void setLoc(String loc) { this.loc = loc; }
public float getPriority() { return priority; }
public void setPriority(float priority) { this.priority = priority; }
public Changefreq getChangefreq() { return changefreq; }
public void setChangefreq(Changefreq changefreq) { this.changefreq = changefreq; }
public Date getLastModified() { return lastModified; }
public void setLastModified(Date lastModified) { this.lastModified = lastModified; }
}
public static enum Changefreq {
ALWAYS, HOURLY, DAILY, WEEKLY, MONTHLY, YEARLY, NEVER
}
public static void main(String[] args) throws IOException {
GoogleSitemap sitemap = new GoogleSitemap();
sitemap.setPublicUrl("http://www.javenue.info");
Url url1 = new Url("/post/20");
url1.setLastModified(new Date());
sitemap.addUrl(url1);
sitemap.addUrl(new Url("/post/73", Changefreq.DAILY, 0.3f));
sitemap.addUrl(new Url("/post/2", Changefreq.WEEKLY));
sitemap.write(new PrintWriter(System.out));
}
}
Если вы спросите, что такое
formated.substring(0, 22) + ":" + formated.substring(22);
Так вот, это неболь?ой хак. Дело в том, что по стандарту w3c в таймзоне должно присутствовать двоеточие, а Z для таймзоны в SimpleDateFormat двоеточие не ставит.
Надеюсь, статья была вам интересна и информация из статьи когда-нибудь вам пригодится. Всего вам хоро?его.
16 Comments »
RSS feed for comments on this post.
Конечно интересно, но практического применения никакого, как например вычислять, чисто математически priority
Не совсем понял фразу об отсутствии практического применения. Данный код используется в двух проектах, в которых я принимаю учасите.
Значение priority должен задавать пользователь основываясь на важности страниц для него и пользователей его ресурса.
?сходя из моих наблюдейний, бот гугла не особенно обращает внимание на значение priority, даже боль?е, иногда было такое чувство, что он его принимает в расчет строго наоборот, страницы с мень?им значением краулились чаще.
Не знаю кто как, а я оптимизирую sitemap под яндекс, т.к. гугл хавает страницы регулярно и четко.
у ВП есть спец плагин для этого дела.
Статья не о ВП, а о генерации sitemap используя java
Nolex, читайте полностью статью, а не заголовок. Речь не о ВП.
2Yarshin, это анти-сео примочка)
Кстати вопрос про sitemap: распознает ли google русские буквы в пути к странице и сильно ли важно, что ключевые слова есть в адресе страницы?
1. Не уверен, но должен распозновать любые символы нормально. Поищу соответствующую инфу. Если найдете рань?е - напи?ите.
2. На счет ключевых слов - ранее это имело достаточно боль?ое значение, но этим сли?ком злоупотребляли и теперь ключевые слова в URL’ах почти не учитываются. Если все остальное в плане SEO на высоком уровне, то не вижу проблем реализовать.
Если все-таки будете делать - пи?ите слова через дефис, а не через подчеркивание, ну и желательно не используйте боль?е 5 слов через дефис.
В sitemap не рекомендуется использовать другие буквы кроме английских в путях, но это не категорично. так как русские буквы и буквы других языков, так как кодировка UTF8 воспринимается вполне адекватно.
Вычислять приоритеты под каждую страницу также не вижу смысла. Приоритетность влияет только на скорость посещения. Но если страница обновилась один раз и далее не будет, после нескольких заходов поисковые системы сами у себя выставят приоритет важности захода на ту или иную страницу.
Добрый день. Я никогда не работал с java. Подскажите пожалуйста куда вставлять код чтобы на выходе получить карту сайта. Спасибо.
А я своему сайту навредил. Нормально индексировался и гуглом и яндексом, … пока я не поставил sitemap, теперь месяц сайт ими не индексируется. «Снес» я карту - толку от нее не вижу.
спасибо! Довольно полезная информация. А от sitemap, тол все таки есть. Не зря же его придумали. Да и на практике доказано
генерирую сайтмап специальным плагином для Вордпресс. И не морочусь ![]()
2 Optimism: В случае использования Вордпресс плагина мороки побольше будет… Чтобы это работало в java web приложении, нужно написать свою имплементацию script engine для PHP )