• Как я мониторил Avito по SMS

    Как известно, на «Авито» периодически появляются товары очень хорошего качества и при этом очень дешевые. Но появляются они редко, висят там мало и исчезают быстро.

    Поэтому возникла у меня идея: а не поискать ли сервис, который раз в несколько минут проверяет объявления, и если появилось что-то интересное для меня — оповещает об этом? При этом оповещать лучше всего по смс, а то почту я не всегда проверяю оперативно.

    Гуглинг выдал несколько таких сервисов, «всего» от 3 руб за смс или от 4 руб в сутки.

    В итоге, я решил написать такой сервис самостоятельно, но об этом дальше…
    Читать дальше →
  • JarvisJS: Функциональное тестирование веб-приложений

      Здравствуй Хабр! В этом посте мы хотели бы поздороваться и впервые показать миру наш проект JarvisJS.com — сервис для функционального тестирования веб-приложений. Проект еще совсем молод и с любовью разрабатывается командой из трех человек в течении вот уже семи месяцев.

      Под катом мы расскажем о нашем сервисе и о причинах, побудивших нас на его создание.
      Читать дальше →
    • 5 принципов тестирования мобильных приложений

      Сразу оговорюсь, всё нижеописанное почерпнуто мною исключительно из своего небольшого по объёму затраченного времени (но большого по количеству авралов, злоключений и прочих баттхёртов) опыта. Оговорка номер до: эти принципы применимы только к мобильному ПО. Как там у других — я не знаю и гадать не хочу. И последнее, пожалуй, самое важное. Данные принципы лишь задают направление, а потому будут полезны в основном новичкам (хотя вы, конечно, можете написать о бесполезности сей статьи в комментариях).

      Итак, когда я только начинал заниматься тестированием, прочитал доступную теорию, начальник начал второе собеседование с простого вопроса – в чём особенность мобильного тестирования по отношению к другим видам тестирования? Тогда я лишь приблизительно смог ответить на этот вопрос. Сейчас я выделяю для себя следующие принципы:
      Читать дальше →
      • +11
      • 74.5k
      • 9
    • Получение участников сообщества vk.com за считанные секунды

      • Tutorial
      Ни для кого не секрет, что VK API возвращает за один запрос к методу groups.getMembers не более 1 000 участников. В одну секунду вы можете получить максимум 3 000 участников, так как установлено ограничение на количество запросов в секунду до 3. Эту проблему решает метод execute, с помощью которого вы можете получить более 100 000 участников за одну секунду и до 25 000 участников за один запрос. В этой статье я расскажу Вам, как я это реализовал.
      Читать дальше →
    • Веб-парсинг на Ruby

      image
      Это перевод статьи «Web Scraping with Ruby», которую я нашел полезной при изучении языка программирования Ruby. Парсинг меня интересует в личных целях. Мне кажется, это не только полезный навык, но и хороший способ изучить язык.
      Читать дальше →
    • Webix. Первое знакомство с JavaScript фреймворком

      • Tutorial


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

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

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

      Читать дальше →
    • Регулярные выражения для валидации распространенных видов данных

        Для проверки текстовых полей на валидность обычно используют регулярные выражения. Существует несколько наиболе распространенных видов таких даных, как например номер кредитки, дата в определенном формате и т. д. На сайте html5pattern.com собирается коллекция регулярных выражений для таких данных (там это позиционируется, как возможное содержимое html5-атрибута pattern у inpit-элементов, но эти регулярные выражения можно использовать и для привычной валидации с помощью javascript). Актуальные для российской аудитории примеры, вместе с соответствующими регулярными выражениями вы можете посмотреть под катом.
        Читать дальше →
      • Пишем парсер с помощью XPath и Yii

        Введение

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

        В качестве примера для данной статьи мы будем использовать выданное демо форума XenForo и заранее созданной темой, откуда будем парсить типичные данные: заголовок, время создания и сам текст темы, при этом парсинг будет осуществляться в авторизированном аккаунте форума. Все остальные данные можно будет взять по аналогии.

        Сам парсер реализуем в виде компонента для удобного использования в Yii2.
        Читать дальше →
      • Основы парсинга с помощью Python+lxml

          Добрый день, уважаемые читатели.
          В сегодняшней статье я покажу основы разбора HTML разметки страниц с помощью библиотеки lxml для Python.
          Если вкратце, то lxml это быстрая и гибкая библиотека для обработки разметки XML и HTML на Python. Кроме того, в ней присутствует возможность разложения элементов документа в дерево. В статье я постараюсь показать, насколько просто ее применение на практике.

          Читать дальше →
          • +34
          • 149k
          • 9
        • Постинг в группу картинки с текстом с помощью Вконтакте API

          • Tutorial
          Задача запостить текст с картинкой в группу Вконтакте скриптом на PHP простая, тем более API Вконтакте считается понятным и надёжным. Тем не менее, мне не удалось отыскать в Интернете чёткого пошагового руководства для начинающих, которые содержало бы готовые ответы на все мелкие вопросы, возникающие на пути.
          image

          постим материал в сообщество ВК легко и просто
          • –10
          • 84.2k
          • 19
        • Открытая Yandex PHP Library для работы с API Яндекса

            Привет всем!

            Давненько я не писал на Хабр. Не то что бы мне не о чем было рассказывать, просто если уж и делиться историями, то такими, чтобы зуд появлялся работать до полуночи. Тем более, если они будут о сотрудничестве PHP-разработчиков и Яндекса. Тем более, если они о том, что появилась долгожданная PHP-библиотека для работы с API Яндекса.



            Расскажу-напомню немного о себе. Меня зовут Антон Шевчук. На Хабре я довольно давно, и если вы изучали jQuery, то с большой долей вероятности читали и мой блог. При этом моя основная активность — это всё же PHP-разработка, да и должность обязывает — работаю я техническим экспертом PHP-отдела в компании NIX Solutions.

            Но хватит лирики, я же обещал познавательную историю.
            Читать дальше →
          • Что такое Selenium?

              Время от времени мне приходится распутывать терминологические хитросплетения, связанные с употреблением словосочетаний, в которых встречается слово Selenium – Selenium 2.0, Selenium IDE, Selenium RC, Selenium WebDriver, Selenium Server, Selenium Grid.

              Путаница возникает во многом из-за того, что нигде нет чёткого описания всех этих терминов на одной страничке, и я постараюсь восполнить этот информационный пробел.
              Читать дальше →
            • Dalek.js — простое функциональное тестирование веб-приложений

                Вы знаете, что такое Selenium и/или PhantomJS? И с чем их едят? Тогда, возможно, вам будет интересен проект Dalek.js — кроссбраузерная утилита для тестирования веб-приложений.

                Dalek.js позволяет писать тесты, которые ходят по веб-страничкам, щелкают ссылки, заполняют формы, отправляют данные и делают скриншоты. То же самое и даже больше делают тесты, написанные с использованием Selenium'а или Phantom.js, в чем подвох?

                Читать дальше →
              • Парсим на Python: Pyparsing для новичков

                Парсинг (синтаксический анализ) представляет собой процесс сопоставления последовательности слов или символов — так называемой формальной грамматике. Например, для строчки кода:

                import matplotlib.pyplot  as plt
                

                имеет место следующая грамматика: сначала идёт ключевое слово import, потом название модуля или цепочка имён модулей, разделённых точкой, потом ключевое слово as, а за ним — наше название импортируемому модулю.

                В результате парсинга, например, может быть необходимо прийти к следующему выражению:

                { 'import': [ 'matplotlib', 'pyplot' ], 'as': 'plt' }
                

                Данное выражение представляет собой словарь Python, который имеет два ключа: 'import' и 'as'. Значением для ключа 'import' является список, в котором по порядку перечислены названия импортируемых модулей.

                Для парсинга как правило используют регулярные выражения. Для этого имеется модуль Python под названием re (regular expression — регулярное выражение). Если вам не доводилось работать с регулярными выражениями, их вид может вас испугать. Например, для строки кода 'import matplotlib.pyplot as plt' оно будет иметь вид:

                r'^[ \t]*import +\D+\.\D+ +as \D+'
                

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

                В данной статье мы установим Pyparsing и создадим на нём наш первый парсер.

                Читать дальше →
              • Бенчмарк HTML парсеров

                  Переписывал в островке кусок одного сервиса с Python на Erlang. Сам сервис занимается тем, что скачивает по HTTP значительное количество однотипных HTML страниц и извлекает из них некоторую информацию. Основная CPU нагрузка сервиса приходится на парсинг HTML в DOM дерево.

                  Сперва захотелось сравнить производительность Erlang парсера mochiweb_html с используемым из Python lxml.etree.HTML(). Провел простейший бенчмарк, нужные выводы сделал, а потом подумал что неплохо было бы добавить в бенчмарк ещё парочку-другую парсеров и платформ, оформить покрасивее, опубликовать код и написать статью.
                  На данный момент успел написать бенчмарки на Erlang, Python, PyPy, NodeJS и С в следующих комбинациях:
                  • Erlang — mochiweb_html
                  • CPython — lxml.etree.HTML
                  • CPython — BeautifulSoup 3
                  • CPython — BeautifulSoup 4
                  • CPython — html5lib
                  • PyPy — BeautifulSoup 3
                  • PyPy — BeautifulSoup 4
                  • PyPy — html5lib
                  • Node.JS — cheerio
                  • Node.JS — htmlparser
                  • Node.JS — jsdom
                  • C — libxml2 (скорее для справки)

                  В тесте сравниваются скорость обработки N итераций парсера и пиковое потребление памяти.

                  Интрига: кто быстрее — Python или PyPy? Как сказывается иммутабельность Erlang на скорости парсинга и потреблении памяти? Насколько быстра V8 NodeJS? И как на всё это смотрит код на чистом C.
                  Читать дальше →
                • jQuery изнутри — парсинг html

                  • Tutorial
                  Продолжаем дело первой статьи и пытаемся разобраться с тем, что же делает за нас jQuery, когда мы с помощью этой библиотеки создаем DOM-элементы.

                  В прошлом выпуске мы упомянули, что при передаче в jQuery вместо селектора html-строки, на основе нее функция parseHTML создаст соответствующие элементы и вернет их в привычном jQuery-объекте. Сейчас мы рассмотрим все это более тщательно и затронем кроме core.js еще manipulation.js и attributes.js (мельком).
                  Я клевый, мне интересно!
                • Парсинг HTML в браузерах для смены вёрстки блоков

                    Рассмотрим задачу парсинга HTML на клиенте (Javascript) с последующим оформлением полученных данных стилями и вёрсткой и выводом их в нужные места страницы просмотра. Применение такой подгрузчик страниц и блоков нашёл в юзерскриптах — когда разработчики подгрузчика никак не связаны с разработчиками сайта. Но есть основания использовать подход и для обычных сайтов для полного отделения View от Model.

                    Статья получилась теоретической, потому что из-за её объёма я не стал перегружать её практическими результатами. Да и трудно пока представить некие шаги, по которым каждый мог бы подхватить идеи и начать строить подобное. Вначале надо посеять идеи, но пока попытки посева (здесь, на Хабре) не давали всходов, хотя я и не особо старался в этом направлении. Подход развивался последние полгода и был даже анонсирован на Хабре примерно в апреле-мае. В статье рассказано, «как это сделать», и перечислены преимущества подхода. Он требует глубокого и специфического программирования на JS. По результатам работы, скорее всего, имеет смысл выделить библиотеку для аналогичных задач.
                    Читать дальше →
                    • –3
                    • 9.8k
                    • 2
                  • Плагин для извлечения данных с сайтов

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


                      Читать дальше →
                    • Grab — новый интерфейс для работы с DOM-деревом HTML-документа

                        Исторический экскурс


                        Ранее я уже писал на хабре о Grab — фреймворке для написания парсеров сайтов: раз, два, три, четыре. В двух словах, Grab это удобная оболочка поверх двух библиотек: pycurl для работы с сетью и lxml для разбора HTML-документов.
                        Читать дальше →