J'obtiens une SocketTimeoutException lorsque j'essaye d'analyser beaucoup de documents HTML en utilisant 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 fermer cette exception?
Voici toute la trace 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é, vient de trouver la solution:
Jsoup.connect(url).timeout(0).get();
J'espère que cela pourrait être utile pour quelqu'un d'autre ... :)
timeout(0)
que Jsoup reliera l'URL encore et encore jusqu'à ce qu'il se connecte.Réponses:
Je pense que tu peux faire
qui définit le délai d'expiration à 10 s.
la source
Ok - donc, j'ai essayé de proposer ceci comme une 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 les javadocs , le délai d' expiration par défaut pour an
org.jsoup.Connection
est de 30 secondes.Comme cela a déjà été mentionné, cela peut être défini en utilisant
timeout(int millis)
En outre, comme le note OP dans l'édition, cela peut également être défini à l'aide de
timeout(0)
. Cependant, comme l'état javadocs:la source
Il y a une erreur sur https://jsoup.org/apidocs/org/jsoup/Connection.html . Le délai d'expiration par défaut n'est pas de 30 secondes. C'est 3 secondes. Regardez simplement javadoc dans les codes. Il dit 3000 ms.
la source
J'ai eu la même erreur:
et seul le réglage a
.userAgent(Opera)
fonctionné pour moi.J'ai donc utilisé la
Connection userAgent(String userAgent)
méthode de la classe Connection pour définir l'agent utilisateur Jsoup.Quelque chose comme:
la source
Cela devrait fonctionner:
Jsoup.connect(url.toLowerCase()).timeout(0);
.la source
Définissez le délai d'expiration lors de la connexion depuis jsoup.
la source