Informatiker Board (http://www.informatikerboard.de/board/index.php)
- Themengebiete (http://www.informatikerboard.de/board/board.php?boardid=1)
-- Praktische Informatik (http://www.informatikerboard.de/board/board.php?boardid=6)
--- Internetseite mit jsoup crawlen [java] (http://www.informatikerboard.de/board/thread.php?threadid=3245)


Geschrieben von matt99 am 24.10.2016 um 20:34:

  Internetseite mit jsoup crawlen [java]

Hallo, ich möchte eine Internetseite mit Java (jsoup) durchstöbern. Diese Internetseite hat jedoch mehrere Seiten, welche ich alle nacheinander einmal besuchen möchte und anschließend alle Zahlen der entsprechenden Seite ausgeben soll. Ich habe zwar eine grobe Idee, wie das Programm eine Seite nach der anderen durchsucht, jedoch scheitert es an der Umsetzung.

Mein bisheriger Code:
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;

public class crawler {
  private static final int ms_timeout = 5000;
  
  public static void main(String[] args) throws MalformedURLException, IOException
  {
    Document doc = Jsoup.parse(new URL("eineinternetseite.de"), ms_timeout);

    String htmlString = doc.toString();
    
	Pattern pattern = Pattern.compile("\\d+");
	Matcher matcher = pattern.matcher(htmlString);
	
	while(matcher.find())
	{
		System.out.println(matcher.group());
	}
  }
  
}


Meine Idee: Einen Integer nach der URL setzen, welche solange hochgerechnet wird bis das "Ende der Internetseite" erreicht ist, bzw. einfach keine weitere Seite mehr kommt.
Mein Vorteil ist, dass die Internetseite durch ein /page sich trennt. Also:
eineinternetseite.de/page/1 ist Seite 1, eineinternetseite.de/page/2 ist Seite 2, usw.

code:
1:
    Document doc = Jsoup.parse(new URL("eineinternetseite.de/page/" + i), ms_timeout);


Wenn ich jedoch i als Integer definiere, dessen Startwert 1 ist und dann jedesmal i++ durchgeht, bekomme ich eine Fehlermeldung, dass der Typ static sein muss. Und an diesem Punkt kann ich diesen Integer auch nicht mehr erhöhen.



Geschrieben von eulerscheZahl am 25.10.2016 um 13:56:

 

Klingt, als hättest du i außerhalb der main definiert.
Markiere es dann auch als static oder verschiebe die Variablendeklaration in die main Methode (die zweite Alternative ist zu bevorzugen).



Geschrieben von matt99 am 25.10.2016 um 16:40:

 

Tatsächlich war es nur nicht in der main-Methode. Das ist das nicht gleich gesehen habe...

Danke!

Weißt du auch zufällig eine Möglichkeit, das Ende einer Seite zu bekommen? Wenn die Internetseite nur 10 Seiten hat, dann kriege ich ab Seite 11 eine Exception. Kann man das irgendwie mit einer while-Schleife, o.ä. abfangen? Im Endeffekt soll mein i solange erhöht werden, bis das ende der Website gefunden wurde.



Geschrieben von eulerscheZahl am 25.10.2016 um 17:44:

 

ungetestet:
code:
1:
2:
3:
4:
5:
6:
7:
for (int i = 1; ; i++) { //hier keine Abbruchbedingung
    try {
        //load page i
    } catch (Exception ex) {
        break; //hier wird die Schleife verlassen
    }
}



Geschrieben von matt99 am 25.10.2016 um 17:53:

 

Funktioniert :) Besten dank


Forensoftware: Burning Board, entwickelt von WoltLab GmbH