Skip to content

MSMikl/wikiparser-test

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Поиск пути между страницами Википедии

Тестовое задание

Задача

Даны две ссылки на страницы в Википедии (язык один).

Вручную между ними можно перейти максимум за три клика через другие страницы Википедии.

Необходимо найти этот путь и вывести в консоль.

Реализация

Алгоритм простой:

  1. Функция follow_link находит все ссылки на страницы Википедии на стартовой странице

  2. По всем найденным ссылкам рекурсивно создаются новые экземпляры функции follow_link.

  3. Рекурсивно повторяется до тех пор, пока не достигнута максималньая глубина поиска (по умолчанию 3) либо пока не найдена искомая ссылка

  4. Для избежания зацикливания просмотренные на предыдущих этапах ссылки сохраняются в множество viewed_links, которое передается новому экземпляру функции. Повторно по этим ссылкам переходы не происходят

  5. Чтобы избежать повторныхх запросов к страницам, уже просмотренным в рамках других потенциальных маршрутов, результаты парсинга сохраняются в глобальный словарь parsed_links. Если какая-то ссылка уже парсилась, то результаты парсинга берутся из словаря.

  6. Поскольку основные затрат времени - это запросы к Википедии, то использован асинхронный фреймворк aiohttp

  7. Поскольку Википедия ограничивает количество одновременных запросов к сайту с одного IP, то для контроля их количества используется система очереди задач. Ограниченное количество воркеров (по умолчанию 30) обрабатывают корутины из асинхронной очереди tasks.

  8. В случае обнаружения искомой ссылки функция устанавливает глобальный флаг stop_flag в положение True, первый обнаруживший его воркер вызывает ошибку asyncio.CanselledError, тем самым прерывая выполнение задач всеми воркерами.

  9. Оставшиеся в очереди невыполненные корутины "подчищаются".

  10. Полученный путь в виде последовательных ссылок обрабатывается при помощи функции get_text_from_page. На каждой странице находится ссылка на следующую и парсится соответствующий контекст.

  11. Настоящий алгоритм корректно обрабатывает ссылки в основном тексте, в дополнительных таблицах, в списке ссылок в "подвале" - выделяется предложение, в котором находится ссылка.

Использование

Для запуска программы необходим Python 3.

Скачайте код на копмьютер, установите зависимости командой

pip install -r requirements.txt

Указать стартовую и конечную ссылки можно в файле config.ini либо в параметрах запуска из командной строки

python3 wiki-parser.py -s {START_URL} -t {TARGET_URL} 

Список просмотренных в ходе поиска страниц сохраняется в файл logs.txt.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages