6

次のようなもの(Scalaコード)を指定して、ダウンロードしたページ/リンクのサイズをJSoupで制限しようとしています:

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

特定のページの最初の数 KB だけを取得し、それ以降のダウンロードを停止したいと考えています。非常に大きなページ (またはtheURLhtml ではなく、大きなファイルのリンク) がある場合、残りのダウンロードに時間を費やす必要はありません。

私のユースケースは、IRC ボットのページ タイトル スナーファーです。

おまけの質問:

Jsoup.connect(theURL).timeout(3000).get();大きなファイルでタイムアウトしない理由はありますか? 誰かが終わりのないオーディオ ストリームや大きな ISO などを貼り付けると、ボットが ping アウトする原因になります (別のスレッドで 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 に答える