Archive for the ‘Python’ Category

Проверка подключения к интернету

Thursday, September 2nd, 2010 |
from urllib2 import urlopen
""" Returns True if we appear to have an internet connection or False.
    It defaults to using google as a test server, but you can supply an alternative if you want."""
def isonline(reliableserver='http://www.google.com'):
    try:
        urlopen(reliableserver)
        return True
    except IOError:
        return False

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

Проверка Google PR на Python

Tuesday, August 31st, 2010 |

Собственно рабочая функция проверки Google Page Rank :

import urllib, sys

def get_pagerank(url):
    hsh = check_hash(hash_url(url))
    gurl = 'http://www.google.com/search?client=navclient-auto&features=Rank:&q=info:%s&ch=%s' % (urllib.quote(url), hsh)
    try:
        f = urllib.urlopen(gurl)
        rank = f.read().strip()[9:]
    except Exception:
        rank = 'N/A'
    if rank == '':
        rank = '0'
    return rank

def  int_str(string, integer, factor):
    for i in range(len(string)) :
        integer *= factor
        integer &= 0xFFFFFFFF
        integer += ord(string[i])
    return integer

def hash_url(string):
    c1 = int_str(string, 0x1505, 0x21)
    c2 = int_str(string, 0, 0x1003F)

    c1 >>= 2
    c1 = ((c1 >> 4) & 0x3FFFFC0) | (c1 & 0x3F)
    c1 = ((c1 >> 4) & 0x3FFC00) | (c1 & 0x3FF)
    c1 = ((c1 >> 4) & 0x3C000) | (c1 & 0x3FFF)

    t1 = (c1 & 0x3C0) << 4
    t1 |= c1 & 0x3C
    t1 = (t1 << 2) | (c2 & 0xF0F)

    t2 = (c1 & 0xFFFFC000) << 4
    t2 |= c1 & 0x3C00
    t2 = (t2 << 0xA) | (c2 & 0xF0F0000)

    return (t1 | t2)

def check_hash(hash_int):
    hash_str = '%u' % (hash_int)
    flag = 0
    check_byte = 0

    i = len(hash_str) - 1
    while i >= 0:
        byte = int(hash_str[i])
        if 1 == (flag % 2):
            byte *= 2;
            byte = byte / 10 + byte % 10
        check_byte += byte
        flag += 1
        i -= 1

    check_byte %= 10
    if 0 != check_byte:
        check_byte = 10 - check_byte
        if 1 == flag % 2:
            if 1 == check_byte % 2:
                check_byte += 9
            check_byte >>= 1

    return '7' + str(check_byte) + hash_str

print get_pagerank("http://twitter.com")

Легкая IDE для Pyhton

Tuesday, August 24th, 2010 |

Не так давно услышал про такую IDE как Pyscripter. Скачал отсюда, утсановил. Вообщем пара слов : легче чем NetBeans определенно. Рекомендую.

pyscripter IDE

Добавить категории через WordPress API

Wednesday, March 10th, 2010 |

Класс описанный в статье “Постинг в WordPress” позволяет прикрепить к посту уже созданные категории, что как бы несколько неудобно если их нужно создавать динамически. Это можно сделать через WordPress API (по XML-RPC), но в библиотеке эта функция не реализованна, впрочем как и многие другие. Пришлось написать самому :

import xmlrpclib

def uniq(input):
  output = []
  for x in input:
    if x not in output:
      output.append(x)
  return output

def getCategories(blog_url, blog_user, blog_pwd):
    _server = xmlrpclib.ServerProxy(blog_url)
    cat = _server.wp.getCategories(1, blog_user, blog_pwd)
    categories = []
    for item in cat:
        categories.append(item['categoryName'].replace("&", "&"))
    return categories

def addCategories(blog_url, blog_user, blog_pwd, categories):
    _server = xmlrpclib.ServerProxy(blog_url)
    categories = uniq(categories)
    created_cat = getCategories(blog_url, blog_user, blog_pwd)
    for item in categories:
        itm = item.replace("&", "&")
        if (itm not in created_cat):
            post_name = itm
            post_slug = itm.replace(" ", "-")
            post_slug = post_slug.replace("&", "")
            post_parent_id = 0
            post_description = itm
            catStructure = {'name' : post_name,
                            'slug' : post_slug,
                            'parent_id' : post_parent_id,
                            'description' : post_description}
            category_id = _server.wp.newCategory(1, blog_user, blog_pwd, catStructure)

Подобный образом можно реализовать вызов практически любого документированного метода. btw разработчики вордпресса сильно отстают с документацией, поэтому проще посмореть исходный код файла xml-rpc.php в последней сборке вордпресса, чтобы быть в курсе. Я так понимаю, используя вордпрессовскую реализацию metaWeblog API (metaWeblog.newPost) можно добавлять еще и тэги к посту, но саму функцию вроде addTags я не нашел, к сожалению.

Вот так это выглядит на практике :

        wp_cat.addCategories(category)
        cats_id = []
        for item in category:
            if (wp.getCategoryIdFromName(item) <> None):
                cats_id.append(wp.getCategoryIdFromName(item))
        post.categories = tuple(uniq(cats_id))
        idPost = wp.newPost(post, True)

Где wp – это экземпляр класса wordpresslib, а category – это список категрий в виде списка – ['look', 'here']. Типа того, вообщем разобраться несложно.

База данных WordNet. Словарь синонимов.

Thursday, December 3rd, 2009 |

Более подробно сабж можно оценить сходив по ссылке.

WordNet – большая лексическая база данных Английского языка разработанная под руководством George A. Miller.
В наличии имеются существительные, глаголы, прилагательные и наречия, которые сгруппированы в наборы когнитивных синонимов (synsets), каждый из которых выражает различные понятия. Synsets взаимосвязаны посредством концептуально-семантических и лексических отношений (жесть!!!).
Итоговую сеть связей между значениями слов и понятий, можно просматривать с помощью WordNet, который свободно распространяется и доступен для скачивания. Структура WordNet делает его полезным инструментом для компьютерной лингвистике и обработки естественного языка.

Я думаю, намек довольно прозрачен.

Скачать и посмотреть.

Это канешно замечательно. Но можно и нужно копнуть поглубже, пощелкав по сайту нашел то на что надеялся, а именно библиотеки для различных языков программирования.

Библиотеки для работы с WordNet.

Там есть на что посмотреть. Например онлайн словари http://www.a2zdefined.com/ и http://www.memidex.com/

Рекомендую взглянуть на Natural Language Toolkit – это библиотека для Python. Примеры использования по ссылке.

Работа с Blogspot

Friday, September 4th, 2009 |

Да-да, теперь не лезет, в свое время многие постарались на славу, чтобы ушатать этот блогхост кодеками и прочими интересными вещами. Но тем не менее даже на данный момент блогспот можно использовать для привлечения траффика, хотя для этого теперь нужно приложить хоть какие-то усилия. Помимо этого хост можно использовать в качестве индексируемой базы данных (я например какое-то время сохранял результаты google hot trends), собрания каких-либо тематических ссылок. На самом деле вариантов масса, в результате будут получаться различные блоги, и если обновленеи будет поставленно на поток, то эти сайты в конечном итоге послужат фундаментом SEO-империи.

Помимо этого гугл любезно предоставляет API для работы с большей частью своих сервисов, все это дело регулярно апдейтится и документируется, скачать библиотеку для Python можно на официальной странице Google GData Python Client. В данном случае нас интересует работа с blogspot.com. Внутри архива Google GData есть подробная (и короткая) инструкция по установке пакетов (package) для Python.

По поводу использования, на активстэйт как обычно все уже сделали до нас, однако в этом примере мой питон выдает ошибку :
TypeError: CreatePost() takes exactly 6 arguments (5 given)
Это легко исправить, функция CreatePost() помимов всего прочего принимает список тэгов которые нужно добавить к посту. В примере не хватает как раз этого параметра, хз в чем прикол, возможно защита от дурака =) Я пофиксил баг (пример работы с blogspot через API), чтобы все запускалось без проблем, нужно только разобраться в коде и использовать уже готовые функции, единственная не поддающаяся автоматизации через API задача – регистрация аккаунтов, но гмыла можно купить, а регистрировать и оформлять блог или руками, или используя софт эмулирующий работу браузера вроде Human Emulator, хардкорные кодеры, конечно могут реализовать это через curl.

Работать через API конечно удобно, если собирать более-менее красивые блоги в небольшом количестве. В остальных случаях, крайне желательно использовать прокси и как вы понимаете этого (во всяком случае прямо) в API не предусмотрено, нужно или хитрить запуская код через различные проксификаторы или править код самой библиотеки.

Установка дополнений (package) для Python.

Friday, September 4th, 2009 |

Бывает вещи кажущиеся авторам очевидными, на самом деле нифига не очевидны. В качестве примера – установка пакетов или дополнений для Python. Когда я только начал знакомиться с сабжем, данный вопрос потребовал некоторого времени и в конце концов был решен методом проб, ошибок и поиска в гугле. В отличии от PHP, где многие модули уже есть “по умолчанию”, питон использует библиотеки которые программист подгружает по мере необходимости. Существует огромная коллекция этих дополнений практически на все случаи жизни, можно посмотреть тут Python Package Index. Установку любого пакета можно выполнить в несколько шагов :

  1. Скачать архив с пакетом и разархивировать его в какую-нибудь папку.
  2. Используя либо консоль (как тру-хаккер), либо файл менеджер перейти в папку с исходниками пакета и выполнить комманду : python setup.py install
  3. Посмотреть как устанавливается пакет, прочитать финальные поздравления и если что-то не так поискать/изучить инструкцию по установке, которая обычно прилагается.

На данный момент официальный репозиторий насчитывает более 7000 наименований, которые даже удобно разделены по категориям.

Распараллеливание задач. Python. Web. #1

Wednesday, August 19th, 2009 |

Даже забыл что в блогах модно к каждому посту клеить бессмысленное тематическое изображение, вообщем начинаю так же следовать традициям.

Тема поста, как можно догадаться из названия потоки. Если однопоточное приложение – это конвеер, то многопоточное – целый завод, позволяющий выпускать больше “фирменной продукции” за меньшее время (более эффективно использовать вычислительные ресурсы). Другими словами потоки безусловно полезная тема, которая стоит того, чтобы потратить некоторое время на изучение, чтобы так сказать познать ДАО. Тема объемная, сам я тоже не профессиональный программист, нет никакой возможности описать все одним постом => разобью задачу на подзадачи.

Python – Global Interpreter Lock (GIL)

Python обладает некоторым преимуществом в реализации потоков по сравнению с php (по крайней мере так принято считать), но как обычно не все так гладко =) Python – интерпретатор, и если верить девелоперам существует проблема которая называется GIL – global interpreter lock.

При своей работе основной интерпретатор Python постоянно использует большое количество потоково-небезопасных данных. В основном это словари, в которых хранятся атрибуты объектов. Для избежания разрушения этих данных при совместной модификации из разных потоков перед началом исполнения нескольких инструкций (по умолчанию 100) поток интерпретатора захватывает GIL, а по окончании освобождает. Вследствие этой особенности в каждый момент времени может исполняться только один поток Python кода, даже если в компьютере имеется несколько процессоров или процессорных ядер.

Взял из википедии

Смысл всего написанного – программы на питоне медленные, однако сфера нашей деятельности – Web, где мы все время чего-то ждем (таймауты, чтобы не задрочить гугл, ожидание ответа сервера и т.д.), и соответственно скорость выполнения на уровне кода существенно не роляет.

Если интересуют детали – более подробно и наглядно про GIL можно почитать в этом дукументе или посмотреть видео.

Ближе к делу – пора сделать что-нибудь полезное.

Пингуем сайты

Предположим, что вы счастливый вледелец целой сетки блогов/сайтов разбросанных для надежности и перелинковки по разным хостингам. Хорошо было бы переодически проверять сайты на работоспособность, ок – можно проверить вбивая адреса в браузер. Это замечательно если сайтов меньше 10, а если 100? или 1000? Проверка большого количества может стать действительно проблемой которая сожрет кучу времени (хехе я бы на самом деле положил болт на это занятие и уверен 90% вебмастеров поступили бы точно так же). Но тут грамотного вебмастера может выручить несложная автоматизация.

Собственно можно пойти 2я путями – тупо вызывать утилиту ping и парсить результаты, или использовать сокеты для того чтобы формировать/отправлять/получать пакеты используя стандартный потокол ICMP. 1ый способ годится если гонять программку на строго заданной ос, 2ой более универсален.

Собственно реализация 1го способа для Linux который я выдрал где-то в интернете :

import os
import re
import time
import sys
from threading import Thread

class testit(Thread):
    def __init__ (self,ip):
        Thread.__init__(self)
        self.ip = ip
        self.status = -1
    def run(self):
        pingaling = os.popen("ping -q -c2 "+self.ip,"r")
        while 1:
            line = pingaling.readline()
            if not line: break
            igot = re.findall(testit.lifeline,line)
            if igot:
                self.status = int(igot[0])

testit.lifeline = re.compile(r"(\d) received")
report = ("No response","Partial Response","Alive")

print time.ctime()

pinglist = []

for host in range(60,70):
    ip = "192.168.200."+str(host)
    current = testit(ip)
    pinglist.append(current)
    current.start()

for pingle in pinglist:
    pingle.join()
    print "Status from ",pingle.ip,"is",report[pingle.status]

print time.ctime()

2ой способ который я слепил из сниппетов можно скачать тут.

Нетрудно заметить – кода больше, но много лишнего, пример написан на скорую руку но тем не менее все должно быть понятно. Есть только одно “но”, если список хостов довольно объемный программа породит огромное количество потоков (по одному на каждый), что не совсем верно, это распиздяйский подход. Чтобы этого избежать реализуется так называемый пул потоков (thread pool) – т.е. создание ограниченного числа потоков которые обрабатывают задания из очереди. Это тема следующей статьи.

Постинг в wordpress.

Tuesday, August 18th, 2009 |

Частенько вебмастера балуются автоблогами, некоторые делают это хорошо, некоторые штампуют откровенный шлак по типу дорвеев и репостилок фидов, вообщем не суть, я бы посоветовал подумать и делать хорошо, чтобы потом не жаловаться на гугл. Но для того, чтобы реализовать подобное нужно уметь запостить в свой же блог, задача не сложная, но тем не менее ей нужно уделить какое-то время, рассекая просторы интернетов наткнулся на уже готовое решение, которое позволит сделать все элегантно и с минимальными усилиями :

import wordpresslib
url = 'http://www.mysite.com/wordpress/xmlrpc.php'
wp = wordpresslib.WordPressClient(url, 'username', 'password')
wp.selectBlog(0)
post = wordpresslib.WordPressPost()
post.title = 'Post title'
post.description = 'Post content'
idPost = wp.newPost(post, True)

Заявленные функции :

  • Создание новых постов
  • Редактирование старых
  • Публикация “черновиков” (т.е. ранее сохраненных но неопубликованных)
  • Удаление постов
  • Изменение категорий привязанных к посту
  • Информация по  блогу и пользователям
  • Загрузка мультимедиа файлов (фотографии & видео)
  • Получить последний пост/пинги/трекбэки

Проверка прокси – простейший Proxy Checker.

Friday, August 14th, 2009 |

Недавно возникла задача проверять прокси из списка. Посмотрев в гугл, нашел следующий код :

import urllib2
import socket

def is_bad_proxy(pip):
    try:
        proxy_handler = urllib2.ProxyHandler({'http': pip})
        opener = urllib2.build_opener(proxy_handler)
        opener.addheaders = [('User-agent', 'Mozilla/5.0')]
        urllib2.install_opener(opener)
        req=urllib2.Request('http://www.example.com')  # change the URL to test here
        sock=urllib2.urlopen(req)
    except urllib2.HTTPError, e:
        print 'Error code: ', e.code
        return e.code
    except Exception, detail:
        print "ERROR:", detail
        return True
    return False

def main():
    socket.setdefaulttimeout(120)

    # two sample proxy IPs
    proxyList = ['125.76.226.9:80', '213.55.87.162:6588']

    for currentProxy in proxyList:
        if is_bad_proxy(currentProxy):
            print "Bad Proxy %s" % (currentProxy)
        else:
            print "%s is working" % (currentProxy)

if __name__ == '__main__':
    main()

Все просто, пытаемся открыть ресурс по адресу example.com (который 100% работает), если открыли – все ок, если нет – то нет. Подгрузить список проксей можно и из файла например так :

# Just load list from file
def LoadListFromFile(filename):
    result = []
    fileIn = open(filename, 'r')
    for line in fileIn:
        result.append(line.strip())
    fileIn.close()
    return result

About Me

Few shit about and url More

Want to subscribe?

 Subscribe in a reader Or, subscribe via email:
Enter your email address:  
Find entries :