网络爬行有广度但没有深度



我正在使用java和jsoup制作我的第一个网络爬虫。我找到了一段有效的代码,但不是我想要的。问题是它关注的是链接的深度,但我想抓取页面的广度。花一些时间尝试重新编写注重广度的代码,但从第一个环节开始还是太深入了。有什么关于我如何进行广度爬行的想法吗?

public class WebCrawlerWithDepth {
private static final int MAX_DEPTH = 4;
private HashSet<String> links;
public WebCrawlerWithDepth() {
links = new HashSet<>();
}
public void getPageLinks(String URL, int depth) {
if ((!links.contains(URL) && (depth < MAX_DEPTH))) {
System.out.println("Depth: " + depth + " " + URL);
links.add(URL);
Document document = Jsoup.connect(URL).get();
Elements linksOnPage = document.select("a[href]");
depth++;
for (Element page : linksOnPage) {
getPageLinks(page.attr("abs:href"), depth);
}
}
}

基本上与算法编码中从深度优先到广度优先的方式相同,您需要一个队列。

将提取的每个链接添加到队列中,并从该队列中检索要爬网的新页面。

这是我对你的代码的看法:

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;
}
}
}

您不需要直接迭代当前页面中的链接,而是需要将它们存储在Queue中。这应该存储所有页面中要访问的所有链接。然后,您将从Queue获得下一个要访问的链接。

最新更新