суббота, 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)