Михаил Юдин

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

Выключите пожалуйста блокировку рекламы для этого сайта чтобы поддержать проект

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

Что такое Parsee

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

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

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

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

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

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

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

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

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

for page in parser / '.links [email protected]':
    for p in page / 'h3:-soup-contains("Some title")+p':
        print(p.text)

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

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

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

./parser.py http://site.org '[email protected]@title'

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

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

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

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

./parser.py http://site.org '[email protected]@title%.text.strip()'

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

Итоги

Проект Parsee на GitHub.

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

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

Поддержать




Выключите пожалуйста блокировку рекламы для этого сайта чтобы поддержать проект

Чтобы не пропускать новости, можно подписаться на email рассылку.


Остались вопросы или есть пожелания, замечания — пишите в комментарии:

Ещё почитать

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

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

Переход с 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 и внешние ссылки