Реализовать краулера с использованием шаблона producer-consumer.
Краулер — программа, предназначенная для обхода страниц Интернета с целью получения из них необходимой информации.
- Программе на вход подаются следующие аргументы:
- адрес HTML страницы
--url
; - глубина поиска по странице
--depth
; - количество потоков для скачивания страниц
--network_threads
; - количество потоков для обработки страниц
--parser_threads
; - путь до выходного файла
--output
.
- адрес HTML страницы
- Программа должна рекурсивно обойти все ссылки встречающиеся на странице. Начальная страница обхода передается аргументом командной строки
url
. Глубина обхода равнаdepth
. - Программа должна записать в выходной файл
output
все ссылки на изображения, которые встречаются при обходе страниц. - Необходимо использовать шаблон producer-consumer. Количество
producer
задается аргументом командной строкиnetwork_threads
, а количествоconsumer
- аргументомparser_threads
. - Для процессинга страниц необходимо использовать gumbo-parser.
- Для скачивания HTML страниц необходимо использовать Boost::Beast.
- Для обработки параметров командной строки необходимо использовать компонент
boost::program_options
.
Шаблон "producer-consumer" устроен по следующей схеме:
Этот шаблон часто применяется в высоконагруженных системах, распределенных вычислениях. Почти всегда можно абстрагировать задачу и выделить в ней части, которые делают некоторый препроцессинг, и части, которые занимаются окончательной обработкой данных на основе этого препроцессинга. Этот шаблон - это обобщение принципа подобного разделения.
Producer, или "поставщик", — это некоторый поток, который генерирует "задания" и складывает их в очередь.
Consumer, или "потребитель", — это поток, который обрабатывает "задачи" из очереди.
В качестве задачи может выступать любая сущность, требующая дополнительной обработки. В текущем случае, это HTML страница.
- Используйте пул потоков. Например, ThreadPool.
- Все необходимые примеры по работе с gumbo-parser есть по ссылке.
- При решении задачи следует использовать шаблон procuder-consumer два раза, по следующей схеме: