TechCave

Описание сайта

Основная информация

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

Python поддерживает несколько парадигм программирования, в том числе структурное, объектно-ориентированное, функциональное, императивное и аспектно-ориентированное. Основные архитектурные черты — динамическая типизация, автоматическое управление памятью, полная интроспекция, механизм обработки исключений, поддержка многопоточных вычислений и удобные высокоуровневые структуры данных. Код в Python организовывается в функции и классы, которые могут объединяться в модули (они в свою очередь могут быть объединены в пакеты).

Рейтинг: 1
Создана 4 года назад
Владелец root

Стена группы

Загрузка...
2 года назад
#

Собираем данные с помощью Scrapy


Здесь уже проскакивали вскользь упоминания об этом фреймворке для сбора данных. Инструмент действительно мощный и заслуживает большего внимания. В этом обзоре я расскажу, как
  • создать паука, выполняющего GET запросы,

  • извлекать данные из HTML документа,

  • обрабатывать и экспортировать данные.


Scrapy

Установка

Требования: Python 2.5+ (3-я ветка не поддерживается), Twisted, lxml или libxml2, simplejson, pyopenssl (для поддержки HTTPS)

Без проблем установил из репозитариевUbuntu. На странице Installation guide описывается установка в других дистрибутивах Linux, а так же в Mac OS X и Windows.

Подробнее
2 года назад
#

Web Scraping с помощью python


Введение

Недавно заглянув на КиноПоиск, я обнаружила, что за долгие годы успела оставить более 1000 оценок и подумала, что было бы интересно поисследовать эти данные подробнее: менялись ли мои вкусы в кино с течением времени? есть ли годовая/недельная сезонность в активности? коррелируют ли мои оценки с рейтингом КиноПоиска, IMDb или кинокритиков?
Но прежде чем анализировать и строить красивые графики, нужно получить данные. К сожалению, многие сервисы (и КиноПоиск не исключение) не имеют публичного API, так что, приходится засучить рукава и парсить html-страницы. Именно о том, как скачать и распарсить web-cайт, я и хочу рассказать в этой статье.
В первую очередь статья предназначена для тех, кто всегда хотел разобраться с Web Scrapping, но не доходили руки или не знал с чего начать.

Off-topic: к слову, Новый Кинопоиск под капотом использует запросы, которые возвращают данные об оценках в виде JSON, так что, задача могла быть решена и другим путем.

Задача

Задача будет состоять в том, чтобы выгрузить данные о просмотренных фильмах на КиноПоиске: название фильма (русское, английское), дату и время просмотра, оценку пользователя.
На самом деле, можно разбить работу на 2 этапа:
  • Этап 1: выгрузить и сохранить html-страницы

  • Этап 2: распарсить html в удобный для дальнейшего анализа формат (csv, json, pandas dataframe etc.)


Подробнее
2 года назад
#

Python: Работа с базой данных, часть 1/2: Используем DB-API


Python DB-API – это не конкретная библиотека, а набор правил, которым подчиняются отдельные модули, реализующие работу с конкретными базами данных. Отдельные нюансы реализации для разных баз могут отличаться, но общие принципы позволяют использовать один и тот же подход при работе с разными базами данных.

Python DB-API
В статье рассмотрены основные методы DB-API, позволяющие полноценно работать с базой данных. Полный список можете найти по ссылкам в конец статьи.

Требуемый уровень подготовки: базовое понимание синтаксиса SQL и Python.

Подробнее
2 года назад
#
Тонкости построения сетевых моделей в Python

Что является основным инструментом, который использует руководитель при управлении проектом? Принято считать, что основным инструментом руководителя проекта является календарный план, в основе которого лежит сетевая модель работ по проекту. Однажды мне довелось реализовать сетевую модель работ на языке Python (код и описание здесь). Ниже приведены уроки, извлеченные по результатам проделанной работы.

Сначала создай работы, потом устанавливай связи

При построении сетевой модели часто возникает вопрос, в каком порядке создавать работы и устанавливать связи между ними? Наиболее очевидным является двухэтапный подход – сначала создаются все работы модели, затем между ними устанавливаются связи. Такой подход позволяет избежать ошибок типа KeyError: '101', возникающих при параллельном выполнении этих двух операций, когда система пытается установить связь с работой, которая еще не была создана.

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

Пересчитывай модель после её построения

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

Для сравнения были реализованы две функции:

  1. build_model_by_method() – построение с пересчетом модели;

  2. build_model_by_assignment() – построение без пересчета модели.


После чего проведено сравнение времени их выполнения на моделях из 100, 1000 и 10000 работ.

# network.py
from predict import Activity
import xml.etree.ElementTree as ET
import sys
import timeit
from timeit import Timer
def build_model_by_method(filename):
    sys.setrecursionlimit(10000)
    f = open(filename,'r')
    tree = ET.parse(f)
    root = tree.getroot()
    schedule = {}
    next = {}
    for child in root.findall('Activity'):
        id = None if child.find('id').text == None else child.find('id').text
        start_date = None if child.find('start_date').text == None else int(child.find('start_date').text)
        finish_date = None if child.find('finish_date').text == None else int(child.find('finish_date').text)
        duration = None if child.find('duration').text == None else int(child.find('duration').text)
        not_early_date = None if child.find('not_early_date').text == None else int(child.find('not_early_date').text)
        a = Activity(id, start_date, finish_date, duration, not_early_date)
        schedule[id] = a
        next_activity = '' if child.find('next_activity').text == None else child.find('next_activity').text
        next[id] = next_activity
    for key in schedule:
        if next[key] != '':
            for next_id in next[key].split(';'):
                schedule[key].append_next(schedule[next_id])
    sys.setrecursionlimit(1000)

def build_model_by_assignment(filename):
    f = open(filename,'r')
    tree = ET.parse(f)
    root = tree.getroot()
    schedule = {}
    next = {}
    for child in root.findall('Activity'):
        id = None if child.find('id').text == None else child.find('id').text
        start_date = None if child.find('start_date').text == None else int(child.find('start_date').text)
        finish_date = None if child.find('finish_date').text == None else int(child.find('finish_date').text)
        duration = None if child.find('duration').text == None else int(child.find('duration').text)
        not_early_date = None if child.find('not_early_date').text == None else int(child.find('not_early_date').text)
        a = Activity(id, start_date, finish_date, duration, not_early_date)
        schedule[id] = a
        next_activity = '' if child.find('next_activity').text == None else child.find('next_activity').text
        next[id] = next_activity
    for key in schedule:
        if next[key] != '':
            for next_id in next[key].split(';'):
                schedule[key].next_activity.append(schedule[next_id])

print('Test for 100 activities:')

t1 = Timer("build_model_by_method('data/activity_100.xml')", "from __main__ import build_model_by_method")
print("build_model_by_method", t1.timeit(number = 1000))

t2 = Timer("build_model_by_assignment('data/activity_100.xml')", "from __main__ import build_model_by_assignment")
print("build_model_by_assignment", t2.timeit(number = 1000))

print('Test for 1000 activities')

t3 = Timer("build_model_by_method('data/activity_1000.xml')", "from __main__ import build_model_by_method")
print("build_model_by_method", t3.timeit(number = 1000))

t4 = Timer("build_model_by_assignment('data/activity_1000.xml')", "from __main__ import build_model_by_assignment")
print("build_model_by_assignment", t4.timeit(number = 1000))

print('Test for 10000 activities')

t5 = Timer("build_model_by_method('data/activity_10000.xml')", "from __main__ import build_model_by_method")
print("build_model_by_method", t5.timeit(number = 1000))

t6 = Timer("build_model_by_assignment('data/activity_10000.xml')", "from __main__ import build_model_by_assignment")
print("build_model_by_assignment", t6.timeit(number = 1000))

Подробнее
2 года назад
#
Scrapy: собираем данные и сохраняем в базу данных

Введение

Меня заинтересовал данный фреймворк для сбора информации с сайтов. Здесь были публикации по Scrapy, но поскольку детальной информации на русском языке мало, то я хотел бы рассказать о своем опыте.

Задача
  • Зайти на страницу со списком абитуриентов oreluniver.ru/abits?src=all_postupil. Затем пройти по каждой ссылке и собрать данные о поступивших абитуриентах и набранных ими баллах.

  • С самой же страницы, собрать данные о специальностях, на которые велся набор.

  • Сохранить все результаты в базу данных


Решение

Для решения задачи я использовал Python 2.7, Scrapy 1.1 Sqlalchemy 1, Sqlite. Установил все как описано в документации. В статье также описана установка на русском языке, там же о создании самого паука. Вот что у меня получилось.

Подробнее
2 года назад
#
Парсинг ресурсов при помощи Python

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

Хочу отметить, что работа над этой статьей ещё не закончена. Если у вас есть замечания или дополнение, добро пожаловать в комментарии.

Важно

Всегда сначала посмотрите предлагает ли сайт собственный API, RSS/Atom фиды также пригодятся.

Требования

Мы будем использовать две дополнительные библиотеки для Python.

Запросы

Мы будем использовать библиотеку requests вместо urllib2, так как она во всех отношениях превосходит urllib2. Я мог бы долго это доказывать, но, как мне кажется, на странице этой библиотеки все сказано в одном абзаце:

Библиотека urllib2 предлагает нам большинство необходимых аспектов для работы с HTTP, но API оставляет желать лучшего. Она была создана в другое время и для другой сети интернет. Она требует невероятного объёма работ даже для простых задач.

Подробнее
2 года назад
#
PYCONRU-2016: видео всех докладов и презентации

3-4 июля недалеко от Москвы прошла четвертая международная конференция python-разработчиков PyCon Russia. Под катом — много видео, презентации и фотографии. А еще посмотрите отчетный ролик — в нем коротко о том, что было на PyCon-2016 плюс немного из истории конференции.



Доклады

Python core developer с 2001 года, автор и мэйнтейнер многих частей языка Raymond Hettinger (Санта-Клара, США) сделал доклад «Thinking about Concurrency» и провел воркшоп «Descriptors and Context Managers». По итогам голосования в телеграм-боте @PyconRu_bot Реймонд признан лучшим докладчиком. Посмотрите видео и убедитесь сами.



Подробнее
2 года назад
#
Авторизация в VK для людей

Что случилось?

Здравствуй, дорогой читатель. Если тебе хотя бы однажды доводилось работать с API Вконтакте и при этом писать все на python, вероятно, авторизация приложения заставила тебя сделать несколько приседаний, после которых ног либо не чувствуешь и падаешь в обморок, либо вкачиваешь квадрицепс и все же пробиваешь API, как Ван Дамм.

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

Далее я предлагаю рассмотреть небольшую библиотеку, позволяющую в одну строчку авторизовать свое приложение для конкретного пользователя и получить access_token. В конце статьи представлена ссылка на github-репозиторий этой библиотеки с quickstart'ом в README-файле.

Задача

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

Итак, используем python3.5, библиотеку для html запросов requests и getpass для скрытого ввода пароля.

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

Реализация

Начнем с создания класса. При инициализации будем требовать список «разрешений», к которым приложение хочет получить доступ, id этого приложения и версию API VK. Плюсом добавим несколько необязательных параметров, значение каждого из которых прояснится далее.

Метод __init__

class VKAuth(object):

    def __init__(self, permissions, app_id, api_v, email=None, pswd=None, two_factor_auth=False, security_code=None, auto_access=True):
        """
        Args:
            permissions: list of Strings with permissions to get from API
            app_id: (String) vk app id that one can get from vk.com
            api_v: (String) vk API version
        """

        self.session        = requests.Session()
        self.form_parser    = FormParser()
        self.user_id        = None
        self.access_token   = None
        self.response       = None

        self.permissions    = permissions
        self.api_v          = api_v
        self.app_id         = app_id
        self.two_factor_auth= two_factor_auth
        self.security_code  = security_code
        self.email          = email
        self.pswd           = pswd
        self.auto_access    = auto_access

        if security_code != None and two_factor_auth == False:
            raise RuntimeError('Security code provided for non-two-factor authorization')

Подробнее
3 года назад
#
Python: строим распределенную систему c PySyncObj

Представьте, что у вас есть класс:

class MyCounter(object):
    def __init__(self):
        self.__counter = 0
    def incCounter(self):
        self.__counter += 1
    def getCounter(self):
        return self.__counter


И вы хотите сделать его распределённым. Просто наследуете его от SyncObj (передав ему список серверов, с которыми нужно синхронизироваться) и отмечаете декоратором @replicated все методы, которые изменяют внутреннее состояние класса:

class MyCounter(SyncObj):
    def __init__(self):
        super(MyCounter, self).__init__('serverA:4321', ['serverB:4321', 'serverC:4321'])
        self.__counter = 0
    @replicated
    def incCounter(self):
        self.__counter += 1
    def getCounter(self):
        return self.__counter


PySyncObj автоматически обеспечит репликацию вашего класса между серверами, отказоустойчивость (всё будет работать до тех пор, пока живо больше половины серверов), а также (при необходимости) асинхронный дамп содержимого на диск.
На базе PySyncObj можно строить различные распределенные системы, например распределенный мьютекс, децентрализованные базы данных, биллинговые системы и другие подобные штуки. Все те, где на первом месте стоит надёжность и отказоустойчивость.

Общее описание

Для репликации PySyncObj использует алгоритм Raft. Raft — это простой алгоритм достижения консенсуса в распределённой системе. Raft разрабатывался в качестве более простой замены алгоритма Paxos. Вкратце алгоритм raft работает следующим образом. Среди всех узлов выбирается лидер, который пингует остальные узлы через определенный промежуток времени. Каждый узел выбирает случайный промежуток времени, который он будет ждать получение пинга от лидера. Когда время ожидания заканчивается, а пинг от лидера не пришел — узел считает, что лидер упал и посылает остальным узлам сообщение, в котором говорит, что он сам стал лидером. При удачном стечении обстоятельств на этом всё и заканчивается (остальные узлы соглашаются). А в случае, если два узла захотели стать лидерами одновременно, процедура выбора лидера повторяется (но уже с другими случайными значениями времени ожидания). Подробнее о выборе лидера вы можете узнать посмотрев визуализацию, либо почитав научную статью.

После того как определён лидер, он отвечает за поддержание распределённого журнала. В распределённый журнал пишутся все действия, изменяющие состояние системы. Действие применяется к системе только в том случае, если большинство узлов подтверждает получение записи — это обеспечивает консистетность. Для того чтобы количество записей в распределенном логе не росло до бесконечности, периодически происходит операция под названием log compaction. Текущий лог выкидывается, а вместо него начинает хранится сериализованное состояние системы на текущий момент.

Чтобы не потерять содержимое (например, при выключении вообще всех серверов), его нужно периодически сохранять на диск. Так как количество данных может быть очень большим, содержимое сохраняется асинхронно. Чтобы одновременно иметь возможность работать с данными и параллельно сохранять их же на диск, PySyncObj использует CopyOnWrite через fork процесса. После fork-а процесс родитель и дочерний процесс имеют общую память. Копирование данных осуществляется операционной системой лишь в случае попытки перезаписи этих данных.

PySyncObj реализован целиком на Python (поддерживается Python 2 и Python 3) и не использует каких-либо внешних библиотек. Работа с сетью происходит при помощи select или poll, в зависимости от платформы.

Подробнее
3 года назад
#
Как я программирую на Python

Часто с началом нового проекта программист не в состоянии увидеть полную картину — он не знает с чего начать, где получить информацию, сколько ее получить, при этом есть шанс засесть за документацией надолго пока не пропадет желание что-либо делать. Я относительно часто делаю проекты «для души» в ранее незнакомых областях, например, программировал микроконтроллеры, делал свой segway, проектировал на ПЛИС свой микропроцессор, делал плагины под Counter-Strike, софт к купюроприемникам и другие проекты, в которых на старте был абсолютным нулем.

Использование Python

Одной из последних была задача рендеринга 3д-объектов, которая описана на хабре в статье habrahabr.ru/post/248153. Я решил создать по ней видеоуроки, которые описывают мой подход к решению задачи с нуля. Я попытался описать последовательность моих действий как это было на самом деле, конечно, ускорив некоторые моменты и вырезав места, где я бывало затуплял минут на 20 пока не выяснял где же накосячил.

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

На данный момент я выложил 3 видеоурока, еще 2 уже записаны и монтируются. Гитхаб с уроками github.com/ef-end-y/PythonLessons. Правда, поздно спохватился и начал выкладывать только с 3-го урока.

Парсим obj-файл:



Подробнее
3 года назад
#
Пишем свой канал-бот для Telegram как у Хабра на Python

Недавно ко мне обратился друг с просьбой написать бота, импортирующего новости из RSS-канала на сайте в Telegram-канал. Огромнейшим плюсом данного способа оповещения являются push-уведомления, которые приходят каждому подписанному пользователю на его устройство. Уже давно хотелось заняться чем-то подобным. Недолго думая, в качестве образца я выбрал канал Хабра telegram.me/habr_ru. В качестве языка программирования был выбран Python.

В итоге, мне надо было решить следующие проблемы:

Парсинг RSS.
  • Одним из условий был отложенный постинг сообщений (если после того, как новость была выложена, в течение n часов её скрыли/удалили/переименовали, то она не должна быть опубликована, вместо нее отправляется оповещение о корректной новости)

  • Постинг сообщений в телеграм.

  • Сокращение целевой ссылки с помощью сервиса bit.ly


От себя добавил еще:
  • Ведение логов с помощью библиотеки (logging).

  • Обработка конфига (configparser).


1. Отложенный постинг сообщений

Для решения данной проблемы было принято решение использовать SQLite базу данных. Для работы с БД использовалась библиотека SQLalchemy.

Структура до банального проста — всего одна таблица. Код объекта представлен ниже:

class News(Base):

    __tablename__ = 'news'
   id = Column(Integer, primary_key=True) # Порядковый номер новости
   text = Column(String) # Текст (Заголовок), который будет отправлен в сообщении
   link  = Column(String) # Ссылка на статью на сайте. Так же отправляется в сообщении
   date = Column(Integer)
   # Дата появления новости на сайте. Носит Чисто информационный характер. UNIX_TIME.
   publish = Column(Integer)
   # Планируемая дата публикации. Сообщение будет отправлено НЕ РАНЬШЕ этой даты. UNIX_TIME.
   chat_id = Column(Integer) 
   # Информационный столбец. В данное поле логируется чат, в который было отправлено сообщение
   message_id = Column(Integer) 
   # Информационный столбец. В данный столбец логирует внутренний идентификатор сообщения в канале. 

    def __init__(self, text, link, date, publish=0,chat_id=0,message_id=0):
        self.link = link
        self.text  = text
        self.date = date
        self.publish = publish
        self.chat_id = chat_id
        self.message_id = message_id

    def _keys(self):
        return (self.text, self.link)

    def __eq__(self, other):
        return self._keys() == other._keys()

    def __hash__(self):
        return hash(self._keys())

   def __repr__(self):
        return "<News ('%s','%s', %s)>" % (base64.b64decode(self.text).decode(),\
        base64.b64decode(self.link).decode(),\
        datetime.fromtimestamp(self.publish))
        # Для зрительного восприятия данные декодируются


Для хранения текстовой информации и ссылок использется base64, форматом хранения даты-времени был выбран Unix Timestamp.

Подробнее
4 года назад
#
Python Meetup 27.03.15: machine learning, python AST и статистика игроков World of Tanks

Традиционно в последнюю пятницу месяца состоялся Python Meetup. В мартовском митапе с приглашенными спикерами мы разобрались в следующих темах:
  • Машинное обучение на Python

  • Как устроен Python AST и какие интересные факты есть у диалекта Ну

  • Как при помощи Requests, Asyncio и Aiohttp перестать использовать многопоточный код


Видео и ссылки на презентации смотрите под катом. Приятного просмотра!

Python Meetup

Machine learning with Python / Олег Шидловский
Web developer Doist

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



Читать далее
4 года назад
#
PyOpenGL с шейдерами

habrahabr.ru

PyOpenGL

В предыдущей статье были рассмотрены основы работы с OpenGL в Python. Для вывода графики использовались встроенные функции модуля glut и фиксированный конвейер OpenGL без шейдеров. По просьбе пользователей habrahabr.ru, на базе предыдущего урока был создан шаблон PyOpenGL приложения, использующего шейдеры и буферные объекты.
Роскошной графики, как и в предыдущей статье, ожидать не стоит. Цель данной статьи — продемонстрировать возможность работы с шейдерами и буферными объектами с использованием модуля PyOpenGL.

Итак, для работы нам понадобятся:

  • Интерпретатор языка Python (ссылка).

  • Среда разработки PyCharm (ссылка) (или любая другая на ваш вкус, подойдет даже блокнот).

  • Библиотека PyOpenGL (ссылка).





4 года назад
#
xbmcswift2 — микро-фреймворк для написания плагинов к Kodi (XBMC)

habrahabr.ru

Вступление

Это, так сказать, «бонусная» статья в моей серии статей о плагинах к медиацентру Kodi (XBMC). Прежде всего, необходимо отметить, что, начиная с версии 14.0, популярный медиацентр меняет название с XBMC на Kodi. О причинах смены названия можно почитать на официальном сайте и форуме, и для нашей статьи они не принципиальны. Однако дальше в статье будет использоваться новое название — Kodi.

Предыдущие статьи

Подробная анатомия простого плагина для XBMC
Пишем плагин для XBMC с собственным интерфейсом: часть I — теория и простейший пример
Пишем плагин для XBMC с собственным интерфейсом: часть II — диалоги и украшателства
Пишем плагин для XBMC с собственным интерфейсом: часть III — API и микро-фреймворк

4 года назад
#
Анализ дружеских связей VK с помощью Python

Совсем недавно на Хабре появилась статья о реализации дружеских связей в ВКонтакте с помощью Wolfram Mathematica. Идея мне понравилась, и, естественно, захотелось сделать такой же граф, используя Python и d3. Вот, что из этого получилось.

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

Разобьем задачу по элементам:

  1. Создание и авторизация приложения.

  2. Получение данных.

  3. Визуализация графа.


Что для этого нам понадобится:
  1. Python 3.4

  2. requests

  3. d3

  4. Mozilla FireFox, так как в Chrome нельзя использовать XMLHttpRequest для загрузки локальных файлов (никто не мешает сделать python -m http.server 8000)



16 17 19

Авторизация

Войти с помощью

Пользователи

GeekBrains

КАРКАМ

Нетология