Python библиотека для работы с sape.ru

Знаю, знаю, я уже два раза писал, что сделал эту библиотеку. Этот раз, надеюсь, последний :-)

На этот раз я решил сделать порт максимально приближенным к PHP версии: та же структура кода, те же имена переменных, те же форматы данных. Т.к. PHP версия забирает данные с сервера в том виде, как их сериализует PHP, то пришлось заюзать вот эту штуку для распаковки данных.

Итак, в абстрактном python-проекте (про джанго позже) библиотеку надо использовать следующим макаром:

sape = SapeClient(host='домен вашего сайта',
    request_uri='адрес запрашиваемой страницы (без домена)',
    user='ваш sape.ru идентификатор',
    db_file='путь к файлу, куда будет кешироваться информация')
links = sape.return links()

return_links — вернёт HTML, в котором будут все sape.ru ссылки для заданной страницы. Поддерживается также и выборка по кусочкам:

sape = SapeClient(...)
links = sape.return_links(3)
links = sape.return_links(2)
links = sape.return_links()

Только не забудьте в последний вызов return_links указать нулевой параметр, чтобы вернулись все оставшиеся ссылки.

Ещё у return_links есть параметр join. По умолчанию он False. Это значит, что возвращаемый HTML будет в виде ссылок, заключённых в LI тэги. Если передать join=True, то ссылки не будут помещаться в LI тэги и будут разделяться запятой или тем разделителем, который вы указали в свойствах проекта в веб-интерфейсе на sape.ru

А теперь самое вкусное. Библиотека предоставляет темплейт тэги для django сайтов. Главных тэга два: {% sape_links %} и {% sape_links_list %}, которые вызывают return_links соотвественно с join=True и join=False. Эти тэги принимают необязательный числовой параметр, которым можно регулировать количество ссылок — я писал про это выше.

Есть ещё один тэг: {% sape_debug %} — он выводит всяческую информацию. по которой можно попытаться понять, работает ли что-то вообще. Пример выводимой информации:

User: XXXXXXXXXXXXXXXXXXXXXXXXXXXX, host: it-omsk.com, error: , pages in cache: 343, uris in cache: 793, cache time: 2008-10-12 20:52:38, cache updated: False

cache updated означает, обновился ли кэш-файл во время вызова данной страницы, остальное и так, думаю, понятно.

Когда я делал эти темлейт тэги я столкнулся с одной неприятностью. Когда нужно выводить все ссылки за раз, то всё легко: конструируем объект SapeClient и выдаём ссылки. Но когда мы хотим разбить вывод ссылок на несколько мест, то ситуация осложняется тем, что мы должны запоминать где-то созданный объект (SapeClient), иначе ссылки будут выводиться каждый раз “с начала”. Я решил при каждом вызове тэга проверять существование объекта, который я храню в контексте шаблона, и если такого объекта нет, то создавать его. Реализацию этого безобразия можно поглядеть здесь.

Напоследок напишу, как устанавливать библиотеку в django-проект.

  • скачиваем исходный код, кладём куда надо
  • в INSTALLED_APPS добавляем “sape”
  • в settings.py добавляем две настройки SAPE_USER и SAPE_DB_FILE. Что это такое я писал выше в примере констрирования SapeClient объекта. Не забудьте настроить права для доступа к файлу SAPE_DB_FILE.
  • можно ещё SAPE_VERBOSE = True в настройки добавить. Тогда в случае какой-либо ошибки она отобразится в шаблонах (по умолчанию ошибки ”замалчиваются”)
  • в нужном шаблоне написать {% load sape_extras %} и дале воспользоваться тэгами, описанными выше.

Код библиотеки доступен здесь: http://bitbucket.org/lorien/sape/

О багах пишите, пожалуйста, в комментарии или на мыло: lizendir@gmail.com

Add post to:   Delicious Reddit Slashdot Digg Technorati Google
Make comment

Pingbacks

10.09.2009 12:35 Установка кода Sape на Python | Sape News @sapenews.ru
Python класс от web-brains.com

Comments

когда же будут контекстные ссылки?

Когда у кого-нибудь появится желание реализовать эту фичу. Шлите патчи :o)

ох, ох, ох. да если б я умел :)

Ну можете попробовать денег кому-нить заплатить, я смотрел PHP-сорцы этого контекста, кажется, строк 100 не больше :-) Конкретно мне денег не нужно, может быть, на free-lance.ru или python.su кто-нить возьмётся :o)

Николай 29.12.2008 0:34

При установке возникла ошибка: TemplateSyntaxError at / Caught an exception while rendering: ‘request’

Original Traceback (most recent call last): File “/usr/local/lib/python2.5/site-packages/django/template/debug.py”, line 71, in render_node result = node.render(context) File “/home/www/data/site1/sape/templatetags/sape_extras.py”, line 46, in render request = context[‘request’] File “/usr/local/lib/python2.5/site-packages/django/template/context.py”, line 43, in getitem raise KeyError(key) KeyError: ‘request’

Добавьте ‘django.core.context_processors.request’ в контекстные процессоры

Николай 29.12.2008 13:59

Это не помогло.

Оказалось надо во views добавить “from django.template import Context” (я использую render_to_response), и при каждом вызове render_to_response передавать параметр request.

Можно переопределить функцию render_to_response чтобы не переписывать весь код. Импортировать оригинальный как render_to_respone__ скажем и написать обвертку.

Есть декоратор @render_to (http://hg.piranha.org.ua/byteflow/file/79b5840b858c/apps/lib/decorators.py#l1). Можно использовать его.

Спасибо, посмотрим.

Разработчики, которые используют Windows, негодуют — нет модуля fcntl для винды. Так уж ли нужно лочить кэш-файл?

Не знаю, я на всякий случай лочу. В оригинальном PHP-клиенте тоже локинг есть. Виндовым питоном тоже можно лочить файл, просто я не стал заморачиваться — неинтересно. http://code.activestate.com/recipes/65203/

Ок, посмотрю… собственно, мне все-равно, но некоторые ведь на винде разработку ведут… Да и все-таки предполагается, что Python — ОС-независимая платформа. Это просто как рекомендация — стараться сделать платформо-независимый код на языках, которые это позволяют.

Кстати, в коде есть ошибка (sape_extras.py):

-except SApeException, ex:
+except SapeException, ex:

А, кстати, использовалося ли где-нибудь это приложение? Пока завести не удалось…

Ок, посмотрю… собственно, мне все-равно, но некоторые ведь на винде разработку ведут

Вот и мне всё равно ;-)

Это просто как рекомендация — стараться сделать платформо-независимый код на языках, которые это позволяют.

Пожалуйста, присылайте свои рекомендации в виде патча. Я его включу и windows-пользователи библиотеки sape станут счастливыми.

А, кстати, использовалося ли где-нибудь это приложение? Пока завести не удалось…

Используется. Например, на этом же блоге. В правой колонке под заголовком ”Реклама”.

Опечатку поправил. Спасибо. Если есть конкретные вопросы по либе - спрашивайте.

Рекомендую сделать:

sape/templatetags/sape_extras.py

def build_sape_client(request): qs = request.META.get(‘QUERY_STRING’, ”) + if not qs: + qs = ” uri = ”.join([request.path, len(qs) and ‘?’ or ”, qs]) if hasattr(settings, ‘SAPE_HOST’): host = settings.SAPE_HOST

PS предпросмотр в блоге не работает

Не работает. К сожалению, меня уже год ломает контрибутить в byteflow. Можете попробовать послать багрепорт в http://byteflow.su :-)

Смысл патча не совсем понял, если ключ QUERY_STRING не был найден в request.META, то в qs записывается пустая строка, переданная вторым параметром в get фунцию. Зачем это делать ещё раз в предлагаемых вами строчках кода?

Но он там может быть найден и быть равным None. Т.е. qs станет равным None, что вызовет исключение далее (len(qs) и т.д.). Можно конечно аккуратней: qs = request.META.get(‘QUERY_STRING’, ”) or ”

Спасибо. Пофиксил через or ” Кстати, забыл, основная репа тут хостится: http://bitbucket.org/lorien/sape/ Буду постепенно проекты свои туда перетаскивать.

lorien, ты еще так и не сподвигся сделать контекстные ссылки? Ведь это существенно увеличит доход на сапе ;) Я бы сам сделал, только вот с PHP не особо шарю.

Контекстые ссылки есть тут: http://linkexchange.org.ua/. Я перехожу в данный момент на эту библиотеку, забрасываю свою велосипеды.

lorien, ты ничего не путаешь? Каким образом этот модуль подключает контекстные ссылки? Что-то я в документации не нашел

Где-то в сорцах видел эту фичу. Возможно, недоделана.

Если можно, то хотелось бы от тебя увидеть пост касательно использования этого модуля на Django.

Не вопрос — сейчас накатаю :)

Очень нужен код этого скрипта

http://web-brains.com/2008/03/03/sape-ru-client-refactoring/#c688

Новый фильтр АГС-17 может попортить нам прибыль Данная проблема естественно в большей степени затрагивает сайты, произведенные для продажи с них ссылок, именно на таких ресурсах приличный объем контента достигается парсингом и размножением. Сложнее будет с Сапой, к белым проектам надо стремиться…

Not every single thing can got in touch with buy essays I’m having, moreover, you still canfind buy essays.

I have suggest essays for most classmen. They have called and also have first-class rating. The practice I had was great.

Required. 30 chars of fewer.

Required.

captcha image Please, enter symbols, which you see on the image