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 ... :)
Je pense que tu peux faire
Jsoup.connect("...").timeout(10 * 1000).get();
qui fixe le délai d’attente à 10 secondes.
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.
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();
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.