Recibo una SocketTimeoutException cuando intento analizar muchos documentos HTML usando Jsoup.
Por ejemplo, tengo una lista de enlaces:
<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>
Para cada enlace, analizo el documento vinculado a la URL (del atributo href) para obtener otros datos en esas páginas.
Así que puedo imaginar que lleva mucho tiempo, pero ¿cómo cerrar esta excepción?
Aquí está todo el seguimiento de la pila:
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)
¡Gracias amigos!
EDITAR: Hum ... Lo siento, acabo de encontrar la solución:
Jsoup.connect(url).timeout(0).get();
Espero que pueda ser útil para alguien más ... :)
timeout(0)
hará que Jsoup conecte la URL una y otra vez hasta que se conecte.Respuestas:
Creo que puedes hacer
que establece el tiempo de espera en 10 s.
fuente
Bien, intenté ofrecer esto como una edición de la respuesta de MarcoS, pero la edición fue rechazada. Sin embargo, la siguiente información puede ser útil para futuros visitantes:
Según los javadocs , el tiempo de espera predeterminado para un
org.jsoup.Connection
es de 30 segundos.Como ya se ha mencionado, esto se puede configurar usando
timeout(int millis)
Además, como señala el OP en la edición, esto también se puede configurar usando
timeout(0)
. Sin embargo, como afirman los javadocs:fuente
Hay un error en https://jsoup.org/apidocs/org/jsoup/Connection.html . El tiempo de espera predeterminado no es de 30 segundos. Son 3 segundos. Basta con mirar javadoc en códigos. Dice 3000 ms.
fuente
Yo tenía el mismo error:
y solo la configuración
.userAgent(Opera)
funcionó para mí.Así que utilicé el
Connection userAgent(String userAgent)
método de la clase Connection para configurar el agente de usuario de Jsoup.Algo como:
fuente
Esto debería funcionar:
Jsoup.connect(url.toLowerCase()).timeout(0);
.fuente
Establezca el tiempo de espera mientras se conecta desde jsoup.
fuente