TechCave

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

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

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

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

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

Стена группы

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

Python, BeautifulSoup парсинг + скачивание картинок с сервиса wallheaven.cc


2 года назад
#

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


Все началось со статьи, в которой рассказывалось о построении социальных графов с помощью Wolfram Mathematica. Тогда не смог пройти мимо, и мой доклад будет о том, как все это сделать на любимом Python.

2 года назад
#

Создаем бота для Skype. Шаг за шагом, через REST API и на Python


Головоломка
Когда ищешь long-polling в Skype API

Год назад Microsoft представила платформу для создания ботов под Skype. Платформа предоставляет удобный формат сообщений, можно отправлять карточки с кнопками, как в телеграмме, одним словом, выглядит все очень круто.

Недавно мне потребовалось написать бота для Skype. И несмотря на то, что тема подымалась на хабре ( например), я столкнулся с некоторыми сложностями, мне очень не хватало step-by-step гайда по работе с REST API.

На самом деле, бот для скайпа пишется довольно быстро, если знать о подводных камнях и знать где смотреть документацию. Основная идея, которую мне пришлось усвоить: Нет веб поллинга. Если Телеграмм на выбор предоставляет лонг-поллинг и вебхуки, то скайп обходится только вебхуками. Из этого вытекают следующие проблемы – общение с серверами скайпа происходят только по https, и только при наличии валидного сертификата. Придется находить доменное имя, хостинг, заморачиваться с сертификатом.

Как это сделать?

Итак, с самого начала. Допустим, что у нас есть голый хостинг ( у меня это был Raspberry Pi, на котором я тестировал бота, но это может быть и сервер на амазоне, например ). Для начала, нужно получить доменное имя и сертификат на него. Бесплатные доменные имена можно получить например здесь. Далее нам нужно получить сертификат на это имя. Это легче всего сделать с помощью Let’s Encrypt. В процессе установки сертификата выбираем опцию standalone server – certbot запустит свой сервер, чтобы проверить, что именно вы владеете этим доменным именем перед тем как выдавать сертификат на него. После того, как у вас все получилось, у вас должны быть сертификаты в папке “/etc/letsencrypt/archive”.

Теперь, когда все подготовлено к работе, начнем писать бота.

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

Об интеграции Python 3 в редактор Sublime Text


2 года назад
#

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


Введение

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

Задача

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

Решение

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

Подробнее
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')

Подробнее
2 года назад
#
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-файл:



Подробнее
15 16 18

Авторизация

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

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

GeekBrains

КАРКАМ

Нетология