четверг, 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, он подумает что сайт глючит.

вторник, 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. Там я и нашел решение.


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")

четверг, 3 сентября 2009 г.

Работа с https и прокси

Последнее время  я использую pycurl для написания HTTP-скриптов, однако, у меня нет сборки pycurl для python 2.6 с поддержкой ssl. Поэтому приходится обходится штатными средствами.

Для начала создаем опенер с подержкой https и автоподстановкой cookies:
def build_opener_ssl(debug=False):
http_handler = urllib2.HTTPHandler(debuglevel=debug)
https_handler = urllib2.HTTPSHandler(debuglevel=debug)
cookie_jar = cookielib.CookieJar()
cookie_handler = urllib2.HTTPCookieProcessor(cookie_jar)
opener = urllib2.build_opener(http_handler,https_handler,cookie_handler)
opener.cookie_jar = cookie_jar
return opener

Затем при создании запроса, указываем, что запрос необходимо отправлять через прокси:
def main():
opener = build_opener_ssl()
req = urllib2.Request(url, data, headers)
req.set_proxy(proxia,"http") # Прокси
response = opener.open(req)
the_page = response.read()

Кодировки. utf8 -> cp1251.

Наверняка все сталкиваются с данной проблемой. Трудно сразу понять, что значат все эти encode и decode.  Поэтому, чтобы получить строку в кодировке cp1251 из utf8, необходимо сделать следующие преобразования:
utf8 -> unicode -> cp1251


s_utf8 = 'рыба'
s_uni = s_utf8.decode('utf8')
s_cp1251 = s_uni.encode('cp1251')