Есть несколько проблем с вашим кодом.Я пойду через них один за другим.
Проблема: Неверный код на onSuccess
- Вы упомянули
result.result.link
, однако результат имеет links
, поэтому путь должен бытьresult.links
вместо. - Функция карты не использует
link
, вы снова и снова толкаете одни и те же данные в urlsToVisit
Проблема: неверная логика при непрерывном сканировании
У вас есть две части очистки,
- одна должна пройти по целевой странице и собрать ссылки,
- другая должна пройти через собранные ссылки.
Вы должны думать о них отдельно.
Более того, всякий раз, когда вы .queue
, он звонит неумышленно, однако ваш urlsToVisit
еще не завершен.Вероятно, он вообще не содержит никаких данных.
Решение
- Рекурсивно ставит в очередь ссылки.Всякий раз, когда он завершает сканирование, он должен ставить новые ссылки в очередь на сканер.
- Также давайте удостоверимся, что сообщения об ошибках
onError
.
вот рабочий код,
(async () => {
var visitedURLs = [];
const crawler = await HCCrawler.launch({
// Function to be evaluated in browsers
evaluatePage: () => ({
title: $("title").text(),
link: $("a").attr("href"),
linkslen: $("a").length
}),
// Function to be called with evaluated results from browsers
onSuccess: async result => {
// save them as wish
visitedURLs.push(result.options.url);
// show some progress
console.log(visitedURLs.length, result.options.url);
// queue new links one by one asynchronously
for (const link of result.links) {
await crawler.queue({ url: link, maxDepth: 0 });
}
},
// catch all errors
onError: error => {
console.log(error);
}
});
await crawler.queue({ url: "http://books.toscrape.com", maxDepth: 0 });
await crawler.onIdle(); // Resolved when no queue is left
await crawler.close(); // Close the crawler
})();
Проблема: Это решение не решаетмоя проблема
Вы быстро поймете, что вы не очищаете links
, которое вы чистили, оно сканировало все, используя свой собственный метод.
Вот почему пакет имеет опцию maxDepth
.Так что он может пройти через весь сайт сам по себе без рекурсивной функции.Прочитайте их документ, постарайтесь понять это постепенно.
Самое главное, Вы должны разбить свой код на несколько частей и решить одну проблему за один раз.
Не стесняйтесь исследовать другие варианты документа.