- Markovgen - генерация текста, цепями Маркова, не помню где взял, думаю автор не обидится если не укажу ссылку.
- ClientForm- классная вещь, позволяет автоматически формировать POST-запрос для html-форм на странице. На том же сайте есть и mechanize, вроде как еще одна приблуда типа urllib-ов и httplib-ов, с отличием, что эмулирует браузер. Не разбирался с ним, помню только, что когда запустил пример с сайта в сниффере увидел, что скрипт полез искать robots.txt.
- Beautiful Soup -модуль для работы с html-кодом страницы. Пользовался им, когда не знал про ClientForm, для того, чтобы выдернуть все данные формы.
- PIL -модуль для работы с изображениями, пользовался пару раз, для того, чтобы склеить капчу и для того, чтобы уникализировать заливаемые изображения.
- libgmail - как-то наткнулся на него, пару раз попробовал приконнектиться к почте, но безуспешно. Модуль, конечно, МастХэв, но, то ли я что-то упустил, то ли он устарел.
- wodrpesslib - когда-то писал скрипт, для автопостинга в Wordpress, наткнулся на этот модуль, к сожалению он работает только через xmlrpc, что не всегда приемлимо.
вторник, 12 января 2010 г.
Полезные модули.
Нашел под python много интересных модулей.
вторник, 6 октября 2009 г.
Пул потоков. Модуль Threading.
Я думаю, пример из SEO-софта на тему пула потоков долго искать не придется. Взять тот же Хрумер. Указал количество потоков, например 20, запустил - все 20 работают, как только один из них завершит работу - запускается следующий и так, пока не закончатся ссылки. Наверное в 9 из 10 случаев я пишу скрипт с использованием пула потоков. Рассмотрим некторые примеры.
Пример 1. "В лоб".
Функцию step_one запускаем в несколько потоков, все созданные потоки храним в списке. Затем провереяем в цикле какие потоки завершили работу и, если такие есть, создаем новые и так, пока не достигнем какого-либо результата. Криво, неудобно, зато сразу понятно. Достаточно долго пользовался такой реализацией, а всё из-за лени.
Пример 2. Семафоры.
Уже лучше, количество потоков контролируется, но надо заранее знать сколько будет потоков, в общем как-то изворачиваться если тебе надо будет прервать все эти потоки по условию.
Пример 3. Очереди.
Здесь используется модуль Queue. На данный для меня самый удобный варинат - и выглядит красиво, и данные передавать можно.
Помимо тех вариантов, что я описал, можно погуглить на тему threadpool и найти какие-нибудь модули для организации пула потоков.
Пример 1. "В лоб".
threads = []
for x in range(THREADS):
new_thread = threading.Thread(target=step_one)
threads.append(new_thread)
new_thread.start()
time.sleep(1)
while True: # какое-то условие
for y in threads[:]:
if not y.isAlive():
threads.remove(y)
new_thread = threading.Thread(target=step_one)
threads.append(new_thread)
new_thread.start()
time.sleep(0.1)
while threading.activeCount()>0:
time.sleep(5)
Функцию step_one запускаем в несколько потоков, все созданные потоки храним в списке. Затем провереяем в цикле какие потоки завершили работу и, если такие есть, создаем новые и так, пока не достигнем какого-либо результата. Криво, неудобно, зато сразу понятно. Достаточно долго пользовался такой реализацией, а всё из-за лени.
Пример 2. Семафоры.
import time
import threading
max_potokov = 20
maxconnections = 5
akkiQueue = threading.BoundedSemaphore(value=maxconnections)
def doform():
akkiQueue.acquire()
# код функции
akkiQueue.release()
for i in xrange(max_potokov):
time.sleep(1)
p = threading.Thread(target=doform)
p.setDaemon(True)
p.start()
while threading.activeCount()>0:
time.sleep(5)
Уже лучше, количество потоков контролируется, но надо заранее знать сколько будет потоков, в общем как-то изворачиваться если тебе надо будет прервать все эти потоки по условию.
Пример 3. Очереди.
queue = Queue.Queue() # создаем очередь
def register(item):
#Функция с основным кодом
return
def repeat():
while True:
try:
item = queue.get_nowait() # ждём данные
except Queue.Empty:
break
register(item) # передаем данные в нашу функцию
time.sleep(0.5)
queue.task_done() # задача завершена
for item in range(MAX_THREADS):
queue.put(item) # заносим данные в очередь
for i in xrange(THREADS):
t = threading.Thread(target=repeat) # создаем нить
t.start() # стартуем
time.sleep(0.5)
queue.join() # блокируем очередь до завершения
Здесь используется модуль Queue. На данный для меня самый удобный варинат - и выглядит красиво, и данные передавать можно.
Помимо тех вариантов, что я описал, можно погуглить на тему threadpool и найти какие-нибудь модули для организации пула потоков.
четверг, 17 сентября 2009 г.
Странные cookies гугла.
Вот такие вот: __utma=199306621.1164773483.1250671648.1250671648.1250671648.1; __utmb=199306621; __utmc=199306621; __utmz=199306621.1250671648.1.1.utmccn=(direct)|utmcsr=(direct)|utmcmd=(none)
Много раз уже их видел, не придаю им значения, вроде бы это куки для google-analytcs, ну не мешают и ладно, однако один раз помешали. Точнее даже два. Писал регалку, сайт без них выдавал только заголовок, без тела страницы. Я сначала было отчаялся, но потом добавил curl.setopt(pycurl.COOKIE,'вся эта зеленая хрень') и обманул сайт. Но как-то странно, если у пользователя на этом сайте будет отключен java-script, он подумает что сайт глючит.
Много раз уже их видел, не придаю им значения, вроде бы это куки для google-analytcs, ну не мешают и ладно, однако один раз помешали. Точнее даже два. Писал регалку, сайт без них выдавал только заголовок, без тела страницы. Я сначала было отчаялся, но потом добавил curl.setopt(pycurl.COOKIE,'вся эта зеленая хрень') и обманул сайт. Но как-то странно, если у пользователя на этом сайте будет отключен java-script, он подумает что сайт глючит.
вторник, 15 сентября 2009 г.
Обёртки для pycurl
В своё время узнал про две обёртки для pycurl. Первая - grab, вторая - pylibcurl, ctypes обертка не требует установки pycurl'а. Собственно, я ими даже не пользовался, пытался начать, но забрасывал, зря, конечно. А на данный момент юзать я их тоже не собираюсь, поскольку думаю обворачивать pycurl в собственные классы, нет, не так круто как эти две, а скромненько для своих целей, не для общего пользования. Думаю для каждого SEO-питонщика наступает время, когда он пишет собственную обертку для pycurl=) А если кто-то и искал ООП реализацию pycurl'a, вот вам целых две на выбор.
воскресенье, 6 сентября 2009 г.
Узнаем текущую дату
Для получения текущей даты необходимо использовать модуль datetime. Для начала нам необходимо получить объект datetime, содержащий сегодняшнюю дату, затем с помощью метода timetuple мы получаем кортеж, содержащий значение текущего года, месяца, дня и т.д.
Иногда бывает необходимо узнать количество секунд прошедших от начала отсчета, до текущей даты, делается это следующим образом:
import datetime
import time
now = datetime.datetime.now() # получаем текущую дату
#Список дней недели
day_of_weeks = {0 : "Monday",
1 : "Tuesday",
2 : "Wednesday",
3 : "Thursday",
4 : "Friday",
5 : "Saturday",
6 : "Sunday"}
year, month, day, hour, minutes, sec, wday, yday, isdst = now.timetuple()
if month<10: month = "0%s" % month
if day<10: day = "0%s" % day
if hour<10: hour = "0%s" % hour
if minutes<10: minutes = "0%s" % minutes
if sec<10: sec = "0%s" % sec
today = "Now: {3}:{4}:{5}, {0}.{1}.{2}, {6} "\
.format(day, month, year, hour, minutes, sec,day_of_weeks[wday])
print today
Иногда бывает необходимо узнать количество секунд прошедших от начала отсчета, до текущей даты, делается это следующим образом:
sectime = int (time.mktime(now.timetuple()))
пятница, 4 сентября 2009 г.
pycurl multipart/form-data
Довольно много времени потратил, гуглив на тему, как отправлять данные в формате multipart/form-data. Так ничего полезного не обнаружив, я решил заглянуть в папку test от pycurl'a. Там я и нашел решение.
Оказывается надо передавать список кортежей пар поле-значение для параметра pycurl.HTTPOST. А я пытался реализовать это используя опцию pycurl.POSTFIELDS.
pf = [('field1', 'value1'),
('field2', 'value2'),
('field3', 'value3')
]
c.setopt(c.HTTPPOST, pf)
Оказывается надо передавать список кортежей пар поле-значение для параметра pycurl.HTTPOST. А я пытался реализовать это используя опцию pycurl.POSTFIELDS.
Склейка изображений.
Понадобилось мне склеить изображения. Причем изображения я получаю по протоколу HTTP. Я погуглил и нашел библиотеку PIL для работы с изображениями, установил её и реализовал всё следующим образом:
#cap1, cap2, cap3 - это у нас httpResponse
img = Image.new('RGB', (225, 51))
img1 = Image.open(StringIO.StringIO(cap1.read()))
img2 = Image.open(StringIO.StringIO(cap2.read()))
img3 = Image.open(StringIO.StringIO(cap3.read()))
img.paste(img1, (0,0))
img.paste(img2, (75,0))
img.paste(img3, (150,0))
im = StringIO.StringIO()
# im.show()
img.save(im,"JPEG")
Подписаться на:
Сообщения (Atom)