Java Jsoup SocketTimeoutException:读取超时
当我尝试使用Jsoup解析大量HTML文档时,会得到一个Java Jsoup SocketTimeoutException:读取超时,java,jsoup,Java,Jsoup,当我尝试使用Jsoup解析大量HTML文档时,会得到一个SocketTimeoutException 例如,我得到了一个链接列表: 对于每个链接,我解析链接到URL的文档(来自href属性),以获取这些页面中的其他信息 所以我可以想象这需要很多时间,但是如何关闭这个异常这里是整个堆栈跟踪: java.net.SocketTimeoutException:读取超时 位于java.net.SocketInputStream.socketRead0(本机方法) 位于java.net.SocketI
SocketTimeoutException
例如,我得到了一个链接列表:
对于每个链接,我解析链接到URL的文档(来自href属性),以获取这些页面中的其他信息
所以我可以想象这需要很多时间,但是如何关闭这个异常这里是整个堆栈跟踪:
java.net.SocketTimeoutException:读取超时
位于java.net.SocketInputStream.socketRead0(本机方法)
位于java.net.SocketInputStream.read(未知源)
位于java.io.BufferedInputStream.fill(未知源)
位于java.io.BufferedInputStream.read1(未知源)
位于java.io.BufferedInputStream.read(未知源)
位于sun.net.www.http.HttpClient.parseHTTPHeader(未知源)
位于sun.net.www.http.HttpClient.parseHTTP(未知源)
位于sun.net.www.protocol.http.HttpURLConnection.getInputStream(未知源)
位于java.net.HttpURLConnection.getResponseCode(未知源)
位于org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:381)
位于org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:364)
位于org.jsoup.helper.HttpConnection.execute(HttpConnection.java:143)
位于org.jsoup.helper.HttpConnection.get(HttpConnection.java:132)
在app.ForumCrawler.crawl(ForumCrawler.java:50)
Main.Main(Main.java:15)
我想你能做到
Jsoup.connect("...").timeout(10 * 1000).get();
这将超时设置为10秒。好的-因此,我试图对MarcoS的答案进行编辑,但编辑被拒绝。然而,以下信息可能对未来的访客有用: 根据,org.jsoup.Connection的默认值为30秒 如前所述,可以使用
timeout(int millis)
此外,正如编辑中的操作说明,也可以使用timeout(0)
进行设置。但是,正如javadocs所述:
零超时被视为无限超时
从jsoup连接时设置超时。上有错误。 默认超时时间不是30秒。是3秒。 看看代码中的javadoc。上面写着3000毫秒。我也有同样的错误:
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用户代理
比如:
Jsoup.connect("link").userAgent("Opera").get();
这应该起作用:
Jsoup.connect(url.toLowerCase()).timeout(0)代码>您在编辑中添加的代码将超时设置为无限。这在大多数用例中是不可取的。最好使用MarcoS回答中指出的特定超时,即使超时很长。我猜timeout(0)
会让Jsoup一次又一次地连接url,直到它连接。这似乎是问题作者Jsoup.connect(url).timeout(0).get()找到的解决方案在大多数情况下,设置无限超时是个坏主意。使用长超时,但始终指定一个。请看马科斯的回答。@stepanian-说清楚,我并不主张设置无限超时。OP曾建议将其作为解决方案,尽管我想让未来的用户了解其含义。事实上,当我最初发布我的“答案”时,我表示我认为它应该是对MacroS答案的编辑,因为有一些额外的信息可能对未来的用户有用。。。但编辑被拒绝。默认超时不是3秒,而是30秒(30000毫秒),您可以在过去是3秒的超时中看到它,回到问题编写时。请添加有关您答案的更多信息。如有必要,请提供解释和代码片段以支持您的答案。但不解释为什么这样做可以解决问题?为什么在默认值为30秒的情况下解决问题?@AlanHay我的答案是建议通过设置超时来解决问题,而不是使用特定值作为超时:)@AlanHay,写问答时的默认超时是3秒。因此,任何增加都会降低套接字超时频率,并有助于解决问题。我在2016年将默认值更新为30秒。在java文档中:“默认超时为30秒(30000毫秒)。零超时被视为无限超时。”