Введение/Про парсер
В этой статье я приведу пример самого простого парсера на питоне. Объясню как он работает, как устроен, как использовать и как подогнать под себя. Данный парсер идеально подойдёт для любого статического сайта. Плюс как бонус, покажу как можно написать точно такой же парсер, но без использования внешних библиотек.
Так как, разрешения парсить чужие сайты я пока не получил, решил показать на примере своего. Будем парсить "страницу о сайте", а именно ссылки.
Создание парсера
Настраиваем и подготавливаем виртуальное окружение
Начнём пожалуй с установки необходимых пакетов и их импорта. Конечно, можно обойтись и без библиотек вообще. Но это долго и требует гораздо больше кода и контроля. Лучше не изобретать колесо и использовать готовые решения. Нам потребуются всего 3 пакета:
- requests - Для отправки запросов на целевой сайт и получение веб-страниц
- beautifulsoup4 - Для самого скрейпинга. Нахождение необходимых элементов и извлечение от туда необходимые данные
- lxml - beautifulsop4 сам по себе не может работать с html или xml файлами, поэтому ему нужна помощь в виде, такой вот библиотеки
Дальше создаём директорию для проекта, добавляем виртуальное окружение, устанавливаем вышеперечисленные пакеты и создаём основной файл скрипта:
Для Linux/Unix(Bash) систем
Для Windows(PowerShell) систем
База и виртуальное окружение готово, теперь можно непосредственно перейти к самому скрипту - main.py
Создание парсера на python
Я люблю начинать делать парсеры с импорта всех его зависимостей/библиотек, определением констант/целевых адресов сайта и создании базовой структуры из функций.
В самый конец файла добавь точку входа программы. Данная строчка говорит о том, что при запуске данного файла через интерпретатор python, она выполнит основную функцию run.
Дальше нам потребуется функция самого скрапинга. Непосредственно в нем мы и указываем, при помощи чего парсим, как парсим и что парсим. Создаётся суп ...
В этом "супе" мы находим все ссылки и извлекаем из их данные, сохранённые в href атрибуте. Создаётся список, который потом можно будет использовать как угодно, например для обхода новонайденных страниц. Давай же обличим все эти буковы в код:
Всё вместе это будет выглядеть вот так:
Это для тех, кто просто хочет всё скопировать
Вот так вот выглядит самый простой парсер статических сайтов и страниц. Результат работы парсера должен выглядеть как-то так:

Но если у сайта будет маломальская защита в виде ограничения по количеству или скорости отправляемых запросов, или блокировки по IP, или если данный сайт динамический - данный парсер не сработает. В таком случае придётся писать специальные парсеры динамических сайтов - о них я писал в отдельной статье.
Парсер на python без зависимостей (опционально)
Данная глава является аналогом предыдущей главы, с той лишь разницей, что я не буду использовать никакие внешние зависимости и использовать только встроенные инструменты python. И, чтобы повторить функционал предыдущего парсера, нам потребуется реализовать следующие замены:
- Библиотека requests - делать запросы и получать исходники страниц
- Библиотека beautifulsoup4 - парсить необходимые данные
Наш шаблонный скрипт будет выглядеть вот так (это ещё без логики запросов и парсинга данных):
Я сделал импорт некоторых функций и классов из стандартной библиотеки. Так, из библиотеки urllib мне нужна функция urlopen и класс Request, а из библиотеки html мне нужен шаблонный парсер HTMLParser.
Это на самом деле всё что нам нужно и мы готовы написать обновлённый парсер:
Функция urlopen работает так же как и обычный open для файлов, то есть создаёт специальный контекстный менеджер который можно потом использовать. Кстати, можно и не создавать объект request, класса Request, а просто отправить ссылку, но так мне кажется будет более наглядно, что мы делаем.
После того как был получен ответ, мы его сохраняем как строку и передаём кастомному парсеру SimpleHTMLParser. Который в свою очередь обрабатывает полученную страницу так, как мы его настроили. По мне вышло даже проще в сравнении с использованием внешних библиотек.
Заключение
Данные парсеры очень просты в своём исполнении, и идеально подойдут для парсинга любых статических сайтов, с учётом того, что их ещё нужно подогнать под свои задачи для конкретного сайта.
Хоть и 2й парсер и кажется проще в написании, по крайней мере мне, я рекомендую использовать именно первый вариант. Он будет быстрее и надёжнее ведь если взять тот же lxml парсер, он написан на С, и им занимались довольно долго, а значит и ошибок почти не должно быть.
Но в любом случае надеюсь данная статья была тебе полезна.