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






Comments
когда же будут контекстные ссылки?
Когда у кого-нибудь появится желание реализовать эту фичу. Шлите патчи :o)
ох, ох, ох. да если б я умел :)
Ну можете попробовать денег кому-нить заплатить, я смотрел PHP-сорцы этого контекста, кажется, строк 100 не больше :-) Конкретно мне денег не нужно, может быть, на free-lance.ru или python.su кто-нить возьмётся :o)
При установке возникла ошибка: 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’ в контекстные процессоры
Это не помогло.
Оказалось надо во 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):
А, кстати, использовалося ли где-нибудь это приложение? Пока завести не удалось…
Вот и мне всё равно ;-)
Пожалуйста, присылайте свои рекомендации в виде патча. Я его включу и 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.