Beste Lösung: Senden, empfangen und analysieren von webserverdaten

D

dev4all

Neues Mitglied
0
Hallo Mitglieder,

Dies ist mein erster Beitrag hier und ich brauche eure Hilfe.
Ich möchte ein Android App schreiben.
Mich interessiert Fussball.
In Bayern haben wir ein Fußball-Ergebnis-System vom BFV (Bayerischer Fußball-Verband).

siehe diesen Link
Ergebnisse

Meine Idee ist nun ein App für Android zu schreiben.

Ich habe die Webseite analysiert.
1. in Form "Suche nach Ligen" (Search Ligen) können Bezirke, Kreise und Ligen ausgewählt werden
In verschiedenen Bezirken gibt unterschiedliche Kreise und Ligen. Wenn nun der Bezirk ausgwählt wird werden die weiteren Auswahlmöglichkeiten für Kreis und Ligen dynamisch erstellt.
Dies wird durch die Funktion ChangeBezirk (bezirkId) in selectboxes.js getan

2. Drückt man nun den Button "Suche starten" starten Sie die Funktion "javascript: submitIt ('combine')"

Die Funktion submitIt baut eine URL aus den verschiedenen Einträgen im Eingabeformular (mit Hilfe von function GET-Parameter) zusammen und sendet diese mit Hilfe der 2 Zeilen
document.formLigaPublicErgebnisse.action url =;
document.formLigaPublicErgebnisse.submit ();
zum Webserver.

Ein Beispiel für die erstellet URL:
"http://ergebnisse.bfv.de/cms/seiten/ligaPublicErgebnisse.do?reqCode=save&vereinsname=&bezirk_id=99&kreis_id=0&spielklasse_id=0&altersklasse_id=10&geschlecht_id=1&spieltyp_id=1&filterType=combine"


Code:
function submitIt(filterType) { 
// Bei der Suche nach Vereinen muss ein Suchkriterium angegeben sein
var vereineSearchOk = false;
var suchfeldVerein = document.formLigaPublicErgebnisse.vereinsname.value;
suchfeldVerein = trim(suchfeldVerein);
if (suchfeldVerein.length != '' && suchfeldVerein.length > 0) {
vereineSearchOk = true;
}        
if (filterType != 'vereine' || vereineSearchOk) {
var url = 'ligaPublicErgebnisse.do?reqCode=save';
url += getParameter();
url += '&filterType=' + filterType;
document.formLigaPublicErgebnisse.action = url;
document.formLigaPublicErgebnisse.submit();
}
}
function showTab(tab) {
var url = 'ligaPublicErgebnisse.do?reqCode=edit&showErgebnisse=1&liga_id=0';
url += getParameter();
url += '&filterType=combine&tab=' + tab + '#tabanker';
document.formLigaPublicErgebnisse.action = url;
document.formLigaPublicErgebnisse.submit();
}
function getParameter() {
var url = '';
// Die Filtereinstellungen in der URL setzen, damit der User die URL bookmarken kann
url += "&vereinsname=" + document.formLigaPublicErgebnisse.vereinsname.value;
url += "&bezirk_id=" + document.formLigaPublicErgebnisse.bezirk_id.value;
url += "&kreis_id=" + document.formLigaPublicErgebnisse.kreis_id.value;
url += "&spielklasse_id=" + document.formLigaPublicErgebnisse.spielklasse_id.value;
url += "&altersklasse_id=" + document.formLigaPublicErgebnisse.altersklasse_id.value;
url += "&geschlecht_id=" + document.formLigaPublicErgebnisse.geschlecht_id.value;
url += "&spieltyp_id=" + document.formLigaPublicErgebnisse.spieltyp_id.value;
return url;
}
Nach dem Absenden der Anfrage erhalten ich das Ergebnis in der Tabelle "Ligaliste"


Nach der Analyse der Seite habe ich versucht ein App zu schreiben.
Ich sende zuerst die generierte URL an den Server und durchsuche den Quellcode nach dem Titel "iVerein finden myString.indexOf = (" <title> ");"

Code:
public class GetDataFromTheWeb extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);

        /* We will show the data we read in a TextView. */
        TextView tv = new TextView(this);
        
        /* Will be filled and displayed later. */
        String myString = null;
        Integer iVerein = 0;
        String sVerein = null;
        //String Verein = "Verein";
        try {
            /* Define the URL we want to load data from. */
            URL myURL = new URL(
                "http://www.bfv.de/cms/seiten/ligaPublicErgebnisse.do?reqCode=edit&showErgebnisse=1&liga_id=38775&vereinsname=tsv%20brunn&bezirk_id=4&kreis_id=0&spielklasse_id=0&altersklasse_id=10&geschlecht_id=1&spieltyp_id=2&filterType=vereine&tab=2#tabanker");
            /* Open a connection to that URL. */
            URLConnection ucon = myURL.openConnection();

            /* Define InputStreams to read 
             * from the URLConnection. */
            InputStream is = ucon.getInputStream();
            BufferedInputStream bis = new BufferedInputStream(is);
            
            /* Read bytes to the Buffer until 
             * there is nothing more to read(-1). */
            ByteArrayBuffer baf = new ByteArrayBuffer(50);
            int current = 0;
            while((current = bis.read()) != -1){
                baf.append((byte)current);
            }

            /* Convert the Bytes read to a String. */
            myString = new String(baf.toByteArray());
            //iVerein = new String((myString.indexOf("<title>"))());
            iVerein = myString.indexOf("<title>");
            sVerein = iVerein.toString();
            myString = myString.substring(iVerein+7,iVerein+17);
        } catch (Exception e) {
            /* On any Error we want to display it. */
            myString = e.getMessage();
            
        }
        
        /* Show the String on the GUI. */
        tv.setText(myString);
        //tv.setText(sVerein);
        this.setContentView(tv);
    }
}
Jetzt bin ich an einem Punkt angekommen wo ich nicht mehr weiß wie ich mein Project weiterführen kann.

Ich habe viele Fragen.
1. Ist der beste Weg das Ergebnis der Anfrage über den Quellcode zu analysieren? Meiner Meinung Nein. Es muss eine bessere Lösung geben.
2. Ich weiß nicht wie die Suchergebnisse mit dem 2-Befehl erzeugt wird?
document.formLigaPublicErgebnisse.action url =;
document.formLigaPublicErgebnisse.submit ();
Können ihr mir helfen?

3. Ist formLigaPublicErgebnisse eine Art von Klasse und wo ist formLigaPublicErgebnisse gespeichert?
4. Ist es möglich den Zugriff auf die Funktionen direkt zu bekommen? Ist ja in JavaScript geschrieben.
5. Was ist ligaPublicErgebnisse.do? Wo ist die Funktion auf dem Webserver gespeichert?

Ich denke, der beste Weg wäre folgender.
1. Es ist eine Datenbank mit allen erforderlichen Daten auf dem Webserver vorhanden.
2. Zugriff auf die Datenbank direkt über JavaScript-Funktionen in Android Apps.
3. Antworten,Ergebnisse in Android App weiterverarbeiten?
Welcher Meinung seit ihr?

Danke für eure Hilfe!
Gruß
dev4all
 
Du wirst niemals direkten zugriff auf die Datenbanken bekommen ;) Ansich ist der Ansatz garnicht sooo falsch ;) Wie bereits von dir erwähnt, ist in dem fall das crawln (sourcecode scannen) der einzige weg. Du solltest die richtigen http urls rausfinden und ein einfachen request senden und diese antwort kannst du ziemlich leicht mit Regex Parsen =) Ist nicht sehr kompliziert. Wenn de das getan hast, solltest du threading einbauen... sprich request ins web können mal ne weile dauern und deine app sollte ja nicht stehen bleiben =) Also das "Request senden -> Antwort bekommen -> Source parsen" in ein Thread auslagern... ist der Thread fertig, schickst du ein delegate in deine app, damit diese die Daten nun aktualisieren kann. Fertig =)
 
Ganz nebenbei: Bitte vorher abklären, ob du dazu berechtigt bist.
Man darf nämlich nicht die Daten einer Website auslesen und in der eigenen App wieder bereitstellen.

Gruß Manu
 
Hallo Leute,

danke für eure Antworten.

@MichaelS
Du schreibst ich soll die richtigen urls herausfinden. Dies wird aber gar nicht so einfach da ja die url dynamisch erstellt wird. Dabei werden die Bezirke, Kreise und Ligen in Nummer umgesetzt
(bezirk_id=99&kreis_id=0&spielklasse_id=0&alterskla sse_id=10&geschlecht_id=1&spieltyp_id=1&filterType =combine")
Ich muss also zunächst alle möglichen Zuordnungen kennen. Nur dann kann ich die url bilden.
Hast du dazu eine Idee?

Was ist genau ist Regex Parsen? Kann du mir ein Beispiel nennen?

Kann ich nicht einfach externe Javascript verwenden?

Es gibt vom BFV auch ein anderes Widget mit dem man die aktuelle Tabelle in die eigene Homepage einbinden kann. Hier wird auch eine externe Funktion verwendet: tmwrWidgetFunctions.js

Code:
<script type="text/javascript" src="http://ergebnisse.bfv.de/javascript/widgets/tmwrWidgetFunctions.js">
</script>
<p>
&nbsp;
</p>
<p>
&nbsp;
</p>
<center><b>Tabelle und Ergebnisse 1.Mannschaft</b> 
<p>
&nbsp;

</p>
<p>
&nbsp;
</p>
<div id="meineLiga_1">
... lade Liga ... 
</div>
<script type="text/javascript">
var liga = new BFVLigaWidget();
liga.setzeLigaNr('2221041012');
liga.setzeVereinNr('4236');
liga.zeigeErgebnisse('meineLiga_1');</script>
<p>
&nbsp;
</p>
@manu:
Danke für den Hinweis. Ich will ja erste einmal generell ausprobieren wie ob dies funktionieren könnte

Gruß
dev4all
 
warum machst du dir das so schwer. eigentlich ist es ganz simpel. soweit ich das verstanden habe ist das deine Webseite.

Wie du richtig sagtest, ein direkter zugriff auf Datenbanken im web ist nicht sinvoll. Deshalb holt man sich die nötigen Daten für die App von einer Webseite über einen Get/Post Request.

Dafür brauchst du eine art API, eig REST API welche dir Daten liefern kann. Dies ist nichts anderes als ein Skript/eine URL deiner Webseite die dann aber kein layout/ keine darstellung wiedergibt sondern nur Daten in einer bestimmten Form, z.B. Xml oder Json.

Ich weiß nicht wie deine Verzeichnisstruktur in deinem Projekt ist. Aber sagen wir mal du willst alle FBVereine einfach nur auflisten. Das ist ein einfacher Get Request. Du schreibst z.B. ein PHP Skript und legst es ab in www.meineseite.de/rest/getAllClubs.php

In getAllClubs.php werden die Daten aus der DB ausgelesen und in eine Form gebracht, ich nehme immer JSON. In Php gibt es bequeme Methoden wie man JSON aus einem Array von DB Daten erzeugen kann und in Java wie man aus Json wieder ein Datenarray bekommt, etwa so

Code:
JSONArray jArray = new JSONArray(json)
jArray lässt sich durchlaufen und mit
Code:
getJSONObject(stelle)
jedes Objekt auslesen. Aber wie du das machst ist rein deine Sache.

So und in Android ist eine allgemeine Lösung diese:

Code:
String url = "www.meineseite.de/rest/" + deineaktion
String result = "";
DefaultHttpClient client = new DefaultHttpClient();
HttpGet method = new HttpGet(url);
HttpResponse res = null;
try {
	res = client.execute(method);
} catch (ClientProtocolException e1) {
	// TODO Auto-generated catch block
	e1.printStackTrace();
} catch (IOException e1) {
	// TODO Auto-generated catch block
	e1.printStackTrace();
}

über den InputStream kommst du dan die Daten :

Code:
try{
	InputStream is = res.getEntity().getContent();
	BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"));
	StringBuilder sb = new StringBuilder();
	String line = null;
	while ((line = reader.readLine()) != null) {
		   sb.append(line + "\n");
	}
	s.close();
	result = sb.toString();
	}catch(Exception e){
	       Log.e("log_tag", "Error converting result "+e.toString());
	}

result hälst dann deine daten;)
hoffe konnte dir helfen

ps: http://www.helloandroid.com/tutorials/connecting-mysql-database
 
Zuletzt bearbeitet:
Hallo Artwork,

danke für deine Antwort. Die Webseite vom BFV ist nicht meine eigene. Das zusätzliche BFV Widget ist aber auf meiner Seite.

Deine Idee, dass ich auf meine Webseite eine php-Datei legen soll die automatisiert die Daten von der BFV Seite holt gefällt mir. Ich brauche mit meinem App dann nur noch auf meine Seite zugreifen. Was dagegen spricht ist aber die Aktualität der Daten. Ich habe dann aber keinen "Live" Betrieb.

Mir würde die Idee besser gefallen die Daten aus der BFV Seite direkt aus dem App abzufragen. Hier bin ich mir aber nicht sicher ob dies funktionieren kann. Wenn ich alle möglichen Daten aus der BFV Page Abfrage und diese dann in meiner App in einem Array speichere dauert dies vermutlich ziemlich lange. Ich muss mir noch genau überlegen welche Daten ich benötige.
Aktuell drehe ich mich irgendwie im Kreis. Da ich nur Erfahrung in C/C++ habe muss ich erst einmal meine Hausaufgaben machen.

Das einfachste wäre den Admin der BFV Page zu kontaktieren und mir die Möglichkeiten der Zugriffe aufzeigen zu lassen. Ich vermute aber, das ich diese Infos nicht bekommen werde. :(

Vielleicht hat jemand noch eine andere Idee.

Ich denke das Parsen wird auch nicht ganz einfach, da ich ja die richtigen Stellen im Quelltext finden muss. Hier weiß ich auch noch nicht wie ich genau an die richtigen Stellen springen kann. Gibt es hierfür eine einfache Lösung?
 
phuu, ja dann musst du die daten irgendwie extrahieren. ich würde keine direkten anfragen an die fremde webseite machen, vor allem in puncto performance und verlässligkeit, aber auch im sinne einer gute modellierung ist das nicht empfohlen.

es ist möglich mit python webseiten zu crawlen und daten zu extrahieren anhand eines selbst definierten pattern, stichwort scrapy.

Projekt: Scrapy | An open source web scraping framework for Python
Tutorial: link

Ich hab selbst schon damit erfolgreich gearbeitet. Ich habe ein python Skript welches einmal täglich automatisiert ausgeführt wird, und Daten extrahiert und in meine Datenbank schreibt. Wenn du möchtest kann ich dir gerne ein Beispielskript posten.
 
OK,

du kannst gerne das Script posten.

Du schreibst, dass das Script einmal täglich ausgeführt wird. Damit hast du aber keine Realtimedaten.

So wie ich es sehe gibt es drei Möglichkeiten:
1. Auf eigenen Webspace php script legen, dass die Daten von der BFV Page abfrägt. Mit App auf die aufbereiteten Daten auf der eigenen Page zugreifen.

2. Den Quelltext der BFV Page analysieren und dann verarbeiten

3. Auf der BFV Page eine API hinterlegen (auch PHP Script) mit der direkt die Datenbanken durchsucht werden können. (gefällt mir persönlich am Besten, wird aber am Schwierigsten zum Umsetzen)
 
ich weiß nicht wie aktuell die daten sein müssen, aber du kannst das skript natürlich beliebig ausführen.

Die 3te Möglichkeit ist ja, am elegantesten. du kannst das auch auf deinem server ausführen. müsstest die daten von der anderen seite, dann in realtime!, crawlen. Das ist natürlich auch mit php möglich.

PHPCrawl - Webcrawler Class

Eine Anfrage über deine App produziert dann aber einmal einen request an deine webseite, welche dann wiederum einen request an eine andere seite schickt. Da muss natürlich einiges an daten verarbeitet werden, aber sollte kein problem sein^^
 
Wäre auch sehr interessiert an diesem App. Eventuell kannst du dir ja ein bischen was von dem iPhone App abschauen, das funktioniert ganz gut und sieht schick aus.
 
Ist in dieser Richtung ein BFV App für Android schon etwas passiert. Das wäre sehr sehr interessant.
 

Ähnliche Themen

Jansenwilson
Antworten
1
Aufrufe
739
swa00
swa00
S
Antworten
0
Aufrufe
577
Sergio13
S
S
Antworten
17
Aufrufe
529
jogimuc
J
Zurück
Oben Unten