IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java Discussion :

Récupérer contenu page web via URLConnection


Sujet :

Java

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2012
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2012
    Messages : 18
    Points : 16
    Points
    16
    Par défaut Récupérer contenu page web via URLConnection
    Bonjour,

    J'ai réalisé un petit programme que je lance chaque jour à heure fixe pour récupérer le contenu de plusieurs milliers de page web en "one-shot".

    J'extrais les valeurs qui me sont utiles de chaque page, puis je les enregistre dans un fichier xml afin de les mémoriser et de les exploiter dans un autre programme.

    Tout fonctionne à l'exception que, quelques fois, le programme qui récupère les données n'arrivent pas à se dérouler jusqu'à son terme.

    J'ai réussi à identifier le soucis qui à l'air de venir de cette méthode.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    public StringBuffer convertContentUrlToStringBuffer(String s_nameUrl){
    StringBuffer buffer = new StringBuffer();
    System.out.println("Départ");
    try
    {
    boolean isFirstLine= true;
    URL url = new URL(s_nameUrl);
    URLConnection urlConnection = url.openConnection();
    InputStream ips = urlConnection.getInputStream();
    InputStreamReader ipsr = new InputStreamReader(ips);
    BufferedReader br = new BufferedReader(ipsr);
    String line = null;
     
    while ((line = br.readLine()) != null)
    {
    if(!isFirstLine)
    {
    buffer.append('\n');
    }
    buffer.append(line);	
    isFirstLine = false;
    }
     
    ips.close();
    ipsr.close();
    br.close();
    }
     
    catch (IOException e)
    {
    e.printStackTrace();
    } 
     
    System.out.println("Arrivée");		
    return buffer;
    }
    En fait j'ai toujours mon couple "Départ" "Arrivée" sauf pour la dernière page où j'ai ce problème : c'est à dire présence de "Départ" mais pas de "Arrivée" et pas de trace d'une IOException.

    Après lecture de la javadoc de URLConnection je pencherais sur une SocketTimeoutException de la méthode "connect" qui ne serait pas "catchée" mais j'ai un doute.

    A noter que mon programme est multithreadé, peut-être qu'il y a un nombre limite de connexions simultanées, même si ça m'étonnerait fort. En tout cas ça pourrait expliquer ce côté aléatoire...

    Je voulais donc savoir si ma façon de procéder vous semblait correcte ? Et comment palier ce problème ?

    Rajouter un :
    catch (SocketTimeoutException ste)
    {
    }

    Et mettre tout le contenu de cette fonction dans un while afin d'authoriser X relecture pour justement ne plus être en "one-shot" ?

  2. #2
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2012
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2012
    Messages : 18
    Points : 16
    Points
    16
    Par défaut
    J'ai tracé un peu plus et sur 5240 pages webs parcourues j'ai 21 exceptions au total.

    19 Read timed out (java.net.SocketTimeoutException: Read timed out)
    2 Connexion terminée par expiration du délai d'attente (java.net.ConnectException: Connexion terminée par expiration du délai d'attente)

    La sequence est la suivante :

    4413 OK
    Exception
    727 OK
    2 Exception
    12 OK
    2 Exception
    19 OK
    2 Exception
    1 OK
    1 Exception
    3 OK
    1 Exception
    1 OK
    1 Exception
    4 OK
    1 Exception
    1 OK
    1 Exception
    5 OK
    2 Exception
    3 OK
    1 Exception
    1 OK
    4 Exception
    7 OK
    1 Exception
    1 OK
    1 Exception
    42 OK

    J'ai bien peur que le soucis soit due plutot à la connexion qu'à un mauvais codage. Je me trompe ?

  3. #3
    Membre émérite
    Homme Profil pro
    Développeur Java/Scala
    Inscrit en
    Octobre 2007
    Messages
    1 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Scala

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 086
    Points : 2 271
    Points
    2 271
    Par défaut
    Oui c'est normal d'avoir des exceptions, cela ne dépend pas que de toi mais de l'état du réseau ou du serveur en face...

    En effet à toi de faire une stratégie pour gérer les exceptions correctement, pourquoi pas avec un mécanisme de retry.

    Quelques infos utiles sur les bonnes pratiques avec les exceptions:
    http://stackoverflow.com/a/16172074/82609
    React-Hebdo - Newsletter pour se tenir à jour sur l'écosystème React

  4. #4
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2012
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2012
    Messages : 18
    Points : 16
    Points
    16
    Par défaut
    La stratégie a été faite pour gérer les exceptions et ne plus être en one shot.

    Ce que je ne comprenais pas c'est que je redirigeais le flux vers un fichier log. Mais à ma grande surprise les "printStake" ne sont pas renvoyés. Donc je voyais que ça bloquait visuellement mais je ne savais pas pourquoi (pas de traces d'erreurs).

    J'ai changé de distribution, et c'est réglé.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [PHP 5.3] Récupérer données pages web via PHP
    Par je.rochebrochart dans le forum Langage
    Réponses: 1
    Dernier message: 02/10/2011, 11h00
  2. Récupérer une page Web distante via Post
    Par Mike Reason dans le forum Langage
    Réponses: 1
    Dernier message: 06/06/2008, 09h22
  3. Contenue Page web
    Par kikouu dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 30/07/2006, 17h47
  4. [C++][Linux & Windows] Récupérer une page web
    Par Invité4 dans le forum C++
    Réponses: 4
    Dernier message: 06/04/2006, 19h21
  5. Réponses: 7
    Dernier message: 14/02/2006, 12h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo