# Daten aus Internetseiten auslesen



## Ference (23. Dez 2012)

Hallo Zusammen,

Ich würde gerne ein Programm schreiben das die Daten aus Internetseiten sammelt und diese dann verarbeiten.

z.B. Wetterdaten oder Benzinpreise um Diagramme oder ähnliches anfertigen zu lassen.

Leider kenne ich mich mit so etwas noch gar nicht aus und weiß auch nicht unter was ich
sonst suchen soll 

Könnt ihr mir weiterhelfen?

Gruß Ference


----------



## pro2 (23. Dez 2012)

Hier wird alles erklärt:
Galileo Computing :: Java ist auch eine Insel – 21 Netzwerkprogrammierung

Einfach mal das Kapitel durchlesen, ist eh nicht sonderlich lang. Daneben gibt es auch noch eine Menge Bibliotheken, die das Leben etwas angenehmer gestalten als die Standard-Bibios. Aber damit kann man sich dann ggf. noch später beschäftigen!


----------



## Ference (23. Dez 2012)

Ich habe mir das ganze mal durchgelesen... ist schon informativ und aufschlussreich ... aber ich würde ja eine Methode benötigen z.b getactWetter() oder so etwas wie kann ich mir solche befehle zusammenbasteln? 

Ich benötige doch die passenden "Datenanschlüsse", wie bekomme ich die?


----------



## Marco13 (23. Dez 2012)

Von einer URL kann man sich einen InputStream holen, da dann das HTML rauslesen (z.B. mit dem Jericho HTML Parser ), und aus den Tags dann die gewünschten Informationen. Du musst ggf. spezifischere Fragen stellen.


----------



## Ference (23. Dez 2012)

ich hab mal en Beispiel 

Wetter Berlin - Wettervorhersage aktuell bei wetter.com

Das sind die Wetterdaten von Berlin, angenommen ich möchte jetzt das Regenrisiko für heute Nacht
^^

Ich denke mal ich muss mir den Seitenquelltext durchlesen oder?


----------



## Bernd Hohmann (23. Dez 2012)

Wie Marco bereits sagte ist es am sinnigsten, ein entsprechendes Tool für die Zerlegung von HTML-Seiten zun nutzen. Ich nutze dafür org.lobobrowser.html.* - möglich dass mittlerweile es besseres dafür gibt.

Ich habe vor 4 Jahren ein kleines Servlet geschrieben, was eine beliebige Webseite lädt und alle Links durch valide Mailadressen ersetzt (eine Poison-Page für meine Spamtraps). Den nur spärlich dokumentierten, aber übersichtlichen Source kann ich Dir gerne per PM schicken.


Bernd


----------



## ARadauer (23. Dez 2012)

Ference hat gesagt.:


> Ich denke mal ich muss mir den Seitenquelltext durchlesen oder?


ähmn ja... was sonst?
oder du fragst bei der seite, ob sie eine api haben....


----------



## pro2 (23. Dez 2012)

edit: quatsch, entfernt

Am besten für solche speziellen Datenabfragen immer nach verfügbaren APIs umsehen, wenn es welche gibt. Google ging wohl mal, aber das gibt es nicht mehr.


----------



## Ference (24. Dez 2012)

und wie geht man an so einen Seitenquelltext ran , wenn es keine Api's gibt ? Wo sethen die Sachen die mich Interresieren ^^

Wie gesagt, in dem Bereich bin ich blutiger Anfänger


----------



## Robokopp (24. Dez 2012)

Google chrome oder Firefox,  mit rechtsklick auf gewünschte Stelle der Seite, Element untersuchen


----------



## tröööt (24. Dez 2012)

java stellt dir mit [japi]URL[/japi] schon mal eine sehr bequeme möglichkeit an die daten zu kommen ...
mit URL.openConnection() holst du dir eine [japi]URLConnection[/japi] ... und davon mit getInputStream() einen [japi]InputStream()[/japi] ...
natürlich hast du so erstmal nur die RAW-daten ... am besten bei HTML also n Reader drüber legen und mit Strings weiter arbeiten ...

nun geht es ans HTML-parsing ...
das problem : viele halten sich nicht an standards ... weshalb es auch keine universellen parser gibt ...
HTML-parsing ist noch in so fern einfach da es festgelegte "TAGs" gibt ... die immer mit "<" anfangen und immer mit ">" enden ...
nun gibt es entweder single-tags ... also solche wie z.b. "img" die in sich komplett sind : "<img src="..." />" und sog. tag-pairs ... also tags die zwei elemente haben : "<h1>text</h1>" ...

welche tags zu welcher sorte gehören kann man beim W3C nachlesen ...

am einfachsten geht sowas dann mit RegEx zum zerlegen und auslesen ... aber man kann sich sowas auch mit String.substring() selbst basteln ...

es gibt auch komplette frameworks die sowas bereitstellen ... bekannt z.b. HTMLUnit ...
trotzdem muss man auch mit diesen frameworks umgehen können um die richtigen informationen rauszubekommen ...

man kanns auch ganz einfach machen in dem man z.b. mit nem BufferedReader zeile für zeile durch geht und entsprechende daten raussucht und in variablen speichert ... das ist dann aber sehr seiten-speziell und kann bei änderungen schnell zu fehlern führen ...


----------



## DrZoidberg (24. Dez 2012)

Also die Temperatur auszulesen ist in dem Fall einfach, denn im Quelltext der Seite finden sich die Zeilen

```
advertising.Data.parameters.temperatureMin    = "5";
advertising.Data.parameters.temperatureMax    = "8";
```
Man muss also einfach nur danach suchen. Alles andere ist aber weit schwerer, da die Seite nicht zum automatischen parsen gedacht ist.
Yahoo bietet übrigens eine XML api an. Das lässt sich dann deutlich einfacher parsen.
Daten für Berlin:
Yahoo! Weather - Berlin, DE
Du kannst übrigens auch auf Scala umsteigen. Da ist ein einfacher XML Parser schon eigebaut.
Da sieht der code dann so aus

```
import scala.xml._

val xml = XML.load("http://weather.yahooapis.com/forecastrss?w=638242&u=c")

val city = xml \\ "location" \\ "@city"
val temperature = xml \\ "condition" \\ "@temp"
 
println(city + " " + temperature)
```


----------



## Ference (24. Dez 2012)

```
public class Wetter 
{
	private static URL url;
	
	public static void main(String[] args) throws MalformedURLException 
	{
		try 
		{
			 url = new URL ("http://www.wetter.com/");
			 URLConnection con = url.openConnection();
			 InputStream in = con.getInputStream();
			 
		} 
		catch (IOException e) 
		{
				e.printStackTrace();
		}
		
	}

}
```

Ist der Anfang schonmal richtig?? 
ich hab keinen einfall wie ich da rangehen soll ^^
aber hier wird mir ja geholfen  find ich super


----------



## Marcinek (24. Dez 2012)

Zumindest ist der Anfang nicht falsch.

Übrigens: Du kannst das ganz leicht selber Prüfen: Starte dein Programm mit java DeinKlassenName und dann siehst du, ob es richtig ist oder nicht.

Du solltest mal die Postings in diesem Thread beachten, da hier ja schon die Lösungen grob umschrieben werden.


----------



## Ference (24. Dez 2012)

um nochmal das von vorhin aufzugreifen...


```
advertising.Data.parameters.temperatureMin    = "5";
advertising.Data.parameters.temperatureMax    = "8";
```

wenn ich sowas finde was muss ich dann bei mir hinschreiben um die 5 und 8 auszulesen... mit dem InputStream?


----------



## Marcinek (24. Dez 2012)

Das könnte man mit Regex machen oder wenn es einfacher gehen soll mit 

String.subString(), String.indexOf arbeiten.

Und dann sowas: Substring(von ersten " bis letzten ")

Gruß,


----------



## Ference (24. Dez 2012)

ich komme mir doof vor  ihr sagt mir wie man es macht und ich blick nicht wie das gehen soll weil ich die Fachbegriffe und Methoden nicht kenne , z.B Regex 
oder wie man das String zeug mit einbringt -.-


----------



## tröööt (24. Dez 2012)

tja ... dann dürfte die aufgabe für dich wohl schwerer werden ... denn vieles sind grundlagen ... und das bisschen net-code was die daten liefert hat man auch schnell drauf ...
gut ... auch wenn RegEx nicht jedem liegen ... bietet die API-doc doch ein recht umfassendes nachschlagewerk dazu an


----------



## tröööt (24. Dez 2012)

DrZoidberg hat gesagt.:


> Du kannst übrigens auch auf Scala umsteigen. Da ist ein einfacher XML Parser schon eigebaut.



dafür brauchts kein scala ... oder denkst du wofür es den package-tree javax.xml.* gibt ?


----------



## Ference (24. Dez 2012)

Ich kann nur selbst Sachen programmieren ... alles was Information von Internet oder System braucht kann ich nicht ... ich kann nichtmal die Uhrzeit vom Computer abfragen ^^

Hast du einen Link zu dem RegEx .. eine Anleitung


----------



## Marcinek (24. Dez 2012)

Let me google that for you


----------



## Ference (24. Dez 2012)

boah.... ich glaub ich lass in Sachen Internet die Finger weg... das schaff ich nie -.-


----------



## ARadauer (24. Dez 2012)

Warum willst du das überhaupt machen? Musst du das für die Schule machen?
Irgendwie merkt man, dass dich das nicht besonders interessiert... 



> oder wie man das String zeug mit einbringt


Wie meinst du das? ließ die Seite einfach mal aus und schau dir den Quelltext and... dann such mit indexOf die entsprechenden Stellen und schneid dir die Werte substring raus..

hier infos was mit Strings machen kann. Java Platform SE 6


----------



## Marcinek (24. Dez 2012)

Mach dich doch erstmal mit den Grundlagen der SPrache vertraut.

Fang lieber mit dem Klassiker an:

Deinen Namen als Pyramide und Dreieck darzustellen


```
M
                M    A
             M    A    R
           M   A    R    C
```
Oder einfacher 

M
MA
MAR
MARC
MARCI
MARCIN

...

Oder Wörterzählen in einem Text. Oder Wörter und SÄtze zählen, Buchstaben..

Dann kannst du dir das Konzept der Streams anschauen und festellen, dass deine Lösungen behalten kannst und dann so nen InetStream hinknallst und er zählt wörter von der Homepage (Vielmehr vom HTML Quellcode)

:toll::idea::idea:

Gruß,
Martin


----------



## Ference (24. Dez 2012)

Marcinek hat gesagt.:


> Mach dich doch erstmal mit den Grundlagen der SPrache vertraut.



Die Grundlagen habe ich  habe schon TicTacToe und Schach programmiert ... 
da habe ich aber nur das Zeug für gebraucht was mir mein Informatik Lehrer beigebracht hat 

Das ganze ist nicht für die Schule, das ist für mich weil ich das lernen will.... so nebenbei ^^
Aber irgendwie weiß ich nicht wo ich jetzt als erstes anfangen soll mir Sachen durchzulesen 
in meinem 1400 Seiten dicken Buch steht sowas natürlich garnet drin -.- 

Ich hab auch mal einen Chat probiert, woran ich auch gescheitert bin 

Ich hab mir das ganze um einiges leichter vorgestellt :autsch:


----------



## Marcinek (24. Dez 2012)

Aber wir sind uns einig, dass deine Grundlagen nicht für eine Transfer Leistung reichen.  :noe:

Chat ist natürlich auch schon komplizierter.

Wie wäre es mit einem Netzwerk Ping Pong.

Zwei Stationen. Die eine Sendet immer ein PING und die andere antwortet mit PONG.


----------



## Ference (24. Dez 2012)

Also ein Echo-Server ... hatte ich , der chat Funktioniert auf meinem Pc wenn ich Server und Client öffne mit LocalHost.... aber von einem anderen PC aus nicht ich weiß nicht ob ich die falsche IP hab oder ob der Port nicht offen ist oder ob die Firewall dazischen funkt ... auf jedenfall ensteht keine Verbindung


----------



## Marcinek (24. Dez 2012)

Ich gebs auf 

Du bist 16.

Du hast langeweile.

Du hast schon alles programmiert.

Nix funktioniert, und eine Seite kannst du auch nicht lesen  :bloed:


----------



## Ference (24. Dez 2012)

18 

okey..


----------



## tröööt (24. Dez 2012)

naja ... mit dem bisschen schul-info und nem (hoffentlich) halbwegs vernünftigen einsteiger-grundlagen buch wirst du noch nicht all zu weit kommen ..

zum thema regex : einfach mal in die API gucken ... [japi]Pattern[/japi] im package java.util.regex ... da wird eigentlich alles erklärt ...

was du grundsätzlich brauchst haben wir genannt : URL (aus bequemlichkeit ... könnte man durch aus anders machen) und ein bisschen basis-wissen wie man mit strings umgeht ...

ich denke mal keiner wird dir hier grundlagen vorkauen ... schon garnicht wie man mit Strings umgeht und was diese klasse alles an methoden hat ... dafür gibts ne api-doc : [japi]String[/japi] ... ein bisschen fach-englisch vorrausgesetzt ...

auch vielen stichworte wie "zeilen weise lesen" ... wenn man dazu hier die sufu nutzt findet man schon mal so einiges um überhaupt an die daten der seite ranzukommen ...

dann noch ein paar grundlagen zu collections ... und dann sollte es das eigentlich sein ...

mal ganz schnell aus dem kopf hier direkt geschrieben würde folgendes raus kommen


```
import java.io.*;
import java.net.*;
import java.util.*;
public class WeatherReader
{
	public static void main(String[] args) throws Exception
	{
		URL url=new URL("http://www.example.tld/file"); // hier URL einsetzen
		BufferedReader in=new BufferedReader(new InputStreamReader(url.openStream()));
		List<String> list=new ArrayList<String>();
		String line="";
		while((line=in.readLine())!=null)
		{
			list.add(line);
		}
		in.close();
		// weitere variablen
		for(String string : list)
		{
			// hier verarbeitung der einzelnen zeilen
		}
		// restlicher kram wie ausgabe
	}
}
```
in zeile 17 würden dann noch die paar variablen kommen die du vielleicht nutzen willst ... um dann in zeile 22 vllt noch was mit zu machen ...
wenns nur um das ausgeben geht kannst du das auch direkt in zeile 20 machen ... vllt mit RegEx drüber gehen um nur das gewünschte zu erhalten und auszugeben ...

aber das ist es im großen und ganzen ...

und das alles besteht nur aus n bissl basics ... n bissl net-code ... n bissl collections ... n bissl regex ... und n bissl logik ... das ist keine mammut-aufgabe ... sondern lediglich informationen holen und auswerten ...


----------



## Ference (24. Dez 2012)

das mit den Strings habe ich eben verstanden und wollte sagen das ich es so machen werde wie du, schau nochmal rein und alles steht hier 

Danke ^^
nur doof das man mit dem Buffered Reader nicht gleich in Zeile xy anfangen kann ^^ aber egal passt schon , ich such mir dann den passenden kram raus


----------



## Marco13 (24. Dez 2012)

Ein schnell hingehacktes Weihnachtsgeschenk:

```
import java.net.URL;
import java.util.List;

import net.htmlparser.jericho.Element;
import net.htmlparser.jericho.HTMLElementName;
import net.htmlparser.jericho.Source;

public class ExtractRainThing 
{
	public static void main(String[] args) throws Exception 
	{
		Source source = new Source(
			new URL("http://www.wetter.com/deutschland/berlin/DE0001020.html"));
		List<Element> elementList = source.getAllElements(HTMLElementName.DD);
		int counter = 0;
		for (Element element : elementList) 
		{
			String av = element.getAttributeValue("class");
			if ("dn5".equals(av))
			{
				counter++;
				if (counter == 4)
				{
					List<Element> spans = 
						element.getAllElements(HTMLElementName.SPAN);
					Element span = spans.get(0);
					String content = span.getContent().toString();
					String s[] = content.split("<br />");
					System.out.println("Result: "+s[1].trim());
				}
			}
		}
	}
}
```

Verwendet Jericho HTML Parser


----------



## Ference (24. Dez 2012)

ähm... xD ich hab Jericho runtergeladen... wo muss ich des reinpacken das es funktioniert 
und Danke für das Weihnachtsgeschenk 
Frohe Weihnachten so nebenher


----------



## Marco13 (24. Dez 2012)

In den classpath, je nach IDE (z.B. Eclipse: Ins Projektverzeichnis legen, (ggf. F5 zum aktualisieren), rechtsklick auf die JAR -> Add to build path).


----------



## Ference (24. Dez 2012)

cool geht  
kann es sein das im seitenquelltext sachen drinstehen die nicht auf der seite gezeigt werden? 
und umgekehrt ? 

Das Programm sagt 20% Regenrisiko .. das regenrisiko finde ich auf der ganzen seite nicht
und im code findet man auch max und min temperatur was ich auch nicht auf der normalen seite finde
... die aktuelle temperatur finde ich aber auch nicht im code, aber irgendwo muss er ja stehen


----------



## Marco13 (24. Dez 2012)

Du hast doch selbst gesagt, das das Regenrisiko aus der Seite gelesen werden soll. Und das steht da auch, in der Spalte "Nachts", unten, über "Ihre detaillierte Vorhersage für heute".


----------



## Ference (24. Dez 2012)

xD das sollte das Beispiel dienen, genauso wie das Wetter  ich will ja allgemein wissen wie man sowas macht  
da hab ich mich wohl schlecht ausgedrückt  sorry ..


----------



## Marcinek (24. Dez 2012)

Ja, aber nun sieht du ja wie es geht oder?:bahnhof:


----------



## Ference (24. Dez 2012)

Ich muss mir noch ein wenig Jericho und so durchlesen  die Befehle und so ^^ warum z.b einmal .DD und einmal .SPAN da steht 

gibt es das vlt. ne super anleitung oder nur die Seite von vorhin
bzw. ne Seite mit allen Methoden


----------



## tröööt (24. Dez 2012)

grundsätzlich unterscheidet es sich nicht von wo die daten kommen ...

fakt ist : am ende ist alles eine folge aus 0 und 1 ... und wie diese zu verstehen sind und was genau man dann in diesem wirr-warr sucht und haben will ... darum muss man sich eben selbst kümmern ...
es gibt formate für die es frameworks gibt die einem die suche nach der gewünschten information erleichtern ... und andere für die man halt selbst was schreiben muss ...


----------



## Marco13 (24. Dez 2012)

Das hat nichts mit Jaricho zu tun. Auf der Seite, die man runterlädt, sind irgendwelche verschachtelten HTML-Tags, <dd> oder <span> oder <div> ... und man kann nur versuchen, sich zu der Stelle zu hangeln, wo das steht, was man sucht ... :bahnhof:


----------



## Ference (24. Dez 2012)

ok 
aber die Methoden und so sind von Jericho  
gibt es da ne Liste was man damit alles machen kann, bzw was jede Methode macht oder muss ich das selbst rausfinden... google hat nix ausgespuckt... außer ich war mal wieder zu doof dafür ^^


----------



## DrZoidberg (24. Dez 2012)

Ference hat gesagt.:


> ... die aktuelle temperatur finde ich aber auch nicht im code, aber irgendwo muss er ja stehen



Wenn du Firefox verwendest, kann dir das Firebug Plugin(in Firebug auf HTML klicken) weiter helfen, bzw. bei Chrome die Entwicklertools (auf "Elements" klicken").
Dort wird dir die Struktur des Quellcodes angezeigt, und wenn du mit der Maus auf HTML Elemente zeigst, werden diese auf der Seite hervorgehoben. Damit kannst du bestimmte Dinge im Code sehr schnell finden.
Die Stelle mit der Temperatur sieht übrigens so aus.


```
<dd class="dn3">leichter Regen</dd>
<dd class="dn4"><span class="degree"><span class="lower">5</span> / 6 °C</span></dd>
```


----------



## Marco13 (25. Dez 2012)

Die Doku ist auf Jericho HTML Parser 3.3 , und SEHR ausführlich - aber gebraucht habe ich sie praktisch noch nie. Wenn
source.getAllElements(HTMLElementName.DD);
nicht alle '<dd>'-Elemente liefern würde, hätte der Entwickler was falsch gemacht (und dann würde ich die Lib nicht empfehlen)


----------



## Ference (25. Dez 2012)

okey, vielen Dank 

ich habe mir mitlerweile ein bisschen HTML Unit durchgelesen ... kann man damit wirklich Textfelder ausfüllen und buttons betätigen?


----------



## Marcinek (25. Dez 2012)

Hast du den ersten Satz auf deren Page gelesen?


----------



## Ference (25. Dez 2012)

> HtmlUnit is a "GUI-Less browser for Java programs". It models HTML documents and provides an API that allows you to invoke pages, fill out forms, click links, etc... just like you do in your "normal" browser.



also ja xD
ist aber schwer oder?


----------



## Ference (25. Dez 2012)

Ich habe da ein Problem 
Die Seite die ich auslesen möchte bekommt man erst, wenn man sich eingeloggt hat ... ich habe meinem Programm jetzt die Seite
nach dem Log In gegeben, er liest aber automatisch die logIn seite aus .... 

Wie löse ich am besten das Problem?


----------



## Marcinek (25. Dez 2012)

Du musst dich zunächst einloggen.

http://www.java-forum.org/netzwerkprogrammierung/108673-login-htmlunit.html

Garantiert gibt es hundert threads dazu


----------



## Ference (25. Dez 2012)

Leider dacht ich mir das , dass ich an HTMLUnit net vorbei komm
... hab das Forum hier schon durchsucht aber irgendwie krieg ich das nicht hin


----------



## Marcinek (25. Dez 2012)

Ja das ist schade.

Aber ich bin mir sicher, dass du noch hundert projekte finden wirst, die bei der kleinsten Schwierigkeit wieder fallen gelassen werden 

Ich zumindest bin gespannt.

Für dich noch um nicht ganz off-Topic zu sein:

Siehe Link in meiner Signatur.


----------



## Ference (25. Dez 2012)

Das schlimme ist halt das nie erklärungen dabei sind, was genau was macht ^^
und dann wird es mal mit HTMLUnit gemacht und mal mit HTMLConnection ... 
sagen wir mal ich bin verwirrt 

ich bräuchte wirklich mal so ein Tutorial oder halt hier im Forum ein Thema wo wirklich nur HTMLUnit 
besprochen wird ...


----------



## Marcinek (25. Dez 2012)

Es läuft dafauf hinaus, dass dir die Grundlagen fehlen.


----------



## Ference (25. Dez 2012)

Und wo bekomme ich die her? 
Gibt es ein Buch das sich Speziel darauf bezieht das ihr kennt?
Also Netzwerkprogrammierung.....


----------



## ARadauer (25. Dez 2012)

Langsam wirds mühsam...


----------



## Ference (25. Dez 2012)

das is das letzte dann hat sich das hier "Erledigt" ... ^^


----------



## timbeau (27. Dez 2012)

Google, Google Google und noch 10000x Google. Keiner kann dir das wichtigste abnehmen: Eigeninitiative. Und deine Posts hier sind KEINE Eigeninitiative. Das ist "Erklärt mir das"-Verhalten. Und das führt nicht weit. :rtfm:


----------

