Генерируем sitemap.xml из Atom или RSS фида

3508 0

    Недавно в процессе оформления и настройки блога Prosvetika.ru, столкнулся с бесплатным хостингом блогов под крылом Google - Blogger.com

    Довольно занимателный "конструктор" для блоггеров, но как всегда со своими тараканами и особенностями.

    Одной из них является отсутствие sitemap в формате xml. Для англоязычных блогов это не страшно, поскольку гугл с удовольствием съедает в качестве sitemap фид блога. Но для нас - рускоязычных, гугла мало, нам Яндекс подавай. А этот поисковик привередливый и фид кушать не желает.  Свои фиды он предлагает размещать в поиске по блогам.

    Погуглив на эту тему в интернете, я понял, что большинство продвинутых блоговодов выкладывают заранее сгенерированные sitemap.xml на сторонние хостигни и скармливают их через robots.txt нашему Яше. Это сколько полуручной работы!? о_0 
Мне как и любому нормальному человеку такой подход не по душе.

    Поэтому сел и сделал свой генератор sitemap.xml из Atom фида.

                                               - - -
    Для начала залез в управление своего VDS и установил библиотеку Feedparser.

    После этого добавил в views.py класс:

import feedparser
...
class MySitemap(Sitemap):
    changefreq = "daily"
    priority = 0.6
    

    def items(self):
        al = feedparser.parse('http://prosvetika.ru/feeds/posts/default')
        e = al.entries
        return e
                
    def location(self, obj):
        return obj.link

 

    Т.е не особо раздумывая подсунул джанговскому API sitemap список линков другого сайта. На Bloggers.com используется Atom 1.0, но библиотека FeedParser поддерживает и другие фиды, поэтому если надо будет, то можно и для других платформ использовать.


    Далее довавляем в корневой urls.py:

from myapp.views import MySitemap
from django.contrib.sitemaps.views import sitemap
...

mysitemaps = {
    'posts': MySitemap,
    }
...

urlpatterns = patterns('',
    ...
    (r'^myblog/sitemap\.xml$', cache_page(sitemap, 60 * 5), →
{'sitemaps': mysitemaps, 'template_name': 'custom_sitemap.xml'}), )

 

    Приходится делать свой шаблон sitemap.xml, поскольку sitemap API не расчитано на такое использование. Он добавляет к нашим url адрес корневого сайта, что нам не нужно. Поэтому в основной папке templates создаем шаблон sitemap.xml вида:

 

<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
{% spaceless %}
{% for url in urlset %}
  <url>
    <loc>{{ url.location|cut:"http://owlman.net" }}</loc>
    {% if url.lastmod %}<lastmod>{{ url.lastmod|date:"Y-m-d" }}</lastmod>{% endif %}
    {% if url.changefreq %}<changefreq>{{ url.changefreq }}</changefreq>{% endif %}
    {% if url.priority %}<priority>{{ url.priority }}</priority>{% endif %}
   </url>
{% endfor %}
{% endspaceless %}
</urlset>

 

    Вот и все. После перезагрузки процесса или апача по адресу http://сайт_донор/myblog/sitemap.xml получим требуемый нам sitemap.xml

    Для Prosvetika.ru у меня получился вот такой: sitemap.xml

 

    P.S. Такой "финт ушами" возможен только на VDS или дружелюбном хостинге. Обычный, среднестатистический хостер сторонние библиотеки ставит с трудом или вообще не ставит. Так что пользуйтесь VDSом. И обратите внимание на FirstVDS. Смотри баннер справа —»

Комментарии

Контактные данные

 Россия, г. Москва