• Как использовать Python для «выпаса» ваших неструктурированных данных

    • Перевод
    Здравствуйте, уважаемые читатели.

    В последнее время мы прорабатываем самые разные темы, связанные с языком Python, в том числе, проблемы извлечения и анализа данных. Например, нас заинтересовала книга «Data Wrangling with Python: Tips and Tools to Make Your Life Easier»:



    Поэтому если вы еще не знаете, что такое скрепинг, извлечение неструктурированных данных, и как привести хаос в порядок, предлагаем почитать перевод интересной статьи Пита Тамисина (Pete Tamisin), рассказывающего, как это делается на Python. Поскольку статья открывает целую серию постов автора, а мы решили пока ограничиться только ею, текст немного сокращен.

    Если кто-то сам мечтает подготовить и издать книгу на эту тему — пишите, обсудим.
    Читать дальше →
  • Знакомство с Go — пишем граббер веб страниц с многопоточностью и блудницами

    Про язык Go от команды Google слышали, наверное, все. А вот пробовали далеко не все, и очень зря — общение с сусликами Go это море удовольствия, в чем я недавно убедился на собственном опыте.
    Начинать знакомство с новым языком забавнее всего на жизненном примере, поэтому я, не долго думая, взял первую попавшуюся задачу “из жизни, самой первостепенной важности”:

    Есть в интернете сайт http://vpustotu.ru на котором любой желающий может анонимно высказаться о наболевшем. Все высказывания (в дальнейшем буду называть их “цитатами”) сначала попадают в модерацию (аналог “бездны” башорга), где посетители могут оценить полет мысли и проголосовать за цитату в стиле “Ого!” или “Ерунда!”. На странице модерации (http://vpustotu.ru/moderation/) нам показывают случайную цитату, ссылки голосования и ссылку “Еще”, которая ведет на эту же страницу. Пощелкайте, это все очень просто.

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

    В разделе модерации нет прямых ссылок на определенную цитату, единственный способ получить новую цитату – обновить страницу (или перейти по ссылке “еще”, что одно и тоже). Причем вполне возможны повторы, что легко обнаруживается после пары минут агрессивного кликинга.

    Таким образом нужна программа, которая:

    • Должна последовательно обновлять и парсить (разбирать) страницу, записывая цитату.
    • Должна уметь отбрасывать дубликаты.


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

    • Должна останавливаться не только по команде, но и по достижению определенного числа “повторов”, например 500!
    • Так как это, скорее всего, займет некоторое время: необходимо уметь продолжить “с места на котором остановились” после закрытия.
    • Ну и раз уж все-таки это надолго – пусть делает свое грязное дело в несколько потоков. Хорошо-бы в целых 4 потока (или даже 5!).
    • И отчитывается об успехах в консоль каждые, скажем, 10 секунд.
    • А все эти параметры пускай принимает из аргументов командной строки!


    Ну, вроде все понятно. Пусть программа ведет два файла – с цитатами и с некими хешами этих цитат, чтобы не повторяться, и перечитывает файл в начале каждого запуска. Ну а дальше в цикле разбирает страницу, выдергивая все новые и новые откровения, пока не получит ctrl-c по лбу или же не встретит определенное количество повторов. Задача ясна, план есть – поехали!
    Читать дальше →
  • Grab — python библиотека для парсинга сайтов

      Лет пять-шесть назад, когда я ещё программировал преимущественно на PHP, я начал использовать библиотеку curl для парсинга сайтов. Мне нужен был инструмент, который позволял эмулировать сессию пользователя на сайте, отсылать заголовки обычного браузера, давать удобный способ отсылки POST-запросов. Сначала я пытался использовать напрямую curl-расширение, но его интерфейс оказался очень неудобным и я написал обёртку с более простым интерфейсом. Время шло, я пересел на python и столкнулся с таким же дубовым API curl-расширения. Пришлось переписать обёртку на python.
      Читать дальше →
    • Делаем PDF-книгу из веб-комикса при помощи C# на примере xkcd

      Sony PRS-650 и xkcdРассматривая новый выпуск xkcd, я взглянул на свою свежеприобретённую электрокнигу Sony PRS-650, и немедленно подумал — хочу смотреть комиксы на ней! Xkcd как раз чёрно-белые и, обычно, небольшие по размеру. Слегка погуглив, нашел лишь сборник картинок на TPB, и скрипт на bash, который должен делать PDF. Решил слегка поразмяться в программировании и сделать граббер комиксов на любимом C#.

      Можно было бы обойтись консольным приложением, но, для наглядности, сделал простой интерфейс на WPF.

      Увидеть код и результат
    • Извлечение данных или знаний?

        Приветствую!

        Стало любопытно, насколько представлена тема Data Mining на хабре. Увидел лишь одну статью, посвященную данной тематике. Хочу сделать свой небольшой вклад в развитие данной темы.

        Исторически сложилось, что у термина Data Mining есть несколько вариантов перевода:
        • извлечение данных
        • извлечение знаний, интеллектуальный анализ данных

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

        Извлечение данных


        Извлечение данных — это процесс нахождения, сбора информации, а также сохранения (конвертация) их в разных форматах. По простому, программы для извлечения данных называют парсерами (parser), граберами (grabber), спайдерами (spider), кроулерами (crawler) и т.д. Фактически, такие программы существенно облегчают всем жизнь, так как позволяют систематизировать данные (именно данные, а не знания!). Такие программы могут собирать адреса компаний в вашей отрасли, ссылки из нужных форумов, парсить целые каталоги, также могут служить отличным средством для составления баз данных.

        Читать дальше →
      • Watir: простой парсинг сложных сайтов

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

          Грубо говоря, проблема в том, что в браузере работает javascript, а на сервере его нет. Нужно либо писать интерпретатор js на одном из серверных языков (jParser и jTokenizer), либо ставить на сервер браузер, посылать в него запросы и вытаскивать итоговое dom-дерево.

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

          Сейчас появились более продвинутые средства — xulrunner (crowbar) и watir. Первый — безголовый firefox. У crowbar есть даже ff-плагин для визуального выделения нужных данных, который генерит специальный парсер-js-код, однако там не поддерживаются cookies, а допиливать неохота. Watir позиционируется разработчиками как средство отладки, но мы будем его использовать по прямому назначению и в качестве примера вытащим какие-нибудь данные с сайта travelocity.com.

          Читать дальше →
        • Покорим Ruby вместе! Капля двенадцатая

            Настало время писать на Руби что-то пригодное для использования ;) Сегодня мы научимся выдирать нужную нам информацию из web-страниц с помощью Руби на примере Хабра. Начнем с кармы.

            open-uri


            Давайте каждый откроет свою персональный Хаброцентр (ну или чужой, если все еще не обзавелись инвайтом ;) с адресом вида %username.habrahabr.ru. Наша задача – извлечь из полутысячи строк HTML-кода значение нашей кармы. Предполагаем, что для этого нам необходимо сохранить код страницы в файл, открыть и прочитать его и, используя регулярные выражения, получить необходимую информацию.

            Библиотека open-uri сделает первую часть работы за нас. После включения ее в программу становится доступен метод open, который позволяет открывать как локальные файлы, так и URL:
            Едем дальше
          • Парсер на shell с обходом XOR-шифрования при аутентификации

            Недавно возникла необходимость в парсере интернет-счета банковской карты для дальнейшего уведомления об операциях посредством смс\e-mail. Сделать это было решено по-быстрому шел-скриптом, который будет парсить страницу со счетом с определенной периодичностью при помощи задания в cron, а в случае изменения баланса счета — высылать сообщение на мобильный телефон или e-mail. Ничего сложного на первый взгляд, однако в ходе написания пришлось решить некоторые сложности, о которых вы сможете прочесть под катом.

            Читать дальше →
          • Web Scraping с помощью python

              Введение


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

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

              • Перевод

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


              История


              Новые добавления в язык называются ECMAScript 6. Или ES6 или ES2015+.


              С момента появления в 1995, JavaScript развивался медленно. Новые возможности добавлялись каждые несколько лет. ECMAScript появился в 1997, его целью было направить развитие JavaScript в нужное русло. Выходили новые версии – ES3, ES5, ES6 и так далее.



              Как видите, между версиями ES3, ES5 и ES6 есть пропуски длиной в 10 и 6 лет. Новая модель – делать маленькие изменения каждый год. Вместо того, чтобы накопить огромное количество изменений и выпустить их все за раз, как это было с ES6.

              Читать дальше →