По сути, так же, как вы от глубины до ширины в алгоритми c кодировании, вам нужна очередь.
Добавьте каждую ссылку, которую вы извлекли, в очередь и извлекайте новые страницы в сканироваться из этой очереди.
Вот мой вариант вашего кода:
public class WebCrawlerWithDepth {
private static final int MAX_DEPTH = 4;
private Set<String> visitedLinks;
private Queue<Link> remainingLinks;
public WebCrawlerWithDepth() {
visitedLinks = new HashSet<>();
remainingLinks = new LinkedList<>();
}
public void getPageLinks(String url, int depth) throws IOException {
remainingLinks.add(new Link(url, 0));
int maxDepth = Math.max(1, Math.min(depth, MAX_DEPTH));
processLinks(maxDepth);
}
private void processLinks(final int maxDepth) throws IOException {
while (!remainingLinks.isEmpty()) {
Link link = remainingLinks.poll();
int depth = link.level;
if (depth < maxDepth) {
Document document = Jsoup.connect(link.url).get();
Elements linksOnPage = document.select("a[href]");
for (Element page : linksOnPage) {
String href = page.attr("href");
if (visitedLinks.add(href)) {
remainingLinks.offer(new Link(href, depth + 1));
}
}
}
}
}
static class Link {
final String url;
final int level;
Link(final String url, final int level) {
this.url = url;
this.level = level;
}
}
}