我在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>

对于每个链接,我都会解析链接到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(url).timeout(0).get();

希望对其他人有用... :)


3
您在编辑中添加的代码将超时设置为无限。在大多数用例中,这是不希望的。即使超时时间很长,也最好使用MarcoS答案中所示的特定超时时间。
stepanian 2014年

2
我想这timeout(0)会使Jsoup一次又一次地连接URL,直到连接为止。
伊万·胡

Answers:


138

我想你可以做

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

将超时设置为10s。


3
121投票,但没有解释为什么这可以解决此问题?为什么当默认值出现30秒时,该解决该问题?
艾伦·海伊

2
@AlanHay我的回答是建议通过设置超时来解决问题,而不是使用该特定值作为超时时间:)
MarcoS

26

好的-因此,我尝试提供此内容作为对MarcoS答案的修改,但该修改被拒绝。但是,以下信息可能对将来的访问者有用:

根据javadocs,默认超时时间org.jsoup.Connection 30秒。

如前所述,可以使用 timeout(int millis)

另外,作为编辑中的OP注释,也可以使用进行设置timeout(0)。但是,正如javadocs所述:

零超时被视为无限超时。


3
在大多数情况下,设置无限超时是一个坏主意。使用长超时,但始终指定一个。参见MarcoS答案。
stepanian 2014年

3
@stepanian-要明确,我不主张设置无限超时。OP曾建议将其作为解决方案,尽管我想引导未来的用户了解其含义。确实,当我最初发布我的“答案”时,我表示我认为这应该是对MacroS答案的修改,因为还有一些其他信息可能对将来的用户有用...但是该编辑被拒绝了。
maiidment'1

默认超时不是3秒,而是30秒(30000毫秒),您可以在jsoup.org/apidocs/org/jsoup/Connection.html中
aldok,


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)Connection类的方法来设置Jsoup用户代理。

就像是:

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.