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