【问题标题】:How to limit download size with jsoup?如何使用 jsoup 限制下载大小?
【发布时间】:2013-11-15 10:53:21
【问题描述】:

我正在尝试使用 JSoup 限制下载页面/链接的大小,给出如下内容(Scala 代码):

val document = Jsoup.connect(theURL).get();

我只想获取给定页面的前几 KB,并且不再尝试下载。如果页面非常大(或者theURL 是一个不是 html 的链接,并且是一个大文件),我不想花时间下载其余的。

我的用例是 IRC 机器人的页面标题搜索器。

额外问题:

Jsoup.connect(theURL).timeout(3000).get(); 在大文件上没有超时有什么原因吗?如果有人粘贴诸如永无止境的音频流或大型 ISO 之类的东西(这可以通过在不同线程中获取 URL 标题(或使用 Scala 演员并在那里超时)来解决),它最终会导致机器人退出,但是当我认为 timeout() 应该完成相同的最终结果时,对于一个非常简单的机器人来说似乎有点过分了)。

【问题讨论】:

    标签: jsoup


    【解决方案1】:

    现在您可以使用 maxBodySize() 方法限制 1.7.2 版的最大身体尺寸。 http://jsoup.org/apidocs/org/jsoup/Connection.Request.html#maxBodySize() 默认情况下限制为 1MB,这将防止内存泄漏。

    【讨论】:

      【解决方案2】:

      奖励问题的奖励答案:超时定义为连接和套接字传输超时。因此,如果连接所用时间少于超时时间,并且您从服务器接收数据包的频率高于超时时间,则永远不会触发超时。

      我知道这不是非常直观,并且希望将其移至总已用挂钟超时。但为了向后兼容,我可能需要使用不同的方法(征求意见)。

      现在应该在 1.7.2+ 中使用最大主体大小来阻止永无止境的音频流。但是如果没有挂钟超时,它仍然会被故意缓慢的服务器捕获,这些服务器会以 3 秒的延迟一点一点地做出响应。

      【讨论】:

        【解决方案3】:

        不要以为你可以用 JSoup 做到这一点。 JSoup 没有流模式(InputStream 将被转换为字符串)。

        如果你想下载几 KB 的数据,我建议你使用 Apache HTTPClient 或 Ning AsyncHttpClient 来玩响应流。您可以随时停止检索数据。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-05-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-07-12
          • 2021-08-19
          • 2019-04-07
          相关资源
          最近更新 更多