IT-Academy Logo
Sign Up Login Help
Home - Programmieren - PHP - PHP: Fremde Webseiten parsen/auslesen



PHP: Fremde Webseiten parsen/auslesen

Wer möchte nicht manchmal Daten von anderen Webseiten übernehmen, allerdings nur bestimmte Teile davon. Dieser Artikel zeigt, wie man per einfachem PHP-Skript genau das erreichen kann.


Autor: Martin Puaschitz (onestone)
Datum: 20-03-2003, 20:39:01
Referenzen: Keine.
Schwierigkeit: Anfänger
Ansichten: 170665x
Rating: 9 (1x bewertet)

Hinweis:

Für den hier dargestellte Inhalt ist nicht der Betreiber der Plattform, sondern der jeweilige Autor verantwortlich.
Falls Sie Missbrauch vermuten, bitten wir Sie, uns unter missbrauch@it-academy.cc zu kontaktieren.

[Druckansicht] [Als E-Mail senden] [Kommentar verfassen]



Einleitung

Oftmals ist es sehr sinnvoll und nütlich verschiedene Inhalte von fremden Webseiten auslesen zu können. Egal ob Schlagzeilen eines Nachrichtenmagazins oder Headlines der neuen Artikel auf www.it-academy.cc - grundsätzlich benötigt man nur ein einfaches entsprechendes Skript.

Die Theorie

Das hier vorgestellte PHP-Skript durchsucht eine Quelle nach einer bestimmten Zeichenfolge. Dadurch ist es möglich, gewisse Teile einer Webseite zu speichern bzw. weiterzuverarbeiten. Das Problem liegt im Großen und Ganzen eher darin, dass die wenigsten Webseiten einfache Möglichkeiten bieten, damit das Auslesen Ihrer Daten recht einfach ist. Am einfachsten würde es bei XML-Dokumenten funktionieren, die in etwa so aussehen (könnten):
<artikel>
<headline>Hier die Headline</headline>
<text>Text des Artikels</text>
</artikel>
Bei dieser Variante könnte man das Skript anweisen, nach "<headline>" zu suchen und alles, was bis </headline> steht, herauszufiltern. In der Praxis sieht es leider anders aus. Man muss also ein Muster finden, wie die herauszulesenden Daten auf der Webseite gespeichert sind. Solche Muster können bestimmte Schriftarten, -größen oder Textklassen sein, die im HTML-Code definiert werden (denn das ist, was das Skript liest!).

Das wichtigste an der Sache ist, dass die Zeichenkombination möglichst einzigartig auf der Webseite ist - wenn nicht, werden auch Informationen ausgelesen, die nicht relevant sind (z.B. wenn man nach <b> und </b> suchen lässt, erhält man alle Zeichen, die als "Fett" markiert sind). Anzumerken ist, dass natürlich auch nach regulären Wörtern wie "Linie" (siehe Beispiel) gesucht werden kann.

Die Praxis

Ich habe mit dieser Materie beschäftigt, da ich die Kontrollen der hiesigen U-Bahnen von deren Webseite auslesen und mir entsprechend zuschicken wollte. Die Informationen sind/waren unter http://www.vormagazin.at/html/heute.php?item=fahrschein verfügbar. Für alle jene, die sich für das Service an sich interessieren: http://martin.puaschitz.at/schwarzkappler/.

Wenn man sich den HTML-Code ansieht, bemerkt man schnell, dass allen Einträgen wie "Linie XY" mit "<span class="lead">" beginnen. Das ist genau der Punkt, den ich oben erwähnt habe - man muss ein Muster finden, woraus das Skript die relevanten Daten auslesen kann. Ich bin dankbar, dass diese Text-Klasse nur bei den Linien verwendet wird - das macht die ganze Sache enorm einfach.

Der Code
// URL, die durchsucht werden soll
$url = "http://www.vormagazin.at/html/heute.php?item=fahrschein";

// Zeichenfolge vor relevanten Einträgen
$startstring = "<span class=\"lead\">";

// bis zum nächsten html tag bzw. Zeichenfolge nach relevanten Einträgen
$endstring = "<"; 

$file = @fopen ($url,"r");

if (trim($file) == "") {
	echo "Service out of order";
	} else {
	$i=0;
	while (!feof($file)) {

		// Wenn das File entsprechend groß ist, kann es unter Umständen
// notwendig sein, die Zahl 2000 entsprechend zu erhöhen. Im Falle // eines Buffer-Overflows gibt PHP eine entsprechende Fehlermeldung aus. $zeile[$i] = fgets($file,2000); $i++; } fclose($file); } // Nun werden die Daten entsprechend gefiltert. for ($j=0;$j<$i;$j++) { if ($resa = strstr($zeile[$j],$startstring)) { $resb = str_replace($startstring, "", $resa); $endstueck = strstr($resb, $endstring); $resultat .= str_replace($endstueck,"",$resb); $resultat .= "; "; } } // Ausgabe der Daten $resultat = "Kontrolliert wird heute in den Linien ".$resultat."nicht erwischen lassen!"; return $resultat;


acad
Rookie
Beitrag vom:
12-05-2017, 10:04:36

Dieses Skript ist viel allgemeiner...

Für das Parsen von Websites mit PHP hab ich auf http://rexo.ch/?pg=docu&m=func&pag=url eine komfortable, allgemeine Lösung gefunden. Die Daten werden direkt in einem assoziativen Array zurückgegeben.

-----------------------------------------------------


Zauberer1305
Rookie
Beitrag vom:
05-12-2006, 11:54:48

habe mal versucht das Script für meine Bedürfnisse anzupassen aber es wird nichts ausgegeben, vielleicht kann mir ja mal jemand helfen. Script sieht jetzt so aus.

<?php
// URL, die durchsucht werden soll
$url = "http://www.handboll.info/table.aspx?WCI=wiFixtureList&TournamentId=41310";

// Zeichenfolge vor relevanten Einträgen
$startstring = "<td><strong>";

// bis zum nächsten html tag bzw. Zeichenfolge nach relevanten Einträgen
$endstring = "</a></strong></td>";

$file = @fopen ($url,"r");

if (trim($file) == "") {
echo "Service out of order";
} else {
$i=0;
while (!feof($file)) {

// Wenn das File entsprechend groß ist, kann es unter Umständen // notwendig sein, die Zahl 2000 entsprechend zu erhöhen. Im Falle
// eines Buffer-Overflows gibt PHP eine entsprechende Fehlermeldung aus.

$zeile[$i] = fgets($file,2000);
$i++;
}
fclose($file);
}

// Nun werden die Daten entsprechend gefiltert.

for ($j=0;$j<$i;$j++) {
if ($resa = strstr($zeile[$j],$startstring)) {
$resb = str_replace($startstring, "", $resa);
$endstueck = strstr($resb, $endstring);
$resultat .= str_replace($endstueck,"",$resb);
$resultat .= "; ";
}
}

// Ausgabe der Daten

$resultat = "Kontrolliert wird heute in den Linien ".$resultat."nicht erwischen lassen!";
return $resultat;
?>

Vielleicht ist ja jemand hier interessiert mir dabei zu helfen eventuell sogar gegen bezahlung daten sollen von der seite ausgelesen werden und in meine Datenbank eingefügt werden so das ich sie dort abrufen kann. Wenn jemand einen Rat hat immer her damit.

-----------------------------------------------------


Rolfhub
Senior Member
Beitrag vom:
09-02-2004, 04:51:20

@Hubsi

Ja, dein Server nimmt in der Tat Kontakt zum anderen Server auf. Ob es erlaubt ist, oder nicht, kommt auf die entsprechende Situation an, wirklich sicher sein kann man natürlich nur, wenn der andere Webmaster die "Kontent-Mitbenutzung" ausdrücklich erlaubt hat. Zurückverfolgen lässt sich das ganze in der Tat anhand der Logfiles des Webservers, wenn man dies verhindern will, kann man probieren, über einen Proxy auf den anderen Webserver zuzugreifen, ob dies jedoch legal/moralisch richtig/technisch möglich ist, hängt wieder sehr vom konkreten Fall ab.

-----------------------------------------------------


Hubsi
Rookie
Beitrag vom:
26-05-2003, 20:01:37

Frage

ist es nicht so, daß mein server zu dem server der anderen seite kontakt aufnimmt? das wäre doch dann content-klau, nicht erlaubt und auf dieser weise ja auch gut zurück zuverfolgen gibt es andere möglichkeiten fürs auslesen von webseiten wo der kontakt vom user (client, browser) selbst hergestellt wird?

-----------------------------------------------------


onestone
Administrator
Beitrag vom:
22-03-2003, 13:14:36

sms

Hello! Viele Anbieter bieten die Möglichkeit, ein E-Mail an eine bestimmte adresse zu senden (wie nummer@anbieter.tld). Damit ist es ein leichtes sms zu versenden ohne das kosten entstehen.. lg, martin

-----------------------------------------------------
Kein Problem kann so komplex sein, dass es keine Lösung dafür gibt.


umer
Junior-Member
Beitrag vom:
21-03-2003, 23:13:06

SMS?

So ein Script habe ich schon lang gesucht! Thx to Martin! Gibt es eine (Gratis-)Möglichkeit, den Text als SMS an ein Handy zu verschicken?

-----------------------------------------------------
Umer Hussain


onestone
Administrator
Beitrag vom:
21-03-2003, 00:28:55

Gebe zu, dass ist im Mischmasch mit anderen Sachen irgendwann nachst entstanden. Aber Verbesserungsvorschläge von anderen nehme ich gerne auf, wir können es ja parallel untereinander stellen.

-----------------------------------------------------
Kein Problem kann so komplex sein, dass es keine Lösung dafür gibt.


TheDude
Junior-Member
Beitrag vom:
20-03-2003, 23:01:31

naja

Bin nicht ganz überzeugt von dem code, er funktioniert sicher für diesen bestimmten zweck, aber allgemein...da gibt es einige sachen die mir als programmierer schmerzen bereiten beim hinsehen...,-))

-----------------------------------------------------
while (!asleep()) sheep++;


[back to top]



Userdaten
User nicht eingeloggt

Gesamtranking
Werbung
Datenbankstand
Autoren:04511
Artikel:00815
Glossar:04116
News:13565
Userbeiträge:16552
Queueeinträge:06248
News Umfrage
Ihre Anforderungen an ein Online-Zeiterfassungs-Produkt?
Mobile Nutzung möglich (Ipone, Android)
Externe API Schnittstelle/Plugins dritter
Zeiterfassung meiner Mitarbeiter
Exportieren in CSV/XLS
Siehe Kommentar



[Results] | [Archiv] Votes: 1158
Comments: 0