Webseiten herunterladen und speichern

Aus Byte-Welt Wiki

Folgender, sehr einfacher, vollständiger Code zeigt, wie man Webseiten mit Java downloaden und auf der Festplatte speichern kann:

import java.io.*;
import java.awt.*;
import java.awt.event.*;
import java.net.*;
import java.util.*;
import javax.swing.*;
import javax.swing.filechooser.*;

/**
 * GrapHtmlDemo zeigt, wie man mit Java Quelltext von Webseiten herunterladen und speichern kann.
 *
 * @author Gernot Segieth
 */
public class GrapHtmlDemo {
   private final JFrame frame;
   private JTextField targetField;
   private JTextArea tArea;
   private JTabbedPane tabbedPane;
   private JFileChooser chooser;

   public GrapHtmlDemo(String title) {
      JPanel panel = new JPanel(new BorderLayout(0, 5));
      panel.setBorder(BorderFactory.createEmptyBorder(10, 5, 10, 5));
      targetField = new JTextField();
      targetField.addActionListener(new TargetFieldAction());
      tabbedPane = new JTabbedPane();
      tabbedPane.setTabPlacement(JTabbedPane.BOTTOM);
      tArea = new JTextArea();
      tabbedPane.addTab("HTML-Code", new JScrollPane(tArea));

      panel.add(createNorthPanel(), BorderLayout.NORTH);
      panel.add(tabbedPane, BorderLayout.CENTER);
      panel.add(createSouthPanel(), BorderLayout.SOUTH);

      chooser = new JFileChooser();
      FileNameExtensionFilter filter = new FileNameExtensionFilter(
        "Plain Text", "txt", "html", "css", "js");
      chooser.setFileFilter(filter);
      
      frame = new JFrame(title);
      Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
      frame.setSize(dim.width * 66 / 100, dim.height * 66 / 100);
      frame.setLocationRelativeTo(null);
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.add(panel);
      frame.setVisible(true);
   }

   private JPanel createNorthPanel() {
      JPanel panel = new JPanel(new BorderLayout(5, 0));
      panel.add(new JLabel("URL:"), BorderLayout.WEST);
      panel.add(targetField, BorderLayout.CENTER);
      panel.add(new JButton(new TargetFieldAction("Los!")), BorderLayout.EAST);
      return panel;
   }

   private JPanel createSouthPanel() {
      JPanel panel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
      panel.add(new JButton(new StoreAction("Speichern")), BorderLayout.EAST);
      return panel;
   }

   private void getContent() {
      if(tabbedPane.getTabCount() > 1) {
         tabbedPane.remove(1);
      }
      String urlString = targetField.getText().trim();
      if(!urlString.startsWith("http")) {
         urlString = "https://" + urlString;
         targetField.setText(urlString);
      }
      try {
         tArea.setText(null);
         readContent(new URL(urlString));
      }
      catch(Exception ex) {
         JTextArea eArea = new JTextArea(ex.toString());
         eArea.setBackground(Color.PINK);
         tabbedPane.addTab("Error", new JScrollPane(eArea));
         tabbedPane.setSelectedIndex(1);
      }
   } 

   private void readContent(URL url) throws Exception {
      Scanner scan = new Scanner(url.openStream());
      if (scan != null) {
         while(scan.hasNextLine()) {
            tArea.append(scan.nextLine()+"\n\r");
         }
      }
   }

   private void storeContent() {
      String text = tArea.getText();
      if(!text.isEmpty()) {
         int result = chooser.showSaveDialog(frame);
         if(result == JFileChooser.APPROVE_OPTION) {
            File file = chooser.getSelectedFile();
            try {
               BufferedWriter writer = new BufferedWriter(new FileWriter(file));         
               writer.write(text);
               writer.flush();
               writer.close();
            } catch(IOException e) {
               System.err.println(e);
               JOptionPane.showMessageDialog(frame, e.getClass().getName(),
                  "ERROR: Fehler beim Schreiben der Datei auf den Datenträger!",
                  JOptionPane.ERROR_MESSAGE);
            }
         }
      }
   }

   public static void main(String[] args) {
      try {
         UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
      }
      catch(Exception e) {
         System.err.println(e);
      }

      SwingUtilities.invokeLater(new Runnable() {
         @Override
         public void run() {
            new GrapHtmlDemo("HTML-Code von Webseiten");
         }
      });
   }

   class TargetFieldAction extends AbstractAction {
      TargetFieldAction() {
         this(null);
      }
      
      TargetFieldAction(String text) {
         super(text);
      }
      
      @Override
      public void actionPerformed(ActionEvent e) {
         getContent();
      }
   }

   class StoreAction extends AbstractAction {
      StoreAction(String text) {
         super(text);
      }
      
      @Override
      public void actionPerformed(ActionEvent e) {
         storeContent();
      }
   }

}