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();
それが他の誰かに役立つことを願っています... :)
できると思う
Jsoup.connect("...").timeout(10 * 1000).get();
タイムアウトを10秒に設定します。
私は同じエラーが発生しました:
_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();
_
https://jsoup.org/apidocs/org/jsoup/Connection.html に間違いがあります。デフォルトのタイムアウトは30秒ではありません。 3秒です。コードでjavadocを見てください。 3000 msと表示されます。