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

Langage Java Discussion :

Récupérer une page Internet "lourde"


Sujet :

Langage Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 64
    Par défaut Récupérer une page Internet "lourde"
    Bonjour tout le monde!

    Voila, je suis nouveau ici, je débute dans le Java (enfin depuis le début de l'année :d)
    et je cherche à créer une classe qui fasse cela

    1/ Elle effectue une recherche sur Allocine
    2/ Elle récupère le nombre de résultats
    3/ Elle récupere l'URL de la premiere (ou de la n-ieme mais à implémenter)
    4/ Elle se connecte sur cette URL
    5/ Elle récupère des infos choisies
    6/ Stockage en SQL


    L'ennui, c'est que j'avais déja implémenté cela plus ou moins sur Animeka mais Animeka est bien plus léger que Allociné :d

    Le principe revient à ouvrir un flux seulement ca plante
    Ou plutot cela met bien du temps
    Serait il possible de spécifier les bornes de mon InputStream ?

    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    public class AllocineSearch{
    	/*This class aims to dl from Allocine details from movies*/
    	/* TODO =>fonction which allows to search in the series DB*/
     
    	String path;
    	URL u;
     
     
    	public AllocineSearch(String path)
    	{/*Constructor*/
    		this.path=path;
    		try {
    			u=new URL(path);
    			System.out.println("URL "+this.path+" valide");
    		} catch (MalformedURLException e) {
    			System.out.println("URL "+this.path+" Non valide");
    		}
    	}
     
     
     
     
    String read_str() throws IOException
    	{
    		int b;
    		InputStream is = u.openStream();
    		String s = null;
    		while ((b = is.read()) != -1)
    			s+=(char) b; /*while*/
    		//EOF reached
    		is.close();
     
     
    		int beginning=s.indexOf("Recherche : ");
    		int ending =s.indexOf("Articles");
    			/*Gives the integer on which the Sequence begins with*/
    		String res = null ;
    		for(int i=beginning;i<ending;i++)
    		{
    			res+=s.charAt(i);
    		}
    		return res;
    	}/*read_str*/
     
     
     
    	boolean isIn(String form)
    	{
    		int beginning=form.indexOf("Recherche : "); /*Returns the int on which begins this sequence*/
    		int index = form.indexOf("Pas de r&eacute;sultats", beginning);
    		return (index!=-1);/*indexOf returns -1 if not found*/
    	}

    Voila mon code...
    Quand j'exécute le Test, cela met bien 2-3 minutes rien que pour trouver le search...
    D'où ma question pour limiter le champ de recherche...



    Merci d avance!!!

  2. #2
    Expert confirmé
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Par défaut
    Essaie en changeant la manière de lire la page :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int b;
    InputStream is = u.openStream();
    String s = null;
    while ((b = is.read()) != -1)
    	s+=(char) b; /*while*/
    //EOF reached
    is.close();
    par quelque chose de plus simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    StringBuffer source = new StringBuffer();
     
    URLConnection urlConnection = u.openConnection();
    urlConnection.setUseCaches(false);
    urlConnection.connect();
     
    Scanner scanner = new Scanner(urlConnection.getInputStream());
     
    //Tant qu'il reste des lignes et que l'on a pas fini de collecter des données
    while(scanner.hasNextLine()){
    	source.append(scanner.nextLine());
    }
    Tu peux ensuite récupérer la source complète en faisant source.toString()

    Il ne faut jamais faire de concaténations de String dans des boucles, il faut toujours utiliser un StringBuffer

    Si tu veux vraiment lire caractère par caractère, tu peux aussi faire comme avant mais avec un buffer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int b;
    InputStream is = u.openStream();
    StringBuffer s = new StringBuffer();
    while ((b = is.read()) != -1){
    	s.append((char) b);
    } /*while*/
    //EOF reached
    is.close();
    Ca devrait aller mieux

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    548
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 548
    Par défaut
    Quand tu fais ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    while ((b = is.read()) != -1)
    			s+=(char) b; /*while*/
    Tu crées un String de taille 1, puis 2, puis 3 etc. Donc tu crées énormément d'objets en mémoire et ça fait coute cher. Utilise plutôt StringBuilder (ou StringBuffer si java < 5)

  4. #4
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par the-gtm
    Tu crées un String de taille 1, puis 2, puis 3 etc. Donc tu crées énormément d'objets en mémoire et ça fait coute cher.
    +1
    D'ailleurs ca coute même encore plus chère puisque tu crée également un StringBuilder à chaque itération, car ce code :

    Est l'équivalent du code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     s = new StringBuilder(s).append(b).toString();
    Donc tu as 2 créations d'objets (new StringBuilder() puis toString()).

    a++

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 64
    Par défaut
    Merci beaucoup, tout d'un coup cela marche bien mieux :d

    Donc si je comprends bien, si l'on veut faire des ajouts réguliers, il vaut mieux utiliser un StringBuffer?

    De plus, j'ai un ptit ennui (et vi, avancant, je trouve d'autres problèmes: je récupère dans un StringBuffer le nombre de réponses sur allocine et étant un entier je voudrais le récupérer comme entier et non comme StringBuffer...
    Serait ce possible?


    Merci d avance :d



    EDIT/
    En fait je récupère le nombre situé juste derrière ...
    Une illustration sera mieux :d


  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 64
    Par défaut
    Citation Envoyé par wichtounet
    Essaie en changeant la manière de lire la page :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int b;
    InputStream is = u.openStream();
    String s = null;
    while ((b = is.read()) != -1)
    	s+=(char) b; /*while*/
    //EOF reached
    is.close();
    par quelque chose de plus simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    StringBuffer source = new StringBuffer();
     
    URLConnection urlConnection = u.openConnection();
    urlConnection.setUseCaches(false);
    urlConnection.connect();
     
    Scanner scanner = new Scanner(urlConnection.getInputStream());
     
    //Tant qu'il reste des lignes et que l'on a pas fini de collecter des données
    while(scanner.hasNextLine()){
    	source.append(scanner.nextLine());
    }
    Tu peux ensuite récupérer la source complète en faisant source.toString()

    Il ne faut jamais faire de concaténations de String dans des boucles, il faut toujours utiliser un StringBuffer

    Si tu veux vraiment lire caractère par caractère, tu peux aussi faire comme avant mais avec un buffer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int b;
    InputStream is = u.openStream();
    StringBuffer s = new StringBuffer();
    while ((b = is.read()) != -1){
    	s.append((char) b);
    } /*while*/
    //EOF reached
    is.close();
    Ca devrait aller mieux


    Au vu de la JDoc, ce n'est ni pas la 1.4...
    Ennui: je bosse sur la 1.4, Eclipse aime po la 1.5 ^^
    Et elle fait quoi ^-^

    Elle étudie un texte jprésume ?

  7. #7
    Expert confirmé
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Par défaut
    Citation Envoyé par Richard_Rahl
    Au vu de la JDoc, ce n'est ni pas la 1.4...
    Ennui: je bosse sur la 1.4, Eclipse aime po la 1.5 ^^
    Et elle fait quoi ^-^

    Elle étudie un texte jprésume ?
    En effet, la classe Scanner (si tu parles bien d'elle) permet de lire un flux plus simplement. Mais tu peux tout à fait passer par un StringBuffer, c'est tout aussi bien

    Quand tu récupères le int, il faut que tu saches que c'est ce int là et au lieu de l'ajouter dans le StringBuffer, il te suffit de le mettre dans une autre variable non ?

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 64
    Par défaut
    L'ennui c 'est qu'en passant par le StringBuffer ca récupère un caractère non?
    Il faudrait faire comme en C avec une fonction -'A' ?
    histoire de récupérer la valeur entière ?





    EDIT/ finalement c'est bon, j'ai fait un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int val=form.charAt(pos);
    val-=51;
    return val;
    Et ca marche :d

    merci de votre aide
    (heureusement que j'ai vu ça en C :d)

Discussions similaires

  1. Récupérer une page internet en C
    Par joprog dans le forum Réseau
    Réponses: 4
    Dernier message: 31/08/2010, 14h31
  2. Récupérer une page internet dans un fichier texte
    Par Sakapatate dans le forum Shell et commandes GNU
    Réponses: 1
    Dernier message: 15/06/2007, 10h06
  3. Comment récupérer une info d'une page internet ?
    Par Magicien d'Oz dans le forum Réseau
    Réponses: 3
    Dernier message: 12/10/2005, 07h38

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