Показаны сообщения с ярлыком Разное. Показать все сообщения
Показаны сообщения с ярлыком Разное. Показать все сообщения

пятница, 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 %}

    четверг, 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 - классика вроде бы, кроссплатформенен, плотно работать с ним не приходилось.


     

    вторник, 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 секунд!

    понедельник, 30 января 2012 г.

    sqlalchemy

    Sqlalchemy - фреймворк для работы с базами данных с технолгией ORM. Почитать про него можно тут. Моей задачей было понять, как использовать этот фреймворк в потоках.


    import sqlalchemy
    from sqlalchemy.orm import sessionmaker, scoped_session

    connection = "mysql://root:@localhost/mydatabase"
    # pool_size - указывает сколько запросов хранить в очереди, если будет больше, вылетит exception
    engine = sqlalchemy.create_engine(connection, pool_size=30)
    # Создаем объект Session и дальше во всех потоках используем только его.
    Session = scoped_session(sessionmaker(bind=engine))

    #Accounts - моя таблица, к которой мне нужно делать запросы, код по настройке отображения я опустил.
    accounts = Session.query(Accounts)
    account = accounts[0]

    Один интересный момент, account, созданный в одном потоке и переданный в другой, изменить не получится.
    Если мы поменяем атрибуты account в новом потоке и выполним Session.commit() - таблица не обновится.

    суббота, 29 мая 2010 г.

    Распознавание captcha.

    Решил я научиться распознавать самую простую капчу, какая только существует. Вот она:.  Это png-изображение с размерами 90x25.  То есть каждый символ занимает 18 пикселей, всего 5 символов. Весь алфавит этой капчи состоит из 16 символов: 0123456789abcdef. Таким образом мне пришлось собрать все картинки для этого алфавита, нарезать из них буковки, а затем склеить в одну картинку: . Ну и весь алгоритм сводится к тому, чтобы сравнивать все символы по очереди с алфавитом. Для этого я воспользовался библиотекой PIL:
    from PIL import Image, ImageColor
    def cmp_image(img1,img2):
        return list(img1.getdata()) == list(img2.getdata())
    def decode(img):
        # Весь алфавит
        bigimg = Image.open(r"all.png")
        # Соответсвие букв изображениям
        alpha = "0123456789abcdef"
        res = ""
        for x in xrange(5):
            tmp = Image.new('RGB', (18, 25))
            tmp.paste( img.crop((x*18,0,x*18+18,25)))
    
            letter = "a"
            for y in xrange(16):
                ideal = Image.new('RGB', (18, 25))
                ideal.paste(bigimg.crop((y*18,0,y*18+18,25)))
                rms = cmp_image(ideal,tmp)
                if rms:
                    letter = alpha[y]
                    break
            res += letter
        return res
    img = Image.open(r"e:\image.png")
    print decode(img)

    воскресенье, 23 мая 2010 г.

    Снова про кодировки.

    Прочитал статью. Насчет кодировок в голове всё становится яснее и яснее=) До этого момента в консоль на английском языке сообщения выводил, не хотел связываться. Оказывается всё просто - необходимо получить из строки объект типа юникод и написать print объект.  И совсем необязательно вытворять танцы с кодом типа decode('utf8').encode('cp866').

    среда, 19 мая 2010 г.

    Генерация xml карты.

    Иногда требуется сгенерировать xml карту для заданных ссылок. Сначала делал это за счет метода строки format, но вот решил попробовать модуль для работы с xml и набросал простенькую функцию:

    import StringIO
    from xml.sax.saxutils import XMLGenerator
    def create_sitemap(cnagfreq,priority,*links):
    st = StringIO.StringIO()
    g = XMLGenerator(st,encoding="UTF-8")
    g.startDocument()
    g.startElement('urlset', {'xmlns':"http://www.sitemaps.org/schemas/sitemap/0.9"})
    for lnk in links:
    g.characters("\n")
    g.startElement("url", {})
    g.characters("\n")
    g.startElement("loc", {})
    g.characters(lnk)
    g.endElement("loc")
    g.characters("\n")
    g.startElement("changefreq", {})
    g.characters(cnagfreq)
    g.endElement("changefreq")
    g.characters("\n")
    g.startElement("priority", {})
    g.characters(priority)
    g.endElement("priority")
    g.characters("\n")
    g.endElement("url")
    g.characters("\n")
    g.endElement("urlset")
    g.endDocument()
    return st.getvalue()
    lst = ["http://ya.ru/{0}.html".format(x) for x in xrange(5)]
    print create_sitemap("daily","0.8",*lst)