# WebCrawler mit Datenbank



## WinterMensch (2. Jul 2015)

Hallo,
Vorab: Bei mir ist es schon ein wenig her als ich das letzte Mal etwas mit Java programmiert habe.
Von Datenbanken habe ich bis jetzt auch noch nicht so viel Ahnung.

Ich habe ein kleines Programm gefunden, was alle Links einer Webseite nach einem Stichwort durchsucht und alle Treffer (d.h. die Links) in einer Datenbank speichert. 

Hier der Code:


```
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;

public class WebsiteReader {
    final String[] KEYWORDS = {"."};
    public static void main(String[] args) {
        long time = System.currentTimeMillis();
        new WebsiteReader().doIt("http://www.computerwoche.de/");
        System.out.println(System.currentTimeMillis() - time);
    }
 
 
    private void doIt(String s) {
        // TODO Auto-generated method stub
 
        BufferedReader br = null;
        InputStreamReader isr = null;
        URL url = null;
        try {
            url = new URL(s);
        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
 
        if (url != null) {
            try {
                isr = new InputStreamReader(url.openStream());
            } catch (IOException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
            br = new BufferedReader(isr);
 
            String line = null;
            File file = new File("temp.txt");
            FileOutputStream ausgabe = null;
            try {
                ausgabe = new FileOutputStream(file);
            } catch (FileNotFoundException e1) {
                e1.printStackTrace();
            }
            DataOutputStream raus = new DataOutputStream(ausgabe);
            try {
                while ((line = br.readLine()) != null) {
                    if (checkKeyWords(line)) {
                        try {
                            raus.writeBytes(line+"\n");
                        }
                        catch (IOException e) {
                        }
                        System.out.println(line);
                    }
                }
 
            } catch (IOException e2) {
                // TODO Auto-generated catch block
                e2.printStackTrace();
            }
 
        }
 
    }
 
 
    private boolean checkKeyWords(String line) {
        // TODO Auto-generated method stub
 
        for (int i = 0; i < KEYWORDS.length; i++) {
            if (line.indexOf(KEYWORDS[i]) >= 0)
                return true;
        }
 
        return false;
    }
}
```

Im Beispiel wird phpMyAdmin und MySQL verwendet.
Und jetzt meine Frage:
Gibt es für den Anfang vielleicht irgendetwas einfacheres? Und wenn ja, wie könnte man da die Links speichern?
Oder wenn nicht, gibt es vielleicht eine gute Anleitung wie man eine Datenbank einrichtet?

Am Ende möchte ich übrigens nicht die Links sondern die Inhalte der Links erhalten, aber das ist für den Anfang erstmal nicht so wichtig.

Vorab schonmal vielen Dank für eventuelle Hilfe


----------



## Diabolus (3. Jul 2015)

Du könntest es natürlich in einer ganz normalen Datei speichern, allerdings empfehle ich dir für größere Datenmengen doch lieber eine Datenbank!


----------



## WinterMensch (4. Jul 2015)

Ok, und wie würde man das am Besten machen?
Ich kenne mich ja leider nicht gut damit aus ..


----------



## Joose (6. Jul 2015)

WinterMensch hat gesagt.:


> Ok, und wie würde man das am Besten machen?



Wie würde man was am besten machen? Stelle konkretere Fragen.
Wo genau liegt nun das Problem?



WinterMensch hat gesagt.:


> Ich kenne mich ja leider nicht gut damit aus ..



Mit was kennst du dich nicht gut aus? Java, Datenbanken, Internet?


----------



## WinterMensch (14. Jul 2015)

Hallo,

Entschuldigung für meine spärlichen Antworten. 
Ich meinte, dass ich mich nicht gut mit Datenbanken auskenne.

Mittlerweile habe ich das Programm zum Laufen gebracht und die Links werden in einer Datenbank gespeichert.
Ich benutze jetzt PHPMyAdmin und MySQL.
Die Datenbank heißt crawler und die Tabelle record.
Der Code in meinem Eclipse Projekt sieht so aus:

Klasse DB für die Datenbank:


```
public class DB {
    public Connection conn = null;
    public DB() {
        try {
            Class.forName("com.mysql.jdbc.Driver");
            String url = "jdbc:mysql://localhost:3306/Crawler";
            conn = DriverManager.getConnection(url, "root", "");
            System.out.println("conn built");
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
    public ResultSet runSql(String sql) throws SQLException {
        Statement sta = conn.createStatement();
        return sta.executeQuery(sql);
    }
    public boolean runSql2(String sql) throws SQLException {
        Statement sta = conn.createStatement();
        return sta.execute(sql);
    }
    @Override
    protected void finalize() throws Throwable {
        if (conn != null || !conn.isClosed()) {
            conn.close();
        }
    }
}
```

Klasse Main für den Crawler:


```
import java.io.IOException;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
public class Main {
   public static DB db = new DB();
   public static void main(String[] args) throws SQLException, IOException {
     db.runSql2("TRUNCATE Record;");
     processPage("http://www.computerwoche.de");
   }
   public static void processPage(String URL) throws SQLException, IOException{
     //check if the given URL is already in database
     String sql = "select * from Record where URL = '"+URL+"'";
     ResultSet rs = db.runSql(sql);
     if(rs.next()){
     }else{
       //store the URL to database to avoid parsing again
       sql = "INSERT INTO  `Crawler`.`Record` " + "(`URL`) VALUES " + "(?);";
       PreparedStatement stmt = db.conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
       stmt.setString(1, URL);
       stmt.execute();
       //get useful information
       Document doc = Jsoup.connect("http://www.computerwoche.de/").get();
       if(doc.text().contains("Apple")){
         System.out.println(URL);
       }
       //get all links and recursively call the processPage method
       Elements questions = doc.select("a[href]");
       for(Element link: questions){
         if(link.attr("href").contains("computerwoche.de"))
           processPage(link.attr("abs:href"));
       }
     }
   }
}
```

So weit so gut.
Ich glaube, dass ich nicht die richtigen Links erhalte denn gibt man bei Computerwoche "Apple" ein erhält man andere Artikel.
Werden hier überhaupt die Inhalte der Links durchsucht?
Kann man zusätzlich zu den Links auch die Inhalte der Seiten in die Datenbank speichern?
Das wäre super.
Vielen Dank schonmal


----------

