Pagina 1 di 4 1 2 3 ... ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 31

Discussione: Parsing pagina web

  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2009
    Messaggi
    23

    Parsing pagina web AIUTO!!!

    Ciao a tutti, sono un semi novizio di java e ho disperatamente bisogno di un aiuto.

    Stò cercando di ricavare dei dati dal web e secondo quello che ho trovato in giro, il modo migliore è il parsing di una pagina web, e qui avrei due domande da farvi:

    1 Per fare questo procedimento, io sono obbligato a scaricare tutta la pagina intera e ad andare a ricavare i dati, oppure esiste qualche metodo per poter scricare solo i dati di mio interesse, senza quelli superflui?

    2 Qualcuno mi aiuta con il codice: una volta crearo l'URL della pagina dove si trovano i dati che mi servono e dopo acer aperto una connessione con url.openConnection(), come faccio finalmente a scaricarmi la pagina?

    Grazie mille a tutti

  2. #2
    Utente di HTML.it
    Registrato dal
    Oct 2009
    Messaggi
    23
    Per ora con il codice sono fermo a questo punto, non sò come proseguire:

    codice:
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.net.MalformedURLException;
    import java.net.URL;
    import java.net.URLConnection;
    
    
    public class Main {
    
      void main(String[] args) throws MalformedURLException, IOException {
        try {
    
          URL url = new URL("http://www.....");
          URLConnection connessione = url.openConnection();
          BufferedReader pagina = new BufferedReader(new InputStreamReader(connessione.getInputStream()));
          String download =pagina.readLine();
    
        } catch (IOException e) { System.out.println(e); }
    
      }
    
    }
    Aiutino please

  3. #3
    Utente di HTML.it L'avatar di neroux
    Registrato dal
    Aug 2009
    Messaggi
    1,973
    Prova qualcosa così

    codice:
    void main(String[] args) throws MalformedURLException, IOException
    {
        try
        {
            byte[] buffer=new byte[8192];
            int i;
            ByteArrayOutputStream os=new ByteArrayOutputStream();
    
            URL url = new URL("http://www.....");
            URLConnection connessione = url.openConnection();
    
            InputStream is=connessione.getInputStream();
            while ((i=is.read(buffer))>-1) os.write(buffer, 0, i);
    
            String contenuto=os.toString();
        }
        catch (IOException e)
        {
            System.out.println(e);
        }
    }

    www.sitemeer.com » Quando un sito pare irraggiungibile

    Se ti piace ci puoi trovare anche su Facebook

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Cyocjo
    Aiutino please
    Beh ma come leggere dallo stream dipende da cosa ci devi fare di preciso!

    Vuoi leggere "a righe"? Ok, allora fai un ciclo (un while) in cui leggi le righe con readLine() e il ciclo deve continuare fintanto che readLine() ritorna un valore diverso da null.
    Ma poi .... cosa ci faresti con le singole righe? Se ad esempio volessi usare le espressioni regolari per cercare qualcosa o anche più semplicemente con gli indexOf() e simili di String cosa te ne fai di tante righe singole???

    Allora tanto vale non leggere "a righe"! Istanzia un array di char di tot caratteri (es. 1024), leggi in ciclo a blocchi di char e buttali dentro un StringBuffer o StringBuilder. A quel punto con le regex puoi fare ricerche su tutto il contenuto!
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320

    Moderazione

    Invito l'autore della discussione a prendere immediata visione del Regolamento interno prima di aprire altre discussioni, in particolare i punti in cui si spiega come scrivere i titoli (e quali espressioni inutili evitare) e come si posta il codice (punto 6).

    Sistemo ove possibile.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  6. #6
    Utente di HTML.it
    Registrato dal
    Oct 2009
    Messaggi
    23

    Re: Moderazione

    Originariamente inviato da LeleFT
    Invito l'autore della discussione a prendere immediata visione del Regolamento interno prima di aprire altre discussioni, in particolare i punti in cui si spiega come scrivere i titoli (e quali espressioni inutili evitare) e come si posta il codice (punto 6).

    Sistemo ove possibile.


    Ciao.
    Le ricerche nel forum prima di aprire la discussione le ho fatte, ho trovato qualcosa, ma essendo, come ho scritto, un programmatorepoco esperto, non le ho trovate di moltissimo aiuto

    Per il resto scusa

    Originariamente inviato da andbin
    Beh ma come leggere dallo stream dipende da cosa ci devi fare di preciso!

    Vuoi leggere "a righe"? Ok, allora fai un ciclo (un while) in cui leggi le righe con readLine() e il ciclo deve continuare fintanto che readLine() ritorna un valore diverso da null.
    Ma poi .... cosa ci faresti con le singole righe? Se ad esempio volessi usare le espressioni regolari per cercare qualcosa o anche più semplicemente con gli indexOf() e simili di String cosa te ne fai di tante righe singole???

    Allora tanto vale non leggere "a righe"! Istanzia un array di char di tot caratteri (es. 1024), leggi in ciclo a blocchi di char e buttali dentro un StringBuffer o StringBuilder. A quel punto con le regex puoi fare ricerche su tutto il contenuto!
    Dalla pagina web io devo estrarre dei numeri, quindi credo che userò il metodo dell' array.

    Grazie mille a tutti per le risposte chiarificatrici, adesso mi metto subito al lavoro

  7. #7
    Utente di HTML.it
    Registrato dal
    Oct 2009
    Messaggi
    23
    codice:
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.net.MalformedURLException;
    import java.net.URL;
    import java.net.URLConnection;
    
    
    public class Main {
    
    
    
    public static void main(String[] args) throws MalformedURLException, IOException {
    try{
    StringBuffer sb = new StringBuffer ();
    int len;
    int i=0;
    char[] array = new char[10000];
    URL url = new URL("http://www.....");
    URLConnection connessione = url.openConnection();
    BufferedReader pagina = new BufferedReader(new InputStreamReader(connessione.getInputStream()));
     while ((len = pagina.read (array)) > 0){
                sb.append (array, 0, len);}
    System.out.println(sb);
    }
    catch (IOException e)
        {
            System.out.println(e);
        }
    }
    }
    Questo è il codice che ho creato, stampa a video tutta la pagina html.

    Per prima cosa volevo ringraziarvi ancora, in secondo luogo, mi servirebbe un altro aiuto.

    Il mio programma deve scaricare la pagina html per poi poterne ricavare dei dati, il problema è che deve farlo più volte al giorno, il più rapidamente possibile, allora per testarlo ho creato un ciclo (che scarica più volte la stessa pagina) anche per calcolarne i tempi e mi sono accorto che scarica la pagina sempre con lo stesso contenuto, anche se questo è cambiato, come per esempio una pagina di borsa: viene aggiornata ogni 5/10 secondi, ma il codice che mi appare è sempre uguale a quello della prima pagina scaricata.

    Mi sapreste indicare un comando per poter aggiornare la pagina prima di scaricarla?

    Grazie mille

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Cyocjo
    viene aggiornata ogni 5/10 secondi, ma il codice che mi appare è sempre uguale a quello della prima pagina scaricata.

    Mi sapreste indicare un comando per poter aggiornare la pagina prima di scaricarla?
    Non l'ho mai usato il seguente metodo ma la sua documentazione mi pare chiara:

    tuoUrlConn.setUseCaches(false);

    Da invocare prima della connessione "fisica".
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    105
    Come dici tu sei all inizio e de bello creare le cose da 0.
    cmq in futuro dai un occhio a progetti come
    http://hc.apache.org/httpclient-3.x/index.html

    che semplificano molto....
    a volte non serve reinventare la ruota.

  10. #10
    Utente di HTML.it
    Registrato dal
    Oct 2009
    Messaggi
    23
    codice:
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.net.MalformedURLException;
    import java.net.URL;
    import java.net.URLConnection;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    
    public class Main {
    
    
    
    public static void main(String[] args) throws MalformedURLException, IOException {
           
    try{
    StringBuffer sb = new StringBuffer ();
    int len;
    char[] array = new char[10000];
    String a;
    URL url = new URL("http://www...");
    URLConnection connessione = url.openConnection();
    connessione.setDoInput(true);
    connessione.setUseCaches(false);
    BufferedReader pagina = new BufferedReader(new InputStreamReader(connessione.getInputStream()));
     while ((len = pagina.read (array)) > 0){
                sb.append (array, 0, len);}
    a= sb.toString();
    Pattern p = Pattern.compile("");
    		Matcher m = p.matcher(a);
    
    		while (m.find()) {
    			System.out.println(m.group());}
    
           Pattern pa = Pattern.compile("");
           Matcher ma = pa.matcher(a);
    
    		while (ma.find()) {
    			System.out.println(ma.group());}
    }
    
    
    catch (IOException e)
        {
            System.out.println(e);
        }
    }
    }
    Questo è il codice che sono riuscito a creare, e fortunatamente funziona, anche se alla fine mi restituisce questa eccezione:
    Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at java.util.Arrays.copyOfRange(Arrays.java:3209)
    at java.lang.String.<init>(String.java:215)
    at java.lang.StringBuffer.toString(StringBuffer.java: 585)
    at javaapplication15.Main.main(Main.java:32)



    Avrei ancora una richiesta da farvi:

    l'ho testato facendo un ciclo che per cento volte scarica la pagina e trova determinati dati grazie alle regex, che poi mi fa apparire a video, solo che ho notato che il tempo di esecuzione è abbastanza alto (3 minuti e mezzo).
    Qualche consiglio per velocizzare il tutto (sempre se esiste)???
    può essere il fatto che io li faccia apparire a video piuttosto che inviarli direttamente al database che allunghi i tempi???
    Dovendo scaricare questi dati in tempi brevi (dati proveniente da 400 pagine in una decina di minuti da caricare in un database), mi risulta fondamentale metterci il minor tempo possibile, considerando anche che per connetrmi a 400 pagine diverse piuttosto che a una sola i tempi dovrebbero allungarsi (gia 3min e 30 x 4 =14 min sono troppi).

    Grazie ancora

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.