簡體   English   中英

Jsoup SocketTimeoutException:讀取超時

[英]Jsoup SocketTimeoutException: Read timed out

當我嘗試使用 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>

對於每個鏈接,我解析鏈接到 URL 的文檔(來自 href 屬性)以獲取這些頁面中的其他信息。

所以我可以想象這會花費很多時間,但是如何關閉這個異常這是整個堆棧跟蹤:

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("...").timeout(10 * 1000).get(); 

將超時設置為 10 秒。

好的 - 所以,我試圖將此作為對 MarcoS 答案的編輯提供,但編輯被拒絕了。 盡管如此,以下信息可能對未來的訪客有用:

根據javadocsorg.jsoup.Connection的默認超時為 30 秒。

正如已經提到的,這可以使用timeout(int millis)來設置

此外,正如編輯中的 OP 注釋,這也可以使用timeout(0)進行設置。 但是,作為 javadocs state:

零超時被視為無限超時。

我有同樣的錯誤:

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 用戶代理。

就像是:

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

https://jsoup.org/apidocs/org/jsoup/Connection.html有錯誤。 默認超時不是 30 秒。 這是3秒。 只需查看代碼中的 javadoc 即可。 它說3000毫秒。

這應該工作: Jsoup.connect(url.toLowerCase()).timeout(0); .

從 jsoup 連接時設置超時。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM