Recibo una excepción SocketTimeoutException en Jsoup: Read timed out


100


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 ... :)


3
El código que agregó en su edición establece el tiempo de espera en infinito. Esto no es deseable en la mayoría de los casos de uso. Es mucho mejor usar un tiempo de espera específico como se indica en la respuesta de MarcoS, incluso si el tiempo de espera es largo.
Stepanian

2
Supongo que timeout(0)hará que Jsoup conecte la URL una y otra vez hasta que se conecte.
Evan Hu

Respuestas:


138

Creo que puedes hacer

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

que establece el tiempo de espera en 10 s.


3
121 votos a favor, pero sin explicación de por qué esto soluciona el problema. ¿Por qué soluciona el problema cuando el valor predeterminado es, al parecer, 30 segundos?
Alan Hay

2
@AlanHay mi respuesta sugirió resolver el problema estableciendo un tiempo de espera, no usando ese valor específico como tiempo de espera :)
MarcoS

26

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.Connectiones 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:

Un tiempo de espera de cero se trata como un tiempo de espera infinito.


3
Establecer un tiempo de espera infinito es una mala idea en la mayoría de los casos. Utilice un tiempo de espera prolongado, pero siempre especifique uno. Vea la respuesta de MarcoS.
Stepanian

3
@stepanian: para ser claros, no estoy abogando por establecer un tiempo de espera infinito. Esto había sido sugerido como la solución por el OP, aunque quería dirigir a los futuros usuarios a las implicaciones de esto. De hecho, cuando publiqué originalmente mi 'respuesta', indiqué que pensé que debería haber sido una edición de la respuesta de MacroS, ya que había información adicional que podría ser útil para futuros usuarios ... pero la edición fue rechazada.
amaidment

El tiempo de espera predeterminado no es de 3 segundos, sino de 30 segundos (30000 milis), puede verlo en jsoup.org/apidocs/org/jsoup/Connection.html
aldok


3

Yo tenía el mismo error:

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)

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:

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


-6

Establezca el tiempo de espera mientras se conecta desde jsoup.


2
Agregue más información sobre su respuesta
Joe Taras

Por favor respalde su respuesta con explicaciones y fragmentos de código si es necesario.
Swapnil B.
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.