Online video hd

Смотреть телеграм видео

Официальный сайт itartass-sib 24/7/365

Смотреть видео бесплатно

kstep 21.10.2009 00:58

PythonПузомерка для welinuxоида

Если вдруг кому интересно следить за своей (или чужой) кармой на WeLinux, набросал простой скрипт.
Заодно он может служить примером простого HTML-парсера и использования декораторов/свойств в Питоне
для начинающих.


 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#!/usr/bin/python
# encoding: utf-8

from pycurl import Curl, HEADER, URL, WRITEFUNCTION
from re import compile, S
from StringIO import StringIO

# Полезный декоратор, позволяющий прозрачно кешировать результаты
# работы очень долгих методов.
def cached(func):
def wrapper(self):
# убедимся, что в классе есть кеш
if not hasattr(self, '_cache'):
setattr(self, '_cache', {})

# проверим кеш и заполним его,
# если это ещё не сделано
if not self._cache.has_key(func):
self._cache<func> = func(self)

return self._cache</func><func>
return wrapper


class WeLinuxKarma(object):

def __init__(self, username):
self.username = username

# Подготовим курл к работе
self.__curl = Curl()
self.__curl.setopt(HEADER, False) # заголовки в результатах нам не нужны
self.__curl.setopt(URL, "http://welinux.ru/user/" + username)

# Ставим "ловушку" для вывода данных от курла
self.__html_result = StringIO()
self.__curl.setopt(WRITEFUNCTION, self.__html_result.write)

# Готовим регулярное выражение для "ловки" кармы
self.__karma_regexp = compile(r'<span class="\'title\'">.*?<span class="\'rp\'">(<0-9.>+)</span>', S)

# Этот метод будет работать как свойство,
# кроме того результат его работы будет закеширован
# поэтому долгий HTTP-запрос будет выполнен только
# при первом вызове.
@property
@cached
def karma(self):
# запускаем курл и парсим полученную HTML-страничку
# в поисках нужных данных
self.__curl.perform()
html = self.__html_result.getvalue()
match = self.__karma_regexp.search(html)

# если что-то найдено, то забираем эти данные
value = float(match.group(1)) if match is not None else None
return value

# Этот метод нужен только если класс будет использоваться
# в более длинной программе и потребуется реально обновлять
# данные с веб-сайта множество раз.
def reset_cache(self):
self._cache = {}

# Пузомерка для себя, любимого =)
karmometer = WeLinuxKarma("kstep")
print karmometer.karma</span></func>



Тэги:
+ 11 -
Похожие Поделиться

Username 21.10.2009 01:06 #
+ -1 -
почему там так много моего ника?
Username 21.10.2009 01:07 #
+ 1 -
def __init__(self, username):
self.username = username


омг, я - звезда!
lockie 21.10.2009 02:28 #
+ 0 -
Только начал изучать питон, и, увидев функцию cached(func) из вышеприведённого листинга, понял, что мне ещё как до луны пешком :(
kstep 21.10.2009 02:46 #
+ 3 -
Это декоратор.
Строго говоря, строчки


@cached
def karma(self):


означают реально:


def karma(self):
...
karma = cached(karma)


То есть декоратор — это функция, позволяющая «на лету» модифицировать
другую функцию (или метод), чаще всего «обернуть» ещё в некую обёртку.
Функция декоратор должна принимать на вход функцию как единственный
параметр и возвращать другую функцию (или ту же самую, главное — фукнцию).

Здесь, например, метод karma() оборачивается в проверку на нахождение
результатов его работы в кеше, и если она уже была вызвана (и данные
закешированы), то второй раз она не вызовется.

Советую попробовать написать пару своих декораторов. Там всё реально просто =)
Username 21.10.2009 10:14 #
+ 0 -
а можно для ленивых написать краткое введение в питон и порекомендовать книжечки?
evgenyl 21.10.2009 10:39 #
+ 1 -
вот например хорошая книжка
lockie 21.10.2009 20:23 #
+ 0 -
Спасибо!
evgenyl 21.10.2009 22:19 #
+ 0 -
Пожалуйста, после этой книги обычно хватает стандартной докумантации с оффсайта
bobry 22.10.2009 05:59 #
+ 0 -
хорошая, но не совсем полная, думаю лучше "Программирования на Python" Лутца, для начала нет
evgenyl 21.10.2009 10:28 #
+ 3 -
А чем стандартный urllib2 не угодил ?
имхо так проще и не нужно ставить лишнюю библиотеку

from urllib2 import urlopen
html=urlopen(URL).read()
kstep 21.10.2009 13:38 #
+ 0 -
Привычка. Привык к курлу за долгое с ним общение в перле и пхп.
bobry 22.10.2009 06:00 #
+ 0 -
дурная привычка, вы уж меня извините :)
kstep 22.10.2009 11:11 #
+ 0 -
Чем? Курл даёт очень большой задел на будущее. То же управление куками в случае если я захочу прикрутить здесь логин и доставать данные, видимые только данному юзеру (типа новый ЛС).
kstep 22.10.2009 11:13 #
+ 0 -
Кроме того курл универсален и везде работает одинаково. Зачем что-то выдумывать?
bobry 22.10.2009 14:11 #
+ 0 -
а вы почитайте: http://docs.python.org/library/urllib2.html
все вышесказанное справедливо
evgenyl 21.10.2009 10:34 #
+ 0 -
А еще кому интересно можно сделать плазмоид на основе этой статьи
kstep 22.10.2009 04:36 #
+ 0 -
Замечены баги:
1) в коде программы добавлены лишние двойные кавычки в регексп, из-за чего при прямом копипасте из поста код не работает. Это не есть хорошо.
2) нумерация строк «плывёт» в ff3.5, т.е. номера строк не соответствуют реальным.
Вот тут: http://p-nut.info/blog/karring_v_pitone.html пример реализации отлаженной нумерации строк (очень долго подгонял под разные браузеры).
bobry 22.10.2009 05:53 #
+ 0 -
честно говоря не совсем понял зачем вам потребовался StringIO, для хранения результатов от curl хватило бы и обычной строки, разве нет?
а насчет кеширования - мне кажтся лучше илюстрирует идею какой нибудь факториал, или любая другая затратная, рекурсивная функция.
kstep 22.10.2009 11:13 #
+ 0 -
Можешь — сделай.
bobry 22.10.2009 14:11 #
+ 0 -
сделать, "что", простите? если информацию о пользователе, то уже

Смотреть видео онлайн

Онлайн видео бесплатно


Смотреть русское с разговорами видео

Online video HD

Видео скачать на телефон

Русские фильмы бесплатно

Full HD video online

Смотреть видео онлайн

Смотреть HD видео бесплатно

School смотреть онлайн