Хорошо, я постараюсь указать вам правильное направление.Концептуально, веб-сканер довольно прост.Он вращается вокруг структуры данных очереди FIFO, в которой хранятся ожидающие URL-адреса.C ++ имеет встроенную структуру очереди в стандартной библиотеке std::queue
, которую можно использовать для хранения URL-адресов в виде строк.
Базовый алгоритм довольно прост:
- Начните с выбранного базового URL-адреса и поместите его в начало своей очереди
- Вставьте URL-адрес вверхнюю часть очереди и загрузите ее
- Разберите загруженный файл HTML и извлеките все ссылки
- Вставьте каждую извлеченную ссылку в очередь
- Перейдите к шагу 2 или остановитесь, как только выдостигнуть определенного предела
Теперь я сказал, что веб-сканер концептуально простой, но реализовать его не так просто.Как видно из приведенного выше алгоритма, вам понадобится: сетевая библиотека HTTP, позволяющая загружать URL-адреса, и хороший анализатор HTML, который позволит вам извлекать ссылки.Вы упомянули, что можете использовать wget
для загрузки страниц.Это несколько упрощает ситуацию, но вам все равно нужно проанализировать загруженные документы HTML.Правильный разбор HTML - нетривиальная задача.Простой поиск по строке <a href=
будет работать только иногда.Однако, если это просто игрушечная программа, которую вы используете для ознакомления с C ++, для ваших целей может быть достаточно простого поиска строк.В противном случае вам нужно использовать серьезную HTML-библиотеку.
При написании веб-сканера необходимо учитывать и другие факторы, такие как вежливость. Люди будут раздражены и, возможно, забанят ваш IP, если вы попытаетесь загрузить слишком много страниц,слишком быстро, с того же хоста.Таким образом, вам может потребоваться реализовать какую-то политику, при которой ваш веб-сканер ждет короткий период перед загрузкой каждого сайта.Вам также нужен какой-то механизм, чтобы избежать повторной загрузки того же URL-адреса, подчиняться протоколу исключения роботов , избегать ловушек для гусеничных устройств и т. Д. ... Все эти сведения складываются, чтобы сделать реализацию надежного веб-сканера не такой простой вещью.
Тем не менее, я согласен с Ларсманами в комментариях.Веб-сканер не лучший способ изучения C ++.Кроме того, C ++ - не лучший язык для написания веб-сканера. Необработанный и низкоуровневый доступ, который вы получаете в C ++, бесполезен при написании такой программы, как веб-сканер, который проводит большую часть своего времени в ожидании разрешения URL-адресов искачать.На мой взгляд, для этой задачи лучше подходит язык сценариев более высокого уровня, например Python или что-то еще.