пятница, 12 июля 2013 г.

Рекурсия с помощью рекурсивного цикла в jinja2.

Код выводит "дерево-лесенку" в виде списка, каждая "ступенька" которой находится в списке parents.

{#
{% for parent in (0,) recursive %} это "def func():", а
{{ loop((0,)) }} - это func().
#}
{% for parent in (0,) recursive %}
  • {{ parents.pop() }}
    {% if parents %}
      {{ loop((0,)) }}

    {%- endif %}

  • {% endfor %}

    Cоздание собственных операторов в sqlalchemy

    В postgresql есть такие типы данных как INET, CIDR, но полноценно в sqlalchemy они не поддерживаются. То есть, например, запрос для поиска подсетей
    SELECT * FROM nets WHERE ip >> '10.10.10.10' так просто сформулировать на sqlalchemy не получится. Для этого нужно переопределить оператор >> у типа данных CIDR и создавать запросы с его помощью:

    class Cidr(postgresql.CIDR):
    '''
    Делаем свой тип колонки для того, чтобы была возможность использовать
    операторы >> и <<
    '''

    class comparator_factory(postgresql.CIDR.Comparator):
    def __lshift__(self, other):
    return self.op("<<")(other)

    def __rshift__(self, other):
    return self.op(">>")(other)

    class Net(Base):
    __tablename__ = 'nets'
    id = Column(Integer, primary_key=True)
    ip = Column(Cidr)

    db.session.query(Net).filter(Net.ip>>'10.10.10.10')

    четверг, 28 февраля 2013 г.

    http-снифферы.

    Только Windows:

    1. HttpAnalyzer - классный сниффер, есть все необходимые плюшки для http-сниффера: "pretty" отображение POST DATA; возможность открыть ответ на запрос в браузере; плюс, это не debugging proxy, а значит можно дебажить работу скриптов через прокси/соксы, т.к. перехватываются все запросы. Из минусов: платный; подвисает при остановке сниффинга; открытие ответа частенько тупит и открывается не браузер, а блокнот, разобраться почему так происходит у меня не вышло.

    2. Fiddler - это как раз таки debugging proxy, то есть является проксей через которую надо направлять запросы, которые хотим увидеть. То есть отдебажжить запросы скрипта через прокси не получится, зато нет остальных минусов HttpAnalyzer-а, а остальные плюшки присутствуют. После HttpAnalyzer-а перешел на этот сниффер, удобно, полностью устраивает.


    Linux (в общем то, кросплатформенное):

    1. Charles - неплохой proxy, если бы не одно "НО", нельзя открыть ответ запроса в браузере, приходилось брать ответ, сохранять его как html и открывать в firefox. Платный, если бы не извращение с сохранением html можно было бы даже купить.

    2. Paros proxy, burp proxy и т.д... - когда искал сниффер под Linux находил кучу этих проксей/снифферов, уже не помню что там и как, разве что burp proxy можно попробовать посмотреть.

    3. Webscarab - похоже вот оно, сниффер под Linux, не идеальный и не такой удобный как fiddler, но с которым вроде бы можно работать. Вроде бы - потому что практики с ним не было, пока только поверхностный обзор. Первый минус что бросился в глаза - нельзя очистить окно от запросов, а в остальном терпимо. А, ну, внешний вид УГ - Java чо)


    Прочее:

    1. HttpFox - плагин для фаерфокса, очень похожий на HttpAnalyzer, юзабелен, но снифит только браузер.

    2. CommView - прикольный сниффер общего назначения, начинал с него. Платный, windows only.

    3. Wireshark - классика вроде бы, кроссплатформенен, плотно работать с ним не приходилось.


     

    вторник, 13 ноября 2012 г.

    Памятка по обновлению libcurl Debian.

    Памятка примерная, без команд, названия пакетов неточные.

    1) Скачал курл с оф. сайта, скомпилил, установил.

    2) Удалил libcurl3-gnutls и libcurl3.

    3) Установил пакеты python-dev и libcurl-openssl-dev.

    4) pip install pycurl. Получил pycurl с последней версией libcurl, а также с openssl вместо gnutls. Не знаю, что лучше, просто openssl было привычнее, плюс какая-то ошибка была у gnutls.

    пятница, 1 июня 2012 г.

    grab.spider tricks.

    1) Дефолтный valid_status для всех заданий. Нужно переопределить метод valid_response_code, например таким образом:


    def valid_response_code(self, code, task):
    return True

    В данном примере все ответы будут считаться валидными.

    2) Список стартовых урл, initial_urls, может оказаться просто ненужным. Чтобы не делать лишнее действие, можно запускать spider не через task_initial, а через task_generator:

    class MainSpider(Spider):
    #initial_urls = ['http://www.google.com/']

    def task_generator(self):
    url = "http://www.google.com/"
    yield Task(name='page', url=url)

    Это один из способов, но далеко не единственный.

    вторник, 29 мая 2012 г.

    Собираем pycurl под windows (python 2.7).

    Наверняка сейчас под windows pycurl у всех стоит вот с этого сайта , к сожалению, в этой версии есть такой неприятный баг, который неизвестно при каких условиях проявляется. Таким образом, необходимо собрать версию поновее, ибо больше сайтов со сборками pycurl я не видел.

    Всё делал вот по этой статье http://curl.haxx.se/mail/curlpython-2009-11/0010.html за исключением небольшого ньюанса с ассемблером.

    Для работы необходимо установить:

    1) Visual Studio C++ Express (я ставил 2008).

    2) Perl (я качал вот этот http://www.activestate.com/activeperl/downloads)

    3) Ассемблер Nasm, а также добавить путь до bin в переменную path (брать отсюда http://www.nasm.us/)

    Чтобы собрать pycurl нам надо собрать по статической библиотеке(.lib) из исходников для каждого из 3х составляющих, в скобках указаны версии которые я использовал:

    zlib - http://www.zlib.net/ (1.2.7)
    openssl - http://www.openssl.org/source/ (1.0.1с)
    curl - http://curl.haxx.se/download.html (7.26.0)

    И, конечно же, нам понадобятся исходники самого pycurl:
    pycurl - http://pycurl.sourceforge.net/download/ (7.19.0)

    Итак, создаем на диске С: в корне папку build и помещаем в неё все 4 папки:

    • curl-7.26.0

    • openssl-1.0.1с

    • pycurl-7.19.0

    • zlib-1.2.7

    Открываем Visual C++ Command Line, переходим в папку с zlib и прописываем: nmake -f win32\MakeFile.msc

    Без проблем собирается и в корне появляется файл zlib.lib

    На очереди openssl, переходим в его папку и прописываем команды:

    1) perl Configure VC-WIN32

    2) ms\do_nasm.bat

    3) nmake -f ms\nt.mak

    После компиляции в out32 должны появится два файла *.lib

    Переходим в папку c curl и пишем: nmake vc-ssl-zlib WINDOWS_SSPI=1 VC=vc9 OPENSSL_PATH=С:\build\openssl-1.0.1c ZLIB_PATH=C:\build\zlib-1.2.7

    Наконец, собираем pycurl. Для этого качаем скрипт, распаковываем содержимое архива в папку с pycurl, переходим с помощью командной строки в неё и пишем: python setup_win32_ssl_own.py --curl-dir=..\curl-7.26.0 --openssl-dir=..\openssl-1.0.1с --zlib-dir=..\zlib-1.2.7 bdist_msi

    В папке dist должен появится файл pycurl-ssl-7.19.0.win32-py2.7.msi

    четверг, 23 февраля 2012 г.

    Парсер Grab:Spider.

    Вот ссылка о нём. Парсер на пару строк, парсит 10к популярных фильмов с кинопоиска:

    from grab.spider import Spider, Task, Data
    from grab.tools.logs import default_logging
    from grab import Grab
    import re


    class KinoSpider(Spider):
    def task_initial(self, grab, task):
    for xpath in grab.tree.xpath('//*/div[@class="stat"]/div/a'):
    name = xpath.text_content().encode('utf8')
    name = re.sub("\(.*?\)",'',name)
    self.out.write(name+"\n")
    self.out.flush()

    def main():
    initial_urls = ["http://www.kinopoisk.ru/level/56/day/2012-02-22/page/{0}/".format(x) for x in xrange(1,51)]
    threads = 50
    default_logging(grab_log="log/log.txt")
    fl = open("out.txt","w")


    bot = KinoSpider(thread_number=threads,network_try_limit=2)
    bot.initial_urls = initial_urls
    bot.out = fl

    try: bot.run()
    except KeyboardInterrupt: pass
    fl.close()

    print bot.render_stats()

    if __name__ == '__main__':
    main()

    Процесс парсинга занимает 3-5 секунд!