Avatar billede r9 Nybegynder
12. marts 2003 - 14:29 Der er 10 kommentarer og
2 løsninger

Tjek jævnligt om en hjemmeside har ændret sig?

Vedr: http://www.eksperten.dk/spm/327739
Jeg leder efter et program som jævnligt kan tjekke om en hjemmeside har ændret sig siden sidst man tjekkede.

Jeg ønsker at programmet skal køre som en lille service på min maskine, og tjekke på en bestemt hjemmeside ca. 1 gang om dagen.

Hvordan kunne dette løses i Java/JSP
Avatar billede arne_v Ekspert
12. marts 2003 - 14:45 #1
Du skal have:

1)  noget der kan hente siden
2)  noget der kan køre programmet 1 gang om dagen
3)  noget der kan checke om siden er ændret

#1 kan sagtens laves i Java (med en HttpURLConnection).

#2 kan også laves i Java, men jeg tror at en BAT-fil som køres
aff Windows scheduler eller en SH-fil som køres af Unix cron
vil være bedre.

#3 er nem at lave i java. Man har nyeste fil og sidste fil og så
sammenligne rman bare byte for byte om de er ens.
Avatar billede magoo20000 Nybegynder
12. marts 2003 - 14:51 #2
Du skal jo hente hovedsiden og alle de underliggende sider på domænet.
Du kan nemt hente html'en fa hovedsiden, men der bliver nogle problemer med de underliggende sider.... Hmmm.. Evt. kan du se her: http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.4 Det omhandler HTTP 1.1's HEAD kommando - du kan evt. bruge Last Modified.
Avatar billede magoo20000 Nybegynder
12. marts 2003 - 14:55 #3
Du skal lave en rekursiv traversering af domænet for at få alle undersider med. Forresten mener jeg at have en løsning i Perl fra engang i tidernes morgen..
Avatar billede arne_v Ekspert
12. marts 2003 - 15:01 #4
Det er *meget* svært at lave en fornuftig traversering nu om dage.

Man skal have en rimelig heftig HTML *og* JavaScript parser
for at få alle links med.

Men er det nødvendigt at få under-sider med ?
Avatar billede r9 Nybegynder
12. marts 2003 - 15:20 #5
Jeg skal IKKE have undersiderne med.

Arne:
Kan du give et eks. på nr. 1 ?

Nr 2+3 skulle være ligetil.
Avatar billede arne_v Ekspert
12. marts 2003 - 15:33 #6
#1 er heller ikke svær. Her er et lille eksempel:

import java.net.*;
import java.io.*;

public class HttpGet {
  public static void main(String[] args) {
      try {
        URL url = new URL("http://www.eksperten.dk/");
        HttpURLConnection con = (HttpURLConnection)url.openConnection();
        con.connect();
        if(con.getResponseCode() == HttpURLConnection.HTTP_OK) {
            InputStream is = con.getInputStream();
            OutputStream os = new FileOutputStream("z.z");
            byte[] b = new byte[1000];
            int n;
            while((n = is.read(b)) >= 0) {
              os.write(b,0,n);
            }
            os.close();
            is.close();
        }
        con.disconnect();
      } catch (MalformedURLException e) {
        e.printStackTrace();
      } catch (FileNotFoundException e) {
        e.printStackTrace();
      } catch (IOException e) {
        e.printStackTrace();
      }
  }
}
Avatar billede magoo20000 Nybegynder
12. marts 2003 - 16:48 #7
Hvis ingen undersider skal med burde arnes opskrift være ligetil!
Avatar billede r9 Nybegynder
12. marts 2003 - 22:28 #8
arne:

Nu har jeg lavet det sådan at den tjekker, samligner, og kopier den nye fil over i den gamle fil i tilfælde af at siden har ændret sig.



public void getURL() {

        try {
            URL url = new URL(URL);
            HttpURLConnection con = (HttpURLConnection) url.openConnection();
            con.connect();
            if (con.getResponseCode() == HttpURLConnection.HTTP_OK) {
                InputStream is = con.getInputStream();
                OutputStream os = new FileOutputStream(filNavnNew);

                byte[] b = new byte[10000];
                int n;

               
                while ((n = is.read(b)) >= 0) {
                    os.write(b, 0, n);
                }
                os.close();
                is.close();

            }

            con.disconnect();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public boolean copyFile() {
        try {
            BufferedInputStream in = new BufferedInputStream(new FileInputStream(new File(this.filNavnNew)));
            BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(new File(this.filNavnOld)));
            int data;
            while ((data = in.read()) != -1) {
                out.write(data);
            }
            in.close();
            out.close();
        } catch (IOException e) {
            return false;
        }
        return true;
    }


    public boolean Compare() {
        boolean res = true;
        try {
            BufferedInputStream ny = new BufferedInputStream(new FileInputStream(new File(this.filNavnNew)));
            BufferedInputStream old = new BufferedInputStream(new FileInputStream(new File(this.filNavnOld)));

            byte[] nyArray = new byte[10000];
            ny.read(nyArray);

            byte[] oldArray = new byte[10000];
            old.read(oldArray);

            for (int i = 0; i < nyArray.length; i++) {
                if (oldArray[i] != nyArray[i]) {
                    res = false;
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
        return res;
    }



Kan du give et hint til hvordan man får undersiderne med?
Avatar billede arne_v Ekspert
12. marts 2003 - 22:39 #9
For at få undersiderne med skal du finde alle linkene.

Først og fremmest
  <A HREF="detteher">
men der er også andre måder at lave links på.

Med en overordnet logik som:

create queue
enqueue start url
while queue not empty {
  dequeue url from queue
  get url to strig
  parse string and enqueue all links to queue
}

Det er ret nemt.

Den tricky part er at parse HTML'en korrekt.
Avatar billede r9 Nybegynder
13. marts 2003 - 08:41 #10
takker
Avatar billede r9 Nybegynder
13. marts 2003 - 09:00 #11
arne:

hvad gør man hvis man vil tjekke på en html side som ligger intern?

F.eks. \\server\test.htm

Hvis man bruger HttpURLConnection, så får man en java.net.MalformedURLException: no protocol....
Avatar billede arne_v Ekspert
13. marts 2003 - 13:46 #12
Så springer du HttpUrlConnection hent til fil over og åbner bare
filen direkte.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester