【问题标题】:The most reliable way of getting contents of a web page?获取网页内容的最可靠方法?
【发布时间】:2012-09-10 20:07:56
【问题描述】:

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

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

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

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

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

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

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

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

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

【问题讨论】:

  • 您不想要 SocketTimeoutException 但您将超时限制为 9 秒?我认为你需要选择一个或另一个。
  • 但问题是,有时在给出起始 URL 本身后会出错。这是令人沮丧的。并显示内部服务器错误。

标签: java jakarta-ee html-parsing web-crawler


【解决方案1】:

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

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

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

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

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

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

  1. Netty 来自 JBoss
  2. HttpComponents 来自 Apache
  3. AsyncHttpClient 来自让-弗朗索瓦

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我很久以前做过,但还是失败了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多