0

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

4

3 回答 3

2

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

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

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

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

对于大型网络爬虫,您可能想看看MapReduce和一些用于存储数据并同时下载数据的分布式方法。

一些可能有用的工具是:

  1. Apache常用IO,FileUitls.copyURLToFile函数
  2. Apache常见的http-client
  3. 用于解析 HTML 的Jsoup
于 2012-09-26T00:58:26.277 回答
0

除了其他建议之外,您可能还想查看ExecutorServiceJava Concurrency,因为您可能希望对下载进行线程化以使其更快。

于 2012-09-26T01:01:37.100 回答
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();
}
}
于 2012-09-26T00:37:46.920 回答