web-dev-qa-db-fra.com

Je reçois une exception SocketTimeoutException dans Jsoup: la lecture a expiré


Je reçois une exception SocketTimeoutException lorsque j'essaie d'analyser de nombreux documents HTML à l'aide de Jsoup.
Par exemple, j'ai une liste de liens:

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

Pour chaque lien, j'analyse le document lié à l'URL (à partir de l'attribut href) pour obtenir d'autres informations dans ces pages.
Je peux donc imaginer que cela prend beaucoup de temps, mais comment supprimer cette exception?
Voici la trace entière de la pile:

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)

Merci les copains!

EDIT: Hum ... Désolé, je viens de trouver la solution:

Jsoup.connect(url).timeout(0).get();

J'espère que cela pourrait être utile pour quelqu'un d'autre ... :)

99
C. Maillard

Je pense que tu peux faire

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

qui fixe le délai d’attente à 10 secondes.

135
MarcoS

Ok, alors, j'ai essayé de proposer cela en tant que modification à la réponse de MarcoS, mais la modification a été rejetée. Néanmoins, les informations suivantes peuvent être utiles aux futurs visiteurs:

Selon javadocs , la valeur par défaut timeout pour un org.jsoup.Connection Est de 30 secondes.

Comme cela a déjà été mentionné, ceci peut être défini en utilisant timeout(int millis)

De plus, comme l'OP note dans l'édition, ceci peut également être défini en utilisant timeout(0). Cependant, comme l'indiquent les javadocs:

Un délai d'expiration égal à zéro est traité comme un délai d'expiration infini.

24
amaidment

J'ai eu la même erreur:

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)

et seul le réglage de .userAgent(Opera) a fonctionné pour moi.

J'ai donc utilisé la méthode Connection userAgent(String userAgent) _ de la classe Connection pour définir l'agent utilisateur Jsoup.

Quelque chose comme:

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

Il y a une erreur sur https://jsoup.org/apidocs/org/jsoup/Connection.html . Le délai d'attente par défaut n'est pas de 30 secondes. C'est 3 secondes. Il suffit de regarder javadoc dans les codes. Il dit 3000 ms.

2
Bartek