воскресенье, 14 ноября 2010 г.

Работаем с ftp через curl.

Подробной статьи для чайников я не нагуглил, даже на php, а ftp-uploader написать было необходимо. Поэтому приведу куски кода, которые мне помогли. Во-первых, нам надо залогиниться, юзаем опцию:

# userpwd = "login:parol"
curl.setopt(pycurl.USERPWD,userpwd)

Во-вторых нам надо заливать файлы, делается это так:

size = os.path.getsize(path)
fp = open(path,"rb")
# url = ftp://ftp.host.com/directory/file.txt
curl.setopt(pycurl.URL,url)
curl.setopt(pycurl.UPLOAD,1)
curl.setopt(pycurl.INFILE,fp)
curl.setopt(pycurl.INFILESIZE,size)
curl.perform()

В-третьих, нам надо создавать папки, а для этого нужно юзать команды ftp. Делается это так:

quote = "MKD {0}".format(folder)
curl.setopt(pycurl.URL,host)
curl.setopt(pycurl.POSTQUOTE,[quote])
curl.setopt(pycurl.UPLOAD,0)
curl.perform()

Пока всё, этого мне хватило, чтобы написать uploader. Пришлось немного попариться при создании вложенных папок, но вроде всё работает=) Прокси юзать также как и для http.

пятница, 6 августа 2010 г.

Переход на python 2.7?

На форуме дали ссылку на популярные модули для Питона, причем как для 2.6, так и 2.7. Все модули в виде exe-файлов, не надо набирать в консоли setup.py install и тому подобное. Сама ссылка очень порадовала, все необходимые мне модули там есть: pycurl, mechanize(ClientForm), Pil, и т.д.; и заставила задуматься о переходе на версию 2.7.

понедельник, 14 июня 2010 г.

Пути к файлам


# добавление папки в которой искать модули
sys.path.append(path)
# определение директории файла
os.path.dirname(path)
# смена рабочей директории
os.chdir(directory)
# переменная, в которой хранится путь до текущего скрипта
__file__
# делаем, чтобы все относительные пути
# вычислялись относительно пути до скрипта
os.chdir(os.path.dirname(__file__))

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

вторник, 12 января 2010 г.

Полезные модули.

Нашел под python много интересных модулей.

  1. Markovgen - генерация текста, цепями Маркова, не помню где взял, думаю автор не обидится если не укажу ссылку.

  2. ClientForm- классная вещь, позволяет автоматически формировать POST-запрос для html-форм на странице. На том же сайте есть и mechanize, вроде как еще одна приблуда типа urllib-ов и httplib-ов, с отличием, что эмулирует браузер. Не разбирался с ним, помню только, что когда запустил пример с сайта в сниффере увидел, что скрипт полез искать robots.txt.

  3. Beautiful Soup -модуль для работы с html-кодом страницы. Пользовался им, когда не знал про ClientForm, для того, чтобы выдернуть все данные формы.

  4. PIL -модуль для работы с изображениями, пользовался пару раз, для того, чтобы склеить капчу и для того, чтобы уникализировать заливаемые изображения.

  5. libgmail - как-то наткнулся на него, пару раз попробовал приконнектиться к почте, но безуспешно. Модуль, конечно, МастХэв, но, то ли я что-то упустил, то ли он устарел.

  6. wodrpesslib - когда-то писал скрипт, для автопостинга в Wordpress, наткнулся на этот модуль, к сожалению он работает только через xmlrpc, что не всегда приемлимо.