Тестовое задание
Даны две ссылки на страницы в Википедии (язык один).
Вручную между ними можно перейти максимум за три клика через другие страницы Википедии.
Необходимо найти этот путь и вывести в консоль.
Алгоритм простой:
-
Функция
follow_linkнаходит все ссылки на страницы Википедии на стартовой странице -
По всем найденным ссылкам рекурсивно создаются новые экземпляры функции
follow_link. -
Рекурсивно повторяется до тех пор, пока не достигнута максималньая глубина поиска (по умолчанию 3) либо пока не найдена искомая ссылка
-
Для избежания зацикливания просмотренные на предыдущих этапах ссылки сохраняются в множество
viewed_links, которое передается новому экземпляру функции. Повторно по этим ссылкам переходы не происходят -
Чтобы избежать повторныхх запросов к страницам, уже просмотренным в рамках других потенциальных маршрутов, результаты парсинга сохраняются в глобальный словарь
parsed_links. Если какая-то ссылка уже парсилась, то результаты парсинга берутся из словаря. -
Поскольку основные затрат времени - это запросы к Википедии, то использован асинхронный фреймворк
aiohttp -
Поскольку Википедия ограничивает количество одновременных запросов к сайту с одного IP, то для контроля их количества используется система очереди задач. Ограниченное количество воркеров (по умолчанию 30) обрабатывают корутины из асинхронной очереди
tasks. -
В случае обнаружения искомой ссылки функция устанавливает глобальный флаг
stop_flagв положениеTrue, первый обнаруживший его воркер вызывает ошибкуasyncio.CanselledError, тем самым прерывая выполнение задач всеми воркерами. -
Оставшиеся в очереди невыполненные корутины "подчищаются".
-
Полученный путь в виде последовательных ссылок обрабатывается при помощи функции
get_text_from_page. На каждой странице находится ссылка на следующую и парсится соответствующий контекст. -
Настоящий алгоритм корректно обрабатывает ссылки в основном тексте, в дополнительных таблицах, в списке ссылок в "подвале" - выделяется предложение, в котором находится ссылка.
Для запуска программы необходим Python 3.
Скачайте код на копмьютер, установите зависимости командой
pip install -r requirements.txt
Указать стартовую и конечную ссылки можно в файле config.ini либо в параметрах запуска из командной строки
python3 wiki-parser.py -s {START_URL} -t {TARGET_URL}
Список просмотренных в ходе поиска страниц сохраняется в файл logs.txt.