domingo, 23 de enero de 2011

JAVA bajar código fuente de una URL Bit a Bit

Sin mucha explicación y con una enorme falta de sueño, no se me ocurre otra cosa que comprobar... bueno mas que comprobar desarrollar un programa para bajar el código fuente de cualquier URL. De esta forma analizarlo y encontrar las imágenes (solo las etiquetas <img src="">, se podría ampliar fácilmente para que buscase también en las hojas CSS) y una vez obtenido, descargarlas en el ordenador local. Para los curiosos y de mas que quieran echar un vistazo os paso el código fuente.

Descargamos el código fuente de la URL que le pasamos y nos devuelve en un vector linea a linea.
public Vector<String> scanURL(final URL u) {
          InputStream is = null;
          DataInputStream dis;
          Vector<String> s=new Vector<String>();
          try {
             is = u.openStream();
             dis = new DataInputStream(new BufferedInputStream(is));
             String l;
             while ((l = dis.readLine()) != null) {
                s.addElement(l);
                //System.out.println(l);
             }
          } catch (MalformedURLException mue) {
             mue.printStackTrace();
             System.exit(1);
          } catch (IOException ioe) {
             ioe.printStackTrace();
             System.exit(1);
          } finally {
             try {
                is.close();
                return s;
             } catch (IOException ioe) {
                 ioe.printStackTrace();
             }
          }
    return s;}

El método que descarga la imagen URL al directorio que le pasamos.
public static boolean saveFile(URL dir,String file){
         try {
                URLConnection yc = dir.openConnection();
                java.io.InputStream in = yc.getInputStream();
                File f = new File(file);
                f.createNewFile();
                FileOutputStream out = new FileOutputStream(f, false);
                byte[] lectura = new byte[512];
                int leido = 0;
                while ((leido = in.read(lectura)) > 0) {
                    out.write(lectura, 0, leido);
                }
                in.close();
                out.close();
                return true;
            } catch (Exception ex) {
                ex.printStackTrace();
            }
    return false;}

Método que busca las etiquetas correspondientes para localizar las imágenes.
public static Vector<String> searchIMG(Vector<String> base){
        String todo = "";
        int tagSrcI=0;
        int tagSrcF=0;
        Vector<String> jpg=new Vector<String>();
        for(int i=0;i<base.size();i++)todo+=base.elementAt(i);
       
        for(int pos=0;;){
            int tagImg=todo.indexOf("<img",pos);
            if(tagImg>pos){
                tagSrcI=todo.indexOf("src",tagImg);
                tagSrcF=todo.indexOf(" ",tagSrcI);
                String imgJpg=todo.substring(tagSrcI+5, tagSrcF-1);
                pos=tagSrcF;
                jpg.addElement(imgJpg);
            }
            if(todo.indexOf("<img",tagSrcF)<tagSrcF)return jpg;
        }
    }

Y por último aquí tenemos el MAIN que lo ejecuta todo.
    public static void main(String[] args) {
        String directorio="/home/TuUSUARIO/Escritorio/";
        Vector<String> base=new Vector<String>();
        try {
            DataURL link=new DataURL();
            base=link.scanURL(new URL("http://DOMINIO.com"));
            Vector<String> img=searchIMG(base);
            for(int i=0;i<=img.size()-1;i++){
                if(new Save(new URL(img.elementAt(i)), directorio+"copia"+i) != null){
                    System.out.println("Listo");
                }
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
    }

un saludo