Seite ( HTML/PHP ) auslesen und verwerten?

Ich hab vor kurzem ein "Programm" gesehn mit dem man bestimmte Daten einer Internetseite kommt. Die Seite wird komplett markiert und kopiert. Dann wird die kopie in dem besagten Programm in ein Eingabefeld hineinkopiert und nach Angabe des verwendeten Brosers ( Wahl zwischen IE und dem Rest =) ) wurde aus der Seite die nötigen Daten herausgelesen ( Für die dies interessiert, es war ein Kolotool für das Browsergame Inselkampf ).

Meine Frage ist nun, wie geht das bzw.:
- Wie kann man sowas in HTML / PHP ( zur not noch Java ) erstellen?
- Gibt es hierfür Beispiele in anderen Progs bzw. entsprechende Code-Schnippsel :P?

Vielen Dank für eure Hilfe!!! ;)
 
Das ganze geht mit PHP.
Für ne etwas genauere Anleitung kannst du xblax eine PN schicken, der hat sowas gerade erst gemacht.
Is aber grad im Urlaub und kommt net jeden Tag aufs Board.

Ich hab soviel mitbekommen:
Du kannst an die Page einen gefälschten POST-header schicken, so dass sie dir den Code schickt.
Wenn du den Code einfach nur reinkopieren willst, kannst du das weglassen.
Dann musst du nur wissen, WAS du wissen willst, den Code analysieren und dann Stück für Stück das drumrum löschen lassen (str-replace, preg-replace).
 
also n kumpel von mir hat was aehnliches gemacht, aber halt mit perl! das macht sich fuer solche sachen (rumspielen mit strings) besser! auch nich schlecht is ein kleines bash script :P
 
was verstehst du denn unter "benötigte Daten"?

Ich hatte mal ein script, was die news von MTV geklaut hat. evtl. hilft dir das weiter. Aber sag mir erstmal welche informationen du genau filtern willst.
 
In einem Game gibts einen Ozean mit 100 Abschnitten. Jeder Abschnitt enthält max 25 Inseln. Da ein automatisches auslesen verboten ist ( naja, wenns einfacher wäre :D ) wollte ich es so machen, das ich irgendwie ( ? z.B.: indem ich die Teilkarte in ein Programm ? hineinkopiere und das Programm dann die Teilkarte ausliest und zusammen mit den anderen Teilkarten eine komplette Karte erstellt ) eine komplette Karte bekomme.

@flame: benötigte Daten wären:
- Name der Insel
- Inselinhaber
- Allianz
- Inselpos
- Punkte

Quelltext einer Teilkarte:
<html><head><link rel="stylesheet" type="text/css" href="36_dateien/style.css"><script type="text/javascript" src="36_dateien/lib.js"></script></head><body onload="start()"><h1>Karte</h1><hr align="left" width="420">28.08.2005 11:00:39 | <a href="http://213.203.201.100/s7.php?s=bkey0u&p=settings">Einstellungen</a> | <a href="http://213.203.201.100/s7.php?s=bkey0u&p=mail&sub=invite">Einladung</a> | <a href="http://213.203.201.100/s7.php?s=bkey0u&a=logout">Abmelden</a> | <a href="http://213.203.201.100/s7.php?s=bkey0u&p=mail"><img src="36_dateien/m_off.gif" border="0"></a><br>Du <b>fallcon</b>, bist Herrscher über die Insel Isle of Storm (20:24:1)<table border="1" cellpadding="3" cellspacing="0" width="420"><tbody><tr><td width="33%"><img src="36_dateien/gold.gif"> 3117</td><td width="33%"><img src="36_dateien/stones.gif"> 1652</td><td><img src="36_dateien/wood.gif"> 4356</td></tr></tbody></table><br><table border="0" cellpadding="3" cellspacing="1" width="420"><form action="/s7.php?s=bkey0u&p=map" method="post"></form><tbody><tr><td bgcolor="#f0f0f0"><b>Ozean: </b><input name="pos1" value="20" size="3" type="text"><b> Inselgruppe: </b><input name="pos2" value="36" size="3" type="text"><b> Spieler: </b><input size="8" name="highlight" value="" type="text"> <input value="anzeigen" type="submit"></td></tr></tbody></table><br><img src="36_dateien/s7.png" usemap="#map" border="0"><map name="map"><area shape="rect" coords="0,9,9,411" href="http://213.203.201.100/s7.php?s=bkey0u&p=map&pos1=20&pos2=35&highlight=" title="Ozean: 20
Inselgruppe: 35"><area shape="rect" coords="411,9,420,411" href="http://213.203.201.100/s7.php?s=bkey0u&p=map&pos1=20&pos2=37&highlight=" title="Ozean: 20
Inselgruppe: 37"><area shape="rect" coords="9,0,411,9" href="http://213.203.201.100/s7.php?s=bkey0u&p=map&pos1=20&pos2=26&highlight=" title="Ozean: 20
Inselgruppe: 26"><area shape="rect" coords="9,411,411,420" href="http://213.203.201.100/s7.php?s=bkey0u&p=map&pos1=20&pos2=46&highlight=" title="Ozean: 20
Inselgruppe: 46"><area shape="rect" coords="338,174,409,245" href="http://213.203.201.100/s7.php?s=bkey0u&p=map&sub=isle&pos1=20&pos2=36&pos3=15" title="Insel: 20:36:15
Koordinaten: 20:36:15
Herrscher: Odin
Allianz: [oC.08]
Punkte: 303"><area shape="rect" coords="338,256,409,327" href="http://213.203.201.100/s7.php?s=bkey0u&p=map&sub=isle&pos1=20&pos2=36&pos3=20" title="Insel: Iluminata
Koordinaten: 20:36:20
Herrscher: warbird17
Allianz: [Mars]
Punkte: 327"><area shape="rect" coords="10,338,81,409" href="http://213.203.201.100/s7.php?s=bkey0u&p=map&sub=isle&pos1=20&pos2=36&pos3=21" title="Insel: 20:36:21
Koordinaten: 20:36:21
Herrscher: Odin
Allianz: [oC.08]
Punkte: 166"><area shape="rect" coords="256,10,327,81" href="http://213.203.201.100/s7.php?s=bkey0u&p=map&sub=isle&pos1=20&pos2=36&pos3=4" title="Insel: unbenannt
Koordinaten: 20:36:4
Herrscher: Achillis81
Punkte: 1"><area shape="rect" coords="174,92,245,163" href="http://213.203.201.100/s7.php?s=bkey0u&p=map&sub=isle&pos1=20&pos2=36&pos3=8" title="Insel: unbenannt
Koordinaten: 20:36:8
Punkte: 1"><area shape="rect" coords="92,338,163,409" href="http://213.203.201.100/s7.php?s=bkey0u&p=map&sub=isle&pos1=20&pos2=36&pos3=22" title="Insel: unbenannt
Koordinaten: 20:36:22
Punkte: 1"><area shape="rect" coords="92,256,163,327" href="http://213.203.201.100/s7.php?s=bkey0u&p=map&sub=isle&pos1=20&pos2=36&pos3=17" title="Insel: Azzurrino
Koordinaten: 20:36:17
Herrscher: 0815Luca
Allianz: [o8i5]
Punkte: 23"><area shape="rect" coords="256,174,327,245" href="http://213.203.201.100/s7.php?s=bkey0u&p=map&sub=isle&pos1=20&pos2=36&pos3=14" title="Insel: Schutz von Denkmal
Koordinaten: 20:36:14
Herrscher: violett
Punkte: 2"></map><hr align="left" width="420"><a href="http://213.203.201.100/s7.php?s=bkey0u&p=main">Übersicht</a> | <a href="http://213.203.201.100/s7.php?s=bkey0u&p=alliance">Allianz</a> | <a href="http://213.203.201.100/s7.php?s=bkey0u&p=map">Karte</a> | <a href="http://213.203.201.100/s7.php?s=bkey0u&p=isles">Inseln</a> | <a href="http://213.203.201.100/s7.php?s=bkey0u&p=market">Markt</a> | <a href="http://213.203.201.100/s7.php?s=bkey0u&p=ranking">Rangliste</a> | <a href="http://213.203.201.100/s7.php?s=bkey0u&p=calc">Rechner</a><br><br>0.02</body></html>
 
Naja, das sollte nicht all zu schwer sein..

Zuerst musst du das ganze halt mit nem formular übergeben, wenn du es so nicht auslesen darfst/kannst.

Und danach musst du nur mit ereg() [siehe http://manuals.phpforum.de/php/function.ereg.php] den string durchsuchen.
den genauen syntax für den regulären ausdruck kann ich dir jetzt auch net sagen, aber du hast ja feste anhaltspunkte wie: Alianz: (1), Punkte: (2). Und so lässt sich doch gasnz leicht n array generieren.

Das skript was ich bei MTV benutzt hab kannste da nicht anwenden, weil ich da immer zwischen zwei <Tags> ausgelesen hab. Aber wenn du dir das mit ereg() und den regulären ausdrücken [http://www.php-resource.de/tutorials/read/10/1/] durchschaust, müsste dir schon geholfen sein.
 
Genau sowas hat mein Kumpel (xblax) für ein anderes Game gemacht.
Sehr praktisch ist dabei die funktion explode()
Damit kannst du Teile eines Textes zw. 2 bestimten Strings herausschneiden.

PHP:
<?php
function get_text($start,$end,$hackstay){
    $temp = explode($start,$hackstay);
    $temp = explode($end, $temp[1]);
    $result = $temp[0];

    return $result;
}

Somit kannst du z.B. als erstes den Code zwischen <body> und </body> herausschneiden und darin dann weitere nicht benötigten Sachen löschen.
 
Jo.. so sah meine hauptfunktion im MTV-script auch aus.

ABER diese möglickeit hat den nachteil, das immer nur das erste vorkommen einer zeichenkette aufgelöst wird. Aber das kan er hier nicht gebrauchen. da eine unbestimmte zahl aufgelistet wird, die den gleichen basisaufbau hat.

Hier muss man eher Immer nach dem ausdruck Alianz suchen, und die drauffolgende zeichenkette zwischen [ und ] zurückgeben.
Das ganze wird dann im Alianzarray gespeichert, und so verfährt man auch mit den anderen. Und dann hast du deine arrays Alianz[] inselpos[] Herrscher[] usw. und kanst die informationen dann zusammenfügen.
 
Zunächsteinmal kannst du diese Funktion benutzen, um Post oder Get-Anfragen an den Webserver zu senden:

Code:
$referer = "http://www.was-du-willst.de/";

function PostToHost($host, $path, $method='get', $data_to_send=0) {
  global $referer;

  $fp = fsockopen($host, 80);

  if($method == 'post')
  	fputs($fp, "POST $path HTTP/1.1\r\n");
  else
  	fputs($fp, "GET  $path HTTP/1.1\r\n");

  fputs($fp, "Host: $host\r\n");
  fputs($fp, "Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5\r\n");
  fputs($fp, "Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3\r\n");
  fputs($fp, "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n");
  fputs($fp, "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; de-DE; rv:1.7.8) Gecko/20050511 Firefox/1.0.4\r\n");
  fputs($fp, "Referer: $referer\r\n");

  if($method == 'post'){
  	fputs($fp, "Content-type: application/x-www-form-urlencoded\r\n");
  	fputs($fp, "Content-length: ". strlen($data_to_send) ."\r\n");
  }

  fputs($fp, "Connection: close\r\n\r\n");
  fputs($fp, $data_to_send);
  while(!feof($fp)) {
      $res .= fgets($fp, 128);
  }

  fclose($fp);
  $referer = 'http://'.$host.$path;

  return $res;
}
Wenn du den Quelltext von Hand einkopieren willst, brauchst du das nicht, aber das erstellen der Karte dauert halt wesentlich länger.

Wenn der Quelltext in deinem Programm ist, würde ich folgendermaßen vorgehen:
1. Alles um die benötigten Informationen entfernen bis du in jeder Zeile nur noch eine Information hast. Also immer:
Code:
Name
Herrscher
Allianz
Punkte
Kooridnaten
Name
Herrscher
...

2. Mit explode("\n") das ganze in ein Array umwandeln
3. Mit array_chunk($daten, 5); das ganze in gleich große Teilarrays verwandeln.
4. Was du mit den Daten dann machst bleibt dir überlassen.

Du musst halt ne Menge experimentieren, bis es fehlerfrei funktioniert.
 
Das problem dabei ist, dass die zu entfernenden zeichenketten imemr exakt gleich bleiben müssen.

mit der ereg() funktion, hat man da mehr spielraum, und ein geringeres datenaufkommen.
das problem dabei ist ledigtlich den regulären ausdruck richtig hunzubrinegn, aber da mus man haltz mal ne stunde oder so recharchieren,
 
Zurück
Oben