0

我正在尝试找出以 url 作为输入参数在 Java 中获取网页内容的最可靠方法?

我尝试过的事情是:1. JSOUP 2. HtmlUnit 3. URL 和 URLConnection

1 和 2 的问题是它们有时会抛出 SocketTimeoutException 或行为不可预测,即使可以获取页面的内容(即使 robots.txt 允许)。

使用 3 我无法在不使用毫秒减法的情况下获得 loadTime。这是最大的问题,它会产生不准确的结果。为了获取内容,我需要使用 Streams 并逐行阅读内容。

当前实现使用方法#2。它具有 LoadTime 和 contentType 的能力。

对于每个网页的内容,我需要 contentType、loadTime 等。

基本上它是用于验证整个网站的链接验证器项目,包括 css 的背景图像以及图像、js、html 等,因此基于 contentType I 过滤并仅解析 HTML 的内容。

PS 提高超时时间超过 9 秒会使链接验证变慢。所以我当前的超时时间是 9 秒。

我需要帮助,因为我想让我的链接验证工具尽可能可靠。

4

2 回答 2

2

听起来您的问题分为两部分:

  1. 如何从远程服务器获取内容

  2. 然后我如何解析内容以进行链接验证

而且您的问题实际上是关于第 1 部分的,但您同时参加了第 1 部分和第 2 部分。这可能是您问题的一部分。

真正的问题是阅读远程内容。这三种方法实际上都是使用完全相同的后台 API 读取内容,即 JRE 内置的基于 URLConnection 的解决方案。URLConnection 没问题,但不是你想在真实网络上使用的。

有几个更好的库可用于通过 HTTP 协议获取远程资源的内容...

  1. 来自 JBoss 的Netty
  2. 来自 Apache 的HttpComponents
  3. Jean-Francois 的AsyncHttpClient

我发现 AsyncHttpClient 是最好用的,即使在阻塞模式下也是如此。它有一个非常好的获取页面的 API,并且它适用于多线程。您应该会发现获得总加载时间很容易,更重要的是,您应该能够并行进行大量工作。

本质上,您将使用 AsyncHttpClient 加载内容,然后将该内容传递到 JSoup(或任何您喜欢的... JSoup 是我推荐的)并在那里进行解析。

错误不在于使用 JSoup 或 HtmlUnit,而在于尝试使用它们来做所有事情。这些工具旨在做一件事并做好一件事……您需要做两件事,因此请使用两个工具,每个工具都针对手头的任务进行了优化。

于 2012-09-10T20:57:39.730 回答
0

您应该实现某种重试机制。

于 2012-09-10T20:56:44.360 回答