我在Jsoup中得到一个SocketTimeoutException:读取超时

时间:2011-07-04 12:32:23

标签: java jsoup


当我尝试使用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();

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

6 个答案:

答案 0 :(得分:133)

我认为你可以做到

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

将超时设置为10秒。

答案 1 :(得分:24)

好的 - 所以,我尝试将此作为对MarcoS答案的编辑,但编辑被拒绝了。不过,以下信息可能对未来的访问者有用:

根据javadocsorg.jsoup.Connection的默认timeout为30秒。

正如已经提到的,可以使用timeout(int millis)

设置

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

  

超时为零被视为无限超时。

答案 2 :(得分:2)

https://jsoup.org/apidocs/org/jsoup/Connection.html上有错误。 默认超时不是30秒。这是3秒。 只需看看代码中的javadoc即可。它说3000毫秒。

答案 3 :(得分:1)

我有同样的错误:

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

类似的东西:

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

答案 4 :(得分:-1)

这应该起作用: Jsoup.connect(url.toLowerCase()).timeout(0);

答案 5 :(得分:-6)

从jsoup连接时设置超时。