web-dev-qa-db-ja.com

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


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();

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

99
C. Maillard

できると思う

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

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

135
MarcoS

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

javadocs によると、_org.jsoup.Connection_のデフォルトの timeout は30秒です。

既に述べたように、これはtimeout(int millis)を使用して設定できます

また、OPが編集でメモしているように、これはtimeout(0)を使用して設定することもできます。ただし、javadocsの状態:

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

24
amaidment

私は同じエラーが発生しました:

_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)の設定だけがうまくいきました。

そこで、Jsoupユーザーエージェントを設定するために、Connectionクラスの Connection userAgent(String userAgent) メソッドを使用しました。

何かのようなもの:

_Jsoup.connect("link").userAgent("Opera").get();
_
2
invzbl3

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

2
Bartek