0

好的,所以我开始 Bing 搜索,然后检索几个结果 url,并使用它们作为起点来遍历其他页面,解析它们的链接并将它们添加到列表中。

我遇到的问题是,我不想访问同一个域两次。我可以阻止它访问相同的 URL,但如果一个页面链接到网站的另一部分(例如关于页面),我不能。目前,我有一个 LinkedList,每次使用 Jsoup 从文档中解析一个 URL 时,我都会在其中添加一个 URL。我有一个 HashMap 用于存储已经访问过的 URL。因此,我将其设置为这样的基本“如果”:

if(!urlsVisited.containsKey(url))
{
    urlsToVisit.add(url);
    urlsVisited.put(url, url); 
}

这是在一个 for 循环中,我在其中检索每个页面上的链接(当前 4 个线程处理 4 个页面)。

这会阻止它两次添加“ http://www.stackoverflow.com ”之类的内容,但如果我遇到“ http://www.stackoverflow.com/questions/ask ”则不起作用。

我想从 StackOverflow 添加一个链接(例如),然后使用该域完成。有任何想法吗?

我在 Java 中使用 Jsoup api 来解析结果。

4

2 回答 2

2

使用 java.net.URL 类提取主机名,并将其用作 urlsVisited 映射的键。

http://docs.oracle.com/javase/6/docs/api/java/net/URL.html#getHost()

于 2013-04-04T17:15:51.790 回答
2

您可以使用URI类来解析您的 URL。我还建议用于Set<String>存储访问过的域:

Set<String> urlsVisited = new HashSet<String>();
...

String domain = new URI(url).getHost();
if(!urlsVisited.contains(domain))
{
    urlsToVisit.add(url);
    urlsVisited.add(domain); 
}
于 2013-04-04T17:38:47.970 回答