Sunday, September 30, 2012

Программы для парсинга контента

Программы для парсинга контента

zuziken.ru парсер товаров 6.2, 7.0, 8.0 от zuziken
visual web ripper
web content extractor
content downloader

Thursday, September 27, 2012

Если хочешьзаработать переводами http://perevod-il.livejournal.com/29442.html


yzingerman wrote:

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

Для начала надо зарегистрироваться на межсетевых переводческих биржах (proz.com, translatorpub.com, translatorsbase.com, translatorscafe.com и на многих других) и на биржах фрилансеров (guru.com, elance.com, dalance.ru, free-lance.ru и многие другие),

открыть счета в системах онлайн-оплаты (paypal, moneybookers, webmoney и другие),

начинать потихоньку строить своё интернет-присутствие: свой сайт с портфолио, подробные профили на сайтах переводчиков и фрилансеров, свой переводческий блог, активность на переводческих форумах и т.д. и т.п.,

заняться организационной стороной работы (счёт-фактуры, заготовки писем с предложениями по работе, резюме на разных языках, накопить словарей и справочников побольше, может быть в какой-то момент даже открытие собственного дела в соответствующих инстанциях),

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

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

Впрочем, тонкостей этого процесса не перечесть. Если хотите обсудить это подробнее - позвоните мне по Скайпу (yzingerman), буду рад поделиться опытом.

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

Tuesday, September 25, 2012

Насколько похожи объекты на Python http://pkolt.ru/pages/168/

http://pkolt.ru/pages/168/

Определить на сколько отличаются(похожи) объекты
Практическое применение:
  • списки продуктов, каталоги товаров(поиск схожих товаров)
  • профили пользователей, сайты знакомств(поиск близких по критериям людей)
Добавлю от себя, я практическое применение еще вижу в анализе данных, например текстовых, определении в этих данных ключевых слов, их подсчет...а далее определение например близких и схожих статей опубликованных в электронном журнале или блоге(где угодно).
Рассмотрим 2 алгоритма для определения похожести Эвклидово расстояние и коэффициент корреляции Пирсона.

самые распространенные САТ системы

самые распространенные САТ системы

deja vu x
memoq
sdl trados
omegat
wordfast

Monday, September 24, 2012

Грановеттер М. Сила слабых связей


Грановеттер М. Сила слабых связей (перевод З. В. Котельниковой)

С. 31–50 В статье предлагается использовать анализ социальных сетей в качестве инструмента для соединения микро- и макроуровней социологической теории. Предлагаемая методика рассматривается на примере изучения тех последствий, которые имеет на макроуровнетакой аспект микровзаимодействий, как сила диадических связей.

Утверждается, что степень пересечения дружеских сетей двух индивидов находится в прямой зависимости от силы связи между ними. Исследуется, каким образом этот принцип воздействуетна распространение влияния и информации, на возможности мобильности и организацию сообщества. Особое значение придаётся той сплачивающей силе, которой обладают слабые связи. Большинство сетевых моделей в неявной форме имеют дело с сильными связями,и тем самым сфера их применения ограничивается рамками малых групп с четко определёнными границами.

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

Thursday, September 20, 2012

Поменять стиль в ЖЖ


Поменять стиль в ЖЖ

Если вас не устраивает ни один из предлагаемых стилей, в Живом Журнале существуют сообщества, в которых пользователи выкладывают эксклюзивные стили журналов. Большой популярностью пользуется сообщество http://journals-covers.livejournal.com.

Ну, а если вы решили попробовать себя в роли дизайнера, но не имеете навыков работы с HTML, воспользуйтесь генератором дизайнов для ЖЖ по адресу http://lj.yoksel.ru. Кроме того, найти ответы на возникшие вопросы по оформлению своего блога вы сможете в сообществе http://ru-designhelp.livejournal.com.

Monday, September 17, 2012

Запись потокового видео с online-источников (например с youtube)


Вариант 1: онлайн-конвертер http://vixy.net/flv_converter (Всегда только им и пользуюсь)
Вводите ссылку c YouTube, выбираете формат в котором сохранить:
можно в AVI, можно в MOV, можно в MP4 (для iPod), можно в 3gp (для мобильного), можно сохранить только саундтрек в MP3.
Получаете ссылку на результат, который скачиваете.
Вариант2: cайты-скачиватели http://www.videodl.org/http://keepvid.com/
Cнова вводите ссылку, и нажимаете "скачать".
Для проигрывания ролика (если он сохраняется без расширения) необходимо переименовать его в "ИмяФайла.flv" .
Такие ролики можно проигрывать Windows Media Player-ом. Или конвертировать в AVI программой Riva Flv Encoder, которую можно скачать здесь:http://www.rivavx.com/index.php?encoder&L=3
В свою очередь flv можно конвертировать в другие форматы:
http://www.erightsoft.com/SUPER.html
А можно смотреть при помощи GOM-плеера
Который легко взять с официального сайта:
http://www.gomplayer.com/down/GOMPLAYERENSETUP.EXE
Русификатор для него:
http://gom.ucoz.ru/down/gom_2.0.12_rus_setup_full.exe
Важно в процессе установки GOM Player снять галочку с "Run GOM Player now" (запустить GOM Player сейчас). Установите русификатор, а затем запускайте.
Русскоязычный сай
т поддержки.
http://gom.ucoz.ru/index/0-6
Ну и для использующих Firefox - плагин, позволяющий скачивать видео с YouTube:

Friday, September 14, 2012

Thursday, September 13, 2012

Twitter RSS Бот На Python

http://www.spoofi.ru/2011/10/30/twitter-rss-bot-python/

Twitter RSS Бот На Python

30 октября, 2011 г. Категория: Python
Как это обычно бывает, дело было вечером, делать было нечего и я решил немножко изучить язык программирования Python, которым хотел заняться уже давно. Так как я часто пишу в твиттер, то именно на него упал мой взор и я решил написать бота для twitter, который бы умел читать RSS ленты и постить твиты с новыми записями.
Что получилось из моей задумки смотрим под катом. 
И так, для начала я поставил для себя следующие задачи:
  1. Бот должен уметь читать RSS ленты и уметь их парсить.
  2. Бот должен быть написан только на питоне.
  3. Бот должен автоматически фолловить всех, кто фолловит его и отписываться от тех, кто его перестал читать.
Немного посмотрев примеры на других блогах, я попробовал написать отдельно «читалку» RSS,  саму авторизацию и постинг сообщений, фолловинг/анфолловинг твиттерян.
Для всего бота понадобились следующие библиотеки:
  • feedparser — для обработки RSS лент
  • tweepy — для работы с APIлками твиттера
  • oauth — зависимость tweepy — работа с oauth авторизацией
  • cPickle, time — стандартные библиотеки для работы с файлами и временем
  • googl — для сокращения ссылок через сервис goo.gl
Как устанавливать библиотеки я говорить не буду, есть очень много способов, описанных в интернете.  Я использовал easy_install (гугл вам о нём расскажет (: ).
Когда набор для создания бота готов, можно приступить к работе.
Для начала нужно создать приложение и твиттер аккаунт для бота. Делается всё просто — просто заходим на страницу регистрации предложения (я использовал свою учетную запись твиттера для создания приложения, но можно создать аккаунт бота и делать все действия от его имени — так будет даже удобнее) и заполняем все данные. Там же нам нужно будет получить Consumer key и Consumer Secret, а такжеустановить права на Чтение и Запись во вкладке Settings:
access settings twitter app Twitter RSS бот на PythonВ случае если Вы будете использовать для бота ту же учетную запись, от которой и создали приложение — нажимаем на кнопку «Create my access token» и сохраняем полученные Access token и Access token secret.
Если приложение  создано от другого пользователя, который ботом не будет, то нужно проделать следующие операции:
1. Залогинится под аккаунтом бота
2. Написать следующий скрипт, заполнив переменные CONSUMER_KEY и CONSUMER_SECRET:
import tweepy, webbrowser
CONSUMER_KEY = 'paste your Consumer Key here'
CONSUMER_SECRET = 'paste your Consumer Secret here'
auth = tweepy.OAuthHandler (CONSUMER_KEY, CONSUMER_SECRET)
auth_url = auth.get_authorization_url ()
webbrowser.open (auth_url)
verifier = raw_input('PIN: ').strip ()
auth.get_access_token (verifier)
print «ACCESS_KEY = '%s % auth.access_token.key
print «ACCESS_SECRET = '%s % auth.access_token.secret
3. Запустить написанный скрипт. Откроется браузер и Вам будет выдан ПИН код.
4.  Ввести ПИН код в терминале
5. Сохранить Access token и Access token secret, выданные скриптом.

Всё отлично, теперь у нас есть все нужные ключи, питон, требующиеся библиотеки. Пишем код самого бота (в самом коде вставлены комментарии, с помощью которых можно все с легкостью разобрать):
import oauth, tweepy, feedparser, cPickle, time, googl
def Sleep(sec): # функция для приостановки скрипта на заданное время
    print "Ждём %d секунд" % sec
    time.sleep (sec)
    return True
    
def Short(longurl): # сокращает ссылки
    url = short.shorten (longurl)
    return url["id"]
def Tweet(twit): # обновляет статус в твиттере
    if len(twit)<=140 and len(twit)>0:
        res = api.update_status (twit) #обновляем статус
        return True
    else:
        return False
def bot(feedurl):
    feed = feedparser.parse (feedurl) # парсим фид 
    file = open("db.txt""r"# подключаем бд, получаем отправленные ссылки
    posted = cPickle.load (file)
    file.close ()    
    ok = 1
    newposted = posted
    for item in feed.entries:
            for i in posted: # перебираем отправленные и новые ссылки
                    if i == item.link:
                            ok = 0
                            break
                    ok = 1
            if ok:
                text = item.title + " " + Short (item.link)
                print "Твитим: ", text
                Tweet (text) # если такая ссылка не отправлялась - отправляем
                Sleep (300)
                newposted.append (item.link)
    file = open("db.txt","w"# сохраняем в файл отправленные ссылки
    cPickle.dump (newposted, file)
    file.close ()
    return True
def refollow(): # подписывается на всех, кто читает бота
    followers = api.followers ()
    following = api.friends ()
    fnames = []
    for user in following:
        fnames.append (user.screen_name)    
    for follower in followers:
        if (not follower.screen_name in fnames):
            print "Подписываюсь на @",follower.screen_name
            follower.follow ()
    return True
def reunfollow(): # отподписывается от всех, кто не читает бота, но есть в нашем френд листе
    followers = api.followers ()
    following = api.friends ()
    fnames = []
    for user in followers:
        fnames.append (user.screen_name)    
    for follower in following:
        if (not follower.screen_name in fnames):
            print "Отписываюсь от @",follower.screen_name
            follower.unfollow ()
    return True
def init(): 
    global api
    global short
    consumer_key = "" # ваш consumer key
    consumer_secret = "" # ваш consumer secret 
    access_key="" # access key
    access_secret="" # и access secret
    auth = tweepy.OAuthHandler (consumer_key, consumer_secret)
    auth.set_access_token (access_key, access_secret)
    api=tweepy.API (auth)
    short = googl.Googl (""# ключ для API goo.gl
init () # старт
while 1#вечный цикл
    bot ("http://feeds2.feedburner.com/spoofi"# запускаем обработку фида
    Sleep (20*60# спим 20*60 (1800) секунд
    refollow () # фолловим новых читателей
    Sleep (20*60# опять спим
    bot ("http://prodigger.ru/rss/index/"# можно добавить еще один фид
    Sleep (20*60)
    reunfollow () # удаляем не читающих нас
    Sleep (20*60)
И да, для получения ключа APIлок goo.gl: проходим в консоль API, жмем «Add project», почти в самом низу выбираем «URL Shortener API». В подпункте «API access» будет ваш ключ для APIлок:
googl api access key 300x148 Twitter RSS бот на Python
Собственно на этом всё, вставляем в код все ключи, сохраняем в файл, например bot.py и, предварительно дав права на запуск, запускаем его.
Наблюдаем за ботом в твиттере (:
Возможно я что-то сделал не так коротко как можно было, может быть есть и другие косяки — честно говорю, что сел за питон первый раз и за несколько часов родил этот код, сильно помидорами не швыряйтесь (: Буду рад Вашим советам, относительно кода.
UPD: исходники можно скачать архивом.
P.S. вот что получилось у меня — @pytbot
Ну, а если Вы решили транслировать RSS ленту в твиттер, то у Вас явно есть сайт, на котором можно заработать. Биржи купли-продажи ссылок могут помочь с этим!

Простой Twitter-бот на Python

http://habrahabr.ru/post/127237/

Простой Twitter-бот на Python

В данной статье я бы хотел поделиться опытом написания небольшого твиттер-бота на Python.

Вступление

На написание бота меня натолкнул известный многим «пичалька-бот» в Twitter, который автоматически шлет реплаи всем, кто упомянит слово «пичалька» в своем твите. Поскольку в тот момент я занимался активным изучением Python, было решено писать на нем.


Подготовка

В качестве библиотеки для работы с API твиттера я взял tweepy. Это достаточно простая и удобная библиотека; к тому же в ее репозитории в Google Code есть несколько примеров кода и хорошаядокументация. Еще она есть в репозиториях Ubuntu и Debian, поэтому ее можно легко установить командой sudo apt-get install python-tweepy.

Разработка

1. Для работы бота необходимо зарегистрировать новое приложение в Twitter. Перейдите по ссылке и заполняем все поля.

image

После этого вы получите 2 ключа для OAuth авторизации.

image

Также необходимо изменить права приложения. Вкладка «Settings», Access -> Read and Write

image

2. Теперь необходимо получить еще 2 ключа, индивидуальные для каждого пользователя. Для этого можно нажать кнопку «Create access token» на странице приложения, либо воспользоваться небольшим примером кода из документации tweepy.

image

Вариант с примером кода:

import tweepy, webbrowser

CONSUMER_KEY = 'paste your Consumer Key here'
CONSUMER_SECRET = 'paste your Consumer Secret here'

auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
auth_url = auth.get_authorization_url()
webbrowser.open(auth_url)
verifier = raw_input('PIN: ').strip()
auth.get_access_token(verifier)
print "ACCESS_KEY = '%s'" % auth.access_token.key
print "ACCESS_SECRET = '%s'" % auth.access_token.secret


Сохраните его в файл, вставьте ключи, полученные при регистрации приложения, и запустите. Перейдите по предложенному адресу, и Twitter даст вам пин-код, который нужно будет ввести в консоль. При успешной авторизации вы получите те самые два пользовательских ключа.



3. Теперь можно перейти к коду самого бота:

#coding: utf-8
import oauth, tweepy, sys, locale, threading 
from time import localtime, strftime, sleep

replyed=['']
search_reply_words={'печалька':' каждый раз, когда вы говорите "печалька", умирают хомячки.','пичалька':' каждый раз, когда вы говорите "пичалька", умирают хомячки.'}
update_time=60 #время обновления

def Tweet(twit,id_reply):
    if len(twit)<=140 and len(twit)>0:
        api.update_status(twit,id_reply) #обновляем статус (постим твит)
        return True
    else:
        return False

def init(): #инициализируемся
    global api
    #consumer_key = ""
    #consumer_secret = ""
    #access_key=""
    #access_secret=""
    auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
    auth.set_access_token(access_key, access_secret)
    api=tweepy.API(auth)

class TwiBot(threading.Thread): 
    def __init__ (self, keyword,answer):
        self.keyword = keyword
        self.answer=answer
        threading.Thread.__init__(self)

    def run (self):
        global replyed,api
        request=api.search(self.keyword) #ищем твиты с указанным словом
        for i in request:
            if i.from_user!='thevar1able' and i.id not in replyed: # если твит не наш и мы на него еще не отвечали...
          try:
           Tweet('@'+i.from_user+self.answer,i.id) #...отвечаем
           print strftime('[%d/%m %H:%M:%S]',localtime())+' Reply to @'+i.from_user+'('+str(i.from_user_id)+')'
          except:
           print strftime('DUP [%d/%m %H:%M:%S]',localtime())+' Reply to @'+i.from_user+'('+str(i.from_user_id)+')'
          replyed.append(i.id)
        return True



init() # инициализируемся
while not False: # вечно
    for word in search_reply_words: 
        TwiBot(word, search_reply_words[word]).start() #запускаем поток с нужным словом для поиска
        print strftime('[%d/%m %H:%M:%S]',localtime())+' Updating for word "'+str(word)+'"...'
        sleep(1) 
    sleep(update_time)


Для корректной работы нужно вставить полученные ключи в переменные в коде: ключи со страницы приложения — consumer_key и consumer_secret, пользовательские ключи — access_key и access_secret. Также нужно поправить ключевые слова для поиска твитов и ответы на них в переменной search_reply_words.

Вот и все на сегодня.

Спасибо за внимание! Надеюсь, было интересно и полезно.

+39
29 августа 2011 в 11:13
143

комментарии (30)



0
mktums#
Так значит счетчик хомячков ваш? :)

ЗЫ: в twitter есть еще бот, который серчит по «over 9000» :)


+1
thevar1able#

Нет, к сожалению, не мой :)


+1
Setti#



0
So1#

WHAT?! NINE THOUSAND?!


+4
maxp#
Некоторые рекомендации по коду:
— избавление от global очень положительно сказывается на понимании сути мироздания
— не плохо было бы ловить KeyboardInterrupt и останавливать запущенные треды
— если хочется написать несколько одинаковых print bla-bla… некоторые из которых находятся в except, то самое время подумать про logging


+1
thevar1able#

Приму к сведению, спасибо.


+4
seriyPS#
global в сочетании с Threading приведут вас в ад…


+1
thevar1able#

Простите, больше так не буду :( Честно :(
А как передать список replyed треду? Так, чтобы он мог вносить в него изменения, и чтобы этот список был доступен другим тредам.


+1
seriyPS#

Ну, первое что бы я сделал — это выпилил бы Threading вообще выдал каждому треду свою уникальную копию api. Т.е. сделал бы так, чтобы init() возвращал tweepy.API(auth) типа

def init():
    ....
    return tweepy.API(auth)


И сделал бы так, чтобы init вызывался в начале run() функции
def run (self):
    api=init()

Так мы избавимся от race — conditions в tweepy.

А для записи айдишников твитов, на которые мы уже отвечали нужно использовать threading.Lock ну и так и быть — глобальную переменную или переменную класса:

class TwiBot(threading.Thread):
    replyed=set() # set гарантирует уникальность и проверка in работает быстрее
    replyed_lock=threading.Lock()

    def run():
        ....
        need_reply=[] # будущий список твитов, на которые нужно ответить.
        # захватываем блокировку replyed и быстро проходим по списку твитов
        # составляя список тех, на которые нужно ответить
        with TwiBot.replyed_lock:
            for i in request: #XXX: почему request? response ведь!!!
                if i.from_user!='thevar1able' and i.id not in TwiBot.replyed:
                    need_reply.append(i)
                    TwiBot.replyed.add(i.id)
        # тут блокировка уже снята и другой поток может писать в replyed
        # а наш поток может не спеша слать ответы.
        for i in need_reply:
            ...
            Tweet('@'+i.from_user+self.answer,i.id)
            ...
        


–1
thevar1able#

А действительно, зачем тут Threading…


+1
14zy#
Блин, так обрадовался, думал что приду домой — реализую давно задуманного твиттер бота, а тут злые дадьки в комментах говорят что я попаду в ад, если буду использовать «global в сочетании с Threading»

Просто я не программист(в нормальном понимании этого слова), может у кого есть ссылка на хорошую и простую статью про написание твиттер-ботов(можно и на php)

Спасибо!


0
bobry#

Разве написание твиттер-ботов имеет какую то особую специфику? особенно аналогичных боту в статье — import tweepy и все драконы уже позади.


0
maxp#

Можете сильно не заморачиваться, для непрограммиста и этот код вполне на уровне.

Но для улучшения мыслительной кармы посмотрите сюда — www.python.org/dev/peps/pep-0020/
artifex.org/~hblanks/talks/2011/pep20_by_example.html
docs.python.org/tutorial/

Причем, это вовсе не сугубо к Питону относится, но и ко многим другим языкам.


0
maxp#

Упс, а текст тут я не умею форматировать :(


0
14zy#

Спасибо)


+6
gigimon#
В Python принято использовать конструкции вида:
if __name__ == '__main__:
main()

А вот в функции main уже делать вашу инициализацию и запуск тредов


+1
Setti#

> принято использовать конструкции

И сразу бы писали почему. Чтобы модуль можно было использовать и самостоятельно и как подключаемую библиотеку.


+4
bobry#
Интересно откуда родом вот эта идиома:

while not False:
    ...


Обычно пишут `while True` или `while 1`, а тут налицо креатив :)


+5
thevar1able#

Просто было скучно :)


0
bobry#

Видимо игнорирование string formatting и склевание строчек плюсом по той же причине, да?


–1
thevar1able#

А почему плохо склеивать строки плюсом? Они же приведены к одному типу данных.


+1
bobry#

Потому что в питоне для этого есть два вида форматирования строк.


+1
thevar1able#

Спасибо, приму к сведению.


–1
Setti#

мило


+1
Savvy#
давайте и я занудно попинаю
< if len(twit)<=140 and len(twit)>0:
> if 0<len(twit)<=140:
Это ж питон, и вас должно было напрячь, что вычисляете одно и то же два раза подряд


0
spacenergy#
Не могу найти запостенные скриптом твиты. Где они должны появляться?


0
spacenergy#

Сорри, нашел


0
akme#
tweepy клёвая ^_^


0
qmax#
а access_token выдаётся на вечно или протухает?


0
maxidler#

Навечно вроде