6

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

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

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

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

奖金问题:

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

4

3 回答 3

7

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

于 2013-02-03T20:26:34.183 回答
2

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

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

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

于 2013-11-15T02:53:21.953 回答
0

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

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

于 2013-01-25T03:41:05.280 回答