用于在Java中构建网站下载程序的数据结构

时间:2012-09-26 00:33:14

标签: java data-structures depth-first-search

我需要构建一个简化的网站下载器。它基本上会查看网站中的链接,并递归地将html文件下载到本地目录。哪种数据结构最适合这个?我知道我必须实现某种深度优先搜索算法,核心Java中是否有适合我的任务的数据结构库,并且会减少编码量吗? (我对Java很新)谢谢!

3 个答案:

答案 0 :(得分:2)

  

我需要构建一个简化的网站下载器。它基本上会查看网站中的链接,并以递归方式将html文件下载到本地目录。

存在许多用于执行此操作的命令行工具和图形界面工具,例如, wget,但如果你坚持自己这样做,那就继续阅读。

  

哪种数据结构最适合这种情况?我知道我必须实现某种深度优先搜索算法,核心Java中是否有适合我的任务的数据结构库,并且会减少编码量吗? (我对Java很新)谢谢!

数据结构和算法是两回事。哪种数据结构和算法最适合您的用途取决于数据的规模和其他因素。如果这是一个用于抓取少量链接的小应用程序,您可能希望使用递归方法下载每个页面并解析页面以获取下次下载的链接。

对于大型网络爬虫,您可能希望查看MapReduce以及一些分布式方法来存储数据并同时下载它们。

一些可能有用的工具是:

  1. Apache common IO,FileUitls.copyURLToFile function
  2. Apache common http-client
  3. Jsoup用于解析HTML

答案 1 :(得分:0)

我认为以下两种方法可以帮助你.. 你要做的是,提供一个String数组的链接,它将下载根目录中的所有页面。 如果你只是想下载页面,那么这段代码可以帮助你。

    public static void downloadPage(String[] pageLink) {
URL url;
InputStream is = null;
DataInputStream dis;
String line;
StringBuilder builder = new StringBuilder();
builder.append("");

try {
for (int i = 0; i < pageLink.length; i++) {
url = new URL(pageLink[i]);
is = url.openStream();
dis = new DataInputStream(new BufferedInputStream(is));

while ((line = dis.readLine()) != null) {
builder.append(line + "\n");
}
savePage(i + ".html", builder.toString());
builder.setLength(0);
}
} catch (MalformedURLException mue) {
mue.printStackTrace();
} catch (IOException ioe) {
ioe.printStackTrace();
} finally {
try {
is.close();
} catch (IOException ioe) {
}
}
}

public static void savePage(String fileName, String text) {
PrintStream out = null;
try {
out = new PrintStream(new FileOutputStream(fileName));
out.print(text);
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
if (out != null)
out.close();
}
}

答案 2 :(得分:0)

除了其他建议之外,您可能还需要查看ExecutorServiceJava Concurrency,因为您可能希望对下载进行处理以使其更快。