# Webseiteninhalte auslesen und auswerten



## 7bkahnt (4. Oktober 2010)

Hallo,
ich würde mir gern den Inhalt einer Website auslesen lassen und diese dann entsprechend auswerten. Ziel des ganzen ist es z.B. die Wettquoten der Bundesliga auf bwin auszulesen und  aufzulisten, damit ich nicht immer die bwin-Seite aufrufen und mich entsprechend zur Bundesliga navigieren muss. Kurzum Spielerei ^^.
Eigentlich müsste es ja mit folgendem Code funktionieren:


```
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("https://www.bwin.com/de/betViewIframe.aspx?SportID=4&bv=bb&selectedLeagues=0");
        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;
    }
}
```

Funktioniert bei vielen Seiten auch. Ich bekomme in einer temp.txt datei den fast kompletten Quellcode der bwin Seite zusehen. Aber ich sehe keine Quoten im Quelltext, der mir geoutprintleintelt wird  .
Wenn ich allerdings auf der bwin-Seite rechtsklick-->Framequelltext anzeigen klicke, sehe ich diese Quoten im Quelltext.
Mir ist aufgefallen, dass die url als Endung aspx hat. Muss ich da irgendetwas beachten?

Wäre echt dankbar für nen Tipp.

Grüsse


----------



## Thomas Darimont (4. Oktober 2010)

Hallo,

welche Quoten meinst du denn?

Hier wird auch alles Ausgegeben:

```
public class WebScraperExample {
	public static void main(String[] args) throws Exception{
		Scanner scanner = new Scanner(new URL("https://www.bwin.com/de/betViewIframe.aspx?SportID=4&bv=bb&selectedLeagues=0").openStream());
		while(scanner.hasNextLine()){
			System.out.println(scanner.nextLine());
		}
		scanner.close();
	}
}
```

Gruß Tom


----------



## 7bkahnt (5. Oktober 2010)

Hi Thomas,

danke erstmal für die schnelle Antwort.Ich meine die Wettquoten. Die blieben mir bisher verborgen.
Mit deinem Bsp. bekomme ich nur eine Zeile in der Console:

"java.util.Scanner[delimiters=\p{javaWhitespace}+][position=0][match valid=false][need input=false][source closed=false][skipped=false][group separator=\.][decimal separator=\,][positive prefix=][negative prefix=\Q-\E][positive suffix=][negative suffix=][NaN string=\Q?\E][infinity string=\Q?\E]"


Jetzt funktioniert es aber mit folgendem Code:

```
public static void main(String[] args) {
    	 File file = new File("temp.txt");
         FileOutputStream ausgabe = null;
			try {
				ausgabe = new FileOutputStream(file);
			} catch (FileNotFoundException e1) {
				e1.printStackTrace();
			}
			DataOutputStream raus = new DataOutputStream(ausgabe);
			String test=new WebsiteReader().getStrFromUrl("https://www.bwin.com/de/sportsbook.aspx");
			try {
				raus.writeBytes(test);
			} catch (IOException e) {
				e.printStackTrace();
			}
			System.out.println(test);
        
    }
    
    private String getStrFromUrl(String surl){
        final String userAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.8.1.12) Gecko/20080201 Firefox/2.0.0.12";
        String str=null;
        String str1=null; 
        try {
            URL url = new URL(surl);
            URLConnection conn = url.openConnection();
            conn.addRequestProperty("User-Agent", userAgent);
            
            BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
            
            str = new String();
            while ((str1 = in.readLine()) != null) {
                str = str +"\r\n"+ str1;
            } 
            in.close(); 
            return str;
            } catch (MalformedURLException e) 
            {   System.out.println( e.getMessage());
            } 
            catch (IOException e) 
            {   System.out.println( e.getMessage());
            }
            return str;
    }
```

Jetzt bekomme ich auch die js-skripte usw. zu Gesicht und auch die Quoten. Jetzt geht es nur noch ans auswerten^^. Das ist aber sehr aufwendig ne? Würde jetz mittels test.replace(....) alles einzeln auftrotteln und rausfiltern....

grüsse


----------



## dadom110 (6. Oktober 2010)

7bkahnt hat gesagt.:


> HJetzt geht es nur noch ans auswerten^^. Das ist aber sehr aufwendig ne?



Das "Problem" ist das die Seite nicht gerade unkomplex ist, aufgrund der vielen Javascript Spielerreien die sie haben. Ich hätte es jetzt mit Regex gemacht eek: jaja "HTML-Parsen mit Regex" - pfui), Thomas hat aber bestimmt noch einen ordentlichen HTML-parser an der Hand mit dem man so was sauber implementieren würde. Da ich so was bisher immer nur mit Python gemacht habe, habe ich mich mal auch in Java dran versucht und dabei ist so was "schmutziges" bei raus gekommen:


```
//Regex Pattern, das steht so im Quelltext drin, die Einträge: "((.)*?)" heissen so viel wie: ein beliebiges Zeichen (.) beliebig oft (*) bis zum ersten auftauchen des folge Strings (?)
// die klammern bilden die Gruppen 
Pattern patt = Pattern.compile(".*?</div>((.)*?)</td><td class='odd'>((.)*?)</td></tr></table>.*?");
Matcher matcher;

//Spielerei um die Match-Partner gegenüber an zuzeigen
String matchOut = "";
int first = 1;

//für jede Zeile in der Response
String line=getNextLine()
while (getNextLine() != null)
{
  matcher = patt.matcher(line);
  if (matcher.matches())
  {
  	//Erster Gegner
	if (first == 1)
	{
	  matchOut = String.format("%s (%s) :", matcher.group(1), matcher.group(3));
	}
	//zweiter Gegner
	else
	{
	  matchOut += String.format("%s (%s)", matcher.group(1), matcher.group(3));
	  System.out.println(matchOut);
	}
	first *= -1;

  }
	line=getNextLine();
}
```

Output:

```
Tschechien (1.62) : Schottland (5.25)
Moldawien (13.00) : Niederlande (1.20)
....
```

Grüße
Dom


----------



## 7bkahnt (7. Oktober 2010)

Das sieht ja top aus. Ich hatte es bisher etwas mühseeliger gemacht. Indem ich jedes einzelne Zeichen gereplaced habe aus dem String ^^
Da macht es sich doch mit dem .compile deutlich besser...

Mir ist da auch noch ein Problem aufgefallen, dass bwin anscheinend die Seiten ändert.
Beispielweise wollte ich mir mal alle Quoten vom Fussball aufrufen lassen. Das ist mir am ersten Tag mit dieser Seite gelungen:

https://www.bwin.com/de/betviewifra...s=133&bv=bb&ShowDays=2147483647&currentPage=1

Heute seh ich, dass mir mit dem Link nicht mehr alle Spiele angezeigt werden (2  3 Spiele weniger)
bis ich gesehn habe dass sich die Adresse des Frames geändert hat:
https://www.bwin.com/de/betviewifra...s=168&bv=bb&ShowDays=2147483647&currentPage=1

Habt ihr da einen Rat bzw. Erfahrung?^^ Hab das ganze auch mal bei bet365.com probiert, weil die manchmal bessere Quoten haben, aber da kann ich ja gleich gar nichts rausfiltern... Da komme ich immer nur auf JavaScript-Methoden.... :-(
Scheint doch schwerer als gedacht zu werden...

grüsse und schönes we ;-)


----------



## FutureTechnic (17. Juni 2017)

Auch wenn dir das vermutlich nicht mehr hilft, da es schon "etwas" länger her ist antworte ich einfach mal für alle die mit dem gleichen Problem zu kämpfen haben:

Da es ziemlich schwer, bis komplett unmöglich ist heraus zu finden, wie die URL generiert wird würde ich dir raten, eine Seite zu suchen, die eine feste URL hat, wie zum Beispiel die Startseite.

Dort schreibst du dir dann einen kleinen Algorithmus, der dir die gesucht URL aus dem Quellcode zieht. Das sollte in den meisten Fällen kein Problem darstellen, da die URL trotzdem Übergabeparameter beinhaltet deren Werte sich zwar ändern, bei denen jedoch der Name gleich bleibt.

Wenn die URL also beispielsweise www.google.de/seite?code=187246917824 ist, dann kann sich zwar der wert, also "187246917824" ändern, der Name des Attributes, in diesem Fall "code" wird aber zu 99% gleich bleiben. Nach diesem Namen suchst du also im Code und kannst dir somit immer die aktuelle URL von der Seite ziehen.


----------

