Web Crawler

Crawl — по-английски ползать. Web Crawler — это штука, которая ползает по вебу и собирает информмацию о сайтах.

Например, там работали примитивные поисковые ситемы в конце девяностых. Поисковая система периодически обходит интернет и сканирует страницы. Если на странице есть ссылки, то она идет по этим ссылкам и делает то же самое.

Вам необходимо реализовать функцию crawl, которая будет обходить интернет.

Что принимает функция

  • startUrls — массив со строками, с которых мы начинаем обход
  • fetchUrl — асинхронная функция, которая принимает строку и возвращает промис с объектом с двумя полями:
    • content — строка содержимое текстовое страницы
    • urls — массив со строками, адреса, по которым нам нужно идти дальше
  • limit — число, fetchUrl максимально может быть запущена столько раз одновременно
  • callback — функция, которая должна быть вызвана после того, как мы обойдем все страницы в интрнете
    • колбэк вызывается c объектом, где ключами являются обойденные url, а значениями — content из результатов функции fetchUrl.

Пример

const mockData = { "A": { content: "AAA", urls: ["B", "C"] }, "B": { content: "BBB", urls: ["A"] }, "C": { content: "CCC", urls: ["B", "D"] }, "D": { content: "DDD", urls: [] }, "E": { content: "EEE", urls: ["A"] }, }; const fetcher = (url) => new Promise(resolve => mockData[url], 100); mockData(["A", "B", "E"], fetcher, 2, (map) => { console.log(map); // map === { "A": "AAA", "B": "BBB", "C": "CCC", "D": "DDD", "E": "EEE" } });

Дополнительные требования

  1. Мы считаем, что контент на страницах никогда не меняется, поэтому нужно кэшировать результаты. Если мы ранее вызывали функцию fetchUrl с каким-то адресом, то нельзя вызываеть ее повторно

  2. Не должно быть «простоя». Если один из вызовов fetchUrl завершил работу, мы должны сразу запустить следующий, если есть что загружать.