Реализовать сервис, который обходит произвольный сайт с глубиной до depth (2-10, задается аргументом depth) и сохраняет html
, url
и title
страницы в хранилище.
Примеры сайтов:
https://ria.ru
http://www.vesti.ru
http://echo.msk.ru
http://tass.ru/ural
https://lenta.ru
- и любой другой, на котором есть ссылки
Оптимизировать прогрузку по потреблению памяти и по времени. Замерить время выполнения и потребление памяти загрузки.
При depth=0 необходимо сохранить html, title, url исходного веб-сайта.
На каждом depth=i+1 качаем страницы ссылок с i страницы (то есть глубина 2 это - главная, ссылки на главной и ссылки на страницах ссылок с главной).
- По URL сайта и глубине обхода загружаются данные.
- По URL сайта из хранилища можно получить
n
прогруженных страниц (url
иtitle
).
Пример:
spider.py load http://www.vesti.ru/ --depth 2
>> ok, execution time: 10s, peak memory usage: 100 Mb
spider.py get http://www.vesti.ru/ -n 2
>> http://www.vesti.ru/news/: "Вести.Ru: новости, видео и фото дня"
>> http://www.vestifinance.ru/: "Вести Экономика: Главные события российской и мировой экономики, деловые новости, фондовый рынок"
- Язык реализации
python3.7+
- Использование классов, ООП
- Выбор хранилища произвольный (
PostgreSQL
/Redis
/ElasticSearch
и любой другой на ваш выбор) - Стек технологий произвольный
- Выбор библиотек произвольный
- Решение оформить как проект на любом git-сервисе
- Описать в
README.md
установку, запуск, python и другие зависимости для запуска
- Использование асинхронности/параллельности
- Использование алгоритмов и структуры данных, оптимально подходящих под данное задание так и на уровне Python, так и в БД
- Оптимизация полученного решения по скорости/памяти
- Docker multistage build
- Написать тесты при помощи
pytest
/unittest
и любой другой на ваш выбор
Приоритет факторов при оценивании решения:
- Оптимальность, надежность и отказоустройчивость
- Архитектура полученного решения
- Скорость решения поставленной задачи (сколько часов, дней, недель понадобилось для разработчику)
- Качество и чистота предоставляемого кода на
python
- Количество решенных доп. задачи (из раздела с плюсом)
Для выполнения задания лучше всего использовать данный репозиторий как шаблон, для чего просто перейдите по этой ссылке.
Данный репозиторий уже содержит Dockerfile
, docker-compose.yml
и Makefile
для быстрого запуска приложения силами docker
(нет необходимости устанавливать python и пр. локально). Всё, что необходимо - это установленные локально docker
и docker-compose
. После клонирования репозитория просто выполните docker-compose up -d
и/или натравите PyCharm на docker-compose
- и можно приступать к написанию полезного кода.
-
Ссылку на репозиторий с вашей реализацией необходимо отправить нашему HR или TeamLead, от которого вы получили ссылку на данный репозиторий.
-
Приложение должно успешно запускаться после выполнения:
$ git clone ...
$ make build
$ docker-compose up -d
$ docker-compose run --rm app ./app
- Проходить все тесты (при их наличии).
Если для запуска приожения потребуется другой набор команд - обязательно отразите это в файле
README.md
вашего репозитория.
Если в процессе выполнения у вас возникнут какие-либо неразрешимые вопросы - создайте соответствующий issue в данном репозитории. На вопросы касательно деталей реализации ("А лучше так и так?") - вероятнее всего вы получите ответ "Как вы посчитаете правильнее".