Михаил Юдин

Parsee - простой вкусный парсер сайтов

Если лень писать кучу кода, разбираться в написании парсеров, а нужно лишь получить например фото и заголовки страниц, пользуйте Parsee!

Что такое Parsee

Parsee это в первую очередь парсер страниц. Пишешь ему путь к нужному контенту, он его достаёт.

Предпосылки создания

Многие наверное пользуются Scrapy, Selenium и другими библиотеками или фреймворками для парсинга сайтов. Я пошёл сразу этим путём, когда встала задача найти где-нибудь логотипов.

В Scrapy например создаёшь проект, потом паучка (всё в 2 шага на автомате), потом пишешь логику парсинга. Один паучок, второй, третий… А ещё разбираться как парсить разнородные куски, понимать как это всё сливается в единое целое… Как-то долго и непродуктивно получалось.

Перешёл на чистый requests + beautifulsoup4. Почти то же самое, только лишаемся многопоточности (писать каждый раз тоже время). Ещё эти повторяющиеся куски кода для обхода дерева…

И тут я подумал: есть же селекторы, неужели нельзя просто сказать “найди это там-то” и всё. Так заложилось начало проекта Parsee.

Этапы создания

Сперва шёл по пути упрощения реализации простых действий, например обход узлов.

Получилось такое (собачка появилась позже):

for page in parser / '.links a@':
    for p in page / 'h3:-soup-contains("Some title")+p':
        print(p.text)

Потом понял, что и переход по страницам можно делать проще. И тут решил пойти по пути расширения синтаксиса селекторов.

Значок собачки “@” был выбран потому что в селекторах beautifulsoup4 этого нет, а сам значок чем-то напоминает портал =)

Затем понял, что можно весь обход записать в одну строку. Получилось следующее:

./parser.py http://site.org 'a@a@title'

Было неплохо, но на этом этапе произошло 2 плохие вещи:

  • потерял возможность получать несколько элементов
  • для получения содержимого нужно было продолжать кодить =)

В голову пришла идея, как сделать форматирование вывода. За пример взял утилиту jq. Она позволяет трансформировать JSON в разные форматы. Для Parsee в качестве разделителя выбрал знак процента. Его логический смысл с натяжкой: взять часть, преобразовать.

И тут понеслось: после процента творил что хотел. В итоге получилась поддержка python кода для конечных узлов.

./parser.py http://site.org 'a@a@title%.text.strip()'

Точка это конечный узел DOM дерева.

Итоги

Проект Parsee на GitHub.

Пока на будущее стоят такие задачи:

  • многопоточный обход страниц
  • обращение к узлам предыдущих страниц для их вывода
  • поддержка JavaScript

Ещё почитать

Чеклист оптимизации скорости загрузки веб-приложения ✓

Чеклист оптимизации скорости загрузки веб-приложения ✓

Переход с PHPStorm или Intellij IDEA на VIM

Переход с PHPStorm или Intellij IDEA на VIM

Подсветка активных ссылок на чистом JavaScript

Подсветка активных ссылок на чистом JavaScript

Рендер текстовых шаблонов по данным из массива PHP

Рендер текстовых шаблонов по данным из массива PHP

Битва титанов: normalize.css против reset.css

Битва титанов: normalize.css против reset.css

CSS ищет баги в SEO: картинки без alt и внешние ссылки

CSS ищет баги в SEO: картинки без alt и внешние ссылки