JsoupでSocketTimeoutExceptionが発生する:読み取りがタイムアウトしました


100


Jsoupを使用して多くのHTMLドキュメントを解析しようとすると、SocketTimeoutExceptionが発生します。
たとえば、リンクのリストを取得しました。

<a href="www.domain.com/url1.html">link1</a>
<a href="www.domain.com/url2.html">link2</a>
<a href="www.domain.com/url3.html">link3</a>
<a href="www.domain.com/url4.html">link4</a>

各リンクについて、(href属性からの)URLにリンクされたドキュメントを解析して、それらのページの他の情報を取得します。
時間がかかると想像できますが、この例外をどのように遮断するのですか?
スタックトレース全体を次に示します。

java.net.SocketTimeoutException: Read timed out
    at java.net.SocketInputStream.socketRead0(Native Method)
    at java.net.SocketInputStream.read(Unknown Source)
    at java.io.BufferedInputStream.fill(Unknown Source)
    at java.io.BufferedInputStream.read1(Unknown Source)
    at java.io.BufferedInputStream.read(Unknown Source)
    at sun.net.www.http.HttpClient.parseHTTPHeader(Unknown Source)
    at sun.net.www.http.HttpClient.parseHTTP(Unknown Source)
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
    at java.net.HttpURLConnection.getResponseCode(Unknown Source)
    at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:381)
    at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:364)
    at org.jsoup.helper.HttpConnection.execute(HttpConnection.java:143)
    at org.jsoup.helper.HttpConnection.get(HttpConnection.java:132)
    at app.ForumCrawler.crawl(ForumCrawler.java:50)
    at Main.main(Main.java:15)

仲間ありがとう!

編集: うーん...申し訳ありませんが、ちょうど解決策を見つけました:

Jsoup.connect(url).timeout(0).get();

それが他の誰かに役立つことを願っています... :)


3
編集で追加したコードにより、タイムアウトが無限に設定されます。これは、ほとんどの使用例では望ましくありません。MarcoSの回答に示されているように、タイムアウトが長い場合でも、特定のタイムアウトを使用することをお勧めします。
ステパニアン2014

2
私はtimeout(0)それが接続するまでJsoupに何度も何度もURLを接続させると思います。
Evan Hu

回答:


138

できると思います

Jsoup.connect("...").timeout(10 * 1000).get(); 

タイムアウトを10秒に設定します。


3
121賛成票ですが、なぜこれで問題が解決するのか説明はありませんか?デフォルトでは、30秒と表示されますが、なぜ問題が解決されるのですか?
アランヘイ

2
@AlanHay私の答えは、タイムアウトとして特定の値を使用するのではなく、タイムアウトを設定することによって問題を解決することを提案していました:)
MarcoS

26

OK-それで、私はこれをMarcoSの回答の編集として提供しようとしましたが、編集は拒否されました。それにもかかわらず、次の情報は将来の訪問者に役立つかもしれません:

よるとjavadocを、デフォルトのタイムアウトについてorg.jsoup.Connection 30秒です。

すでに述べたように、これは timeout(int millis)

また、編集中のOPノートとして、を使用して設定することもできますtimeout(0)。ただし、javadocsの状態:

ゼロのタイムアウトは、無限のタイムアウトとして扱われます。


3
無限のタイムアウトを設定することは、ほとんどの場合悪い考えです。長いタイムアウトを使用しますが、常に指定してください。MarcoSの回答を参照してください。
ステパニアン2014

3
@stepanian-明確にするために、私は無限のタイムアウトを設定することを主張していません。これはOPによって解決策として提案されていましたが、将来のユーザーにこれの意味するところを伝えたいと思っていました。実際、私が最初に「回答」を投稿したときに、将来のユーザーに役立つ可能性のある追加情報がいくつかあるため、MacroSの回答を編集する必要があると考えましたが、編集は拒否されました。
2015年

デフォルトのタイムアウトは3秒ではなく30秒(30000ミリ秒)です。jsoup.org
apidocs / org /

3

https://jsoup.org/apidocs/org/jsoup/Connection.htmlに誤りがあります。デフォルトのタイムアウトは30秒ではありません。3秒です。コードでjavadocを見てください。3000 msと表示されます。


1
Java Docの場合:「デフォルトのタイムアウトは30秒(30,000ミリ秒)です。ゼロのタイムアウトは、無限のタイムアウトとして扱われます。」jsoup.org/apidocs/org/jsoup/Connection.html
ジェトン

3

私は同じエラーがありました:

java.net.SocketTimeoutException: Read timed out
    at java.net.SocketInputStream.socketRead0(Native Method)
    at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
    at java.net.SocketInputStream.read(SocketInputStream.java:171)
    at java.net.SocketInputStream.read(SocketInputStream.java:141)

そして、設定だけ.userAgent(Opera)が私のために働いた。

だから私は Connection userAgent(String userAgent)、Jsoupユーザーエージェントを設定するためにConnectionクラスのメソッド。

何かのようなもの:

Jsoup.connect("link").userAgent("Opera").get();


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.