104 votes

Je reçois un SocketTimeoutException dans Jsoup: Read timed out


Je reçois un SocketTimeoutException lorsque j'essaie d'analyser beaucoup de documents HTML à l'aide 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, je lis un document lié à l'URL (de l'attribut href) pour obtenir d'autres éléments d'information dans ces pages.
Donc, je peux imaginer que cela prend beaucoup de temps, mais comment faire pour arrêter cette exception?
Voici la toute 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 à vous les copains!
sp00m

EDIT:

Hum... Désolé, vient de trouver la solution:

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

Espérons que pourrait être utile pour quelqu'un d'autre... :)

147voto

MarcoS Points 7305

Je pense que vous pouvez le faire

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

qui définit délai de 10 s

27voto

amaidment Points 2349

Ok - donc, j'ai essayé de proposer cela comme une modification à MarcoS réponse, mais la modification a été rejetée. Néanmoins, les informations suivantes peuvent être utiles pour les futurs visiteurs:

Selon la documentation javadoc, le délai d'attente par défaut pour un org.jsoup.Connection est de 3 secondes.

Comme cela a déjà été mentionné, ce qui peut être défini à l'aide de timeout(int millis)

Aussi, comme l'OP notes dans l'édition, cela peut également être défini à l'aide de timeout(0). Cependant, comme la javadoc de l'état:

Un délai d'attente de zéro est considéré comme un délai d'attente infinie.

-5voto

ITurchenko Points 351

J'ai télécharger html manuellement:

private String downloadHtml(String path) {
    InputStream is = null;
    try {
        String result = "";
        String line;

        URL url = new URL(path);
        is = url.openStream();  // throws an IOException
        BufferedReader br = new BufferedReader(new InputStreamReader(is));

        while ((line = br.readLine()) != null) {
            result += line;
        }
        return result;
    } catch (IOException ioe) {
        ioe.printStackTrace();
    } finally {
        try {
            if (is != null) is.close();
        } catch (IOException ioe) {
            // nothing to see here
        }
    }
    return "";
}

et puis le donner à JSoup

Documant doc = Jsoup.parse(downloadHtml(path));

Et n'ont aucun problème avec le délai d'attente.

-6voto

Gaurab Pradhan Points 78

Set timeout lors de la connexion à partir de jsoup.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X