RSS parsen mit PHP und Magpie
10. Januar 2006 | PHP | Kommentieren »RSS ist heutzutage kaum noch aus dem Internet wegzudenken. Anfangs als Zusatzangebot auf Webseiten, insbesondere bei Blogs, in Erscheinung getreten, hat sich RSS längst zu einem einfachen aber mächtigen Webservice entwickelt, der über eine mehr oder wenige standartisierte Form Informationen an Mensch und Maschine weitergeben kann. So ist es beispielsweise leicht möglich, Fremdinhalte mittels RSS auf die eigene Website zu holen. Das Parsen von RSS-Feeds soll hier im Mittelpunkt stehen.
RSS basiert auf XML
Schaut man sich einen RSS-Feed in Quelltextform an, so hat man reines XML vor sich, welches allerdings ein paar wenigen Regeln gehorchen muss. Jede RSS-Datei beinhaltet zunächst den rss-Tag, der den gesamten Inhalt umschließt. Eine Stufe niedriger schließt sich der channel-Tag an, der wiederum allgemeine Daten zum Feed (title, description) als auch die eigentlichen Informationen (items) beinhaltet. Dank dieses Modells kann jeder RSS-Feed, sofern er sich an diese Vereinbarungen hält, von Feedreadern oder anderen Verwertern gelesen werden.
RSS lesen mit PHP
Selbstverständlich kann man auch mit PHP per RSS übermittelte Daten auswerten. Dazu könnte man sich den vielen Möglichkeiten, mit PHP XML auszulesen, bedienen - oder man nutzt speziell auf RSS-Feeds zugeschnittene externe Bibliotheken. Eine davon, zudem eine sehr beliebte, ist Magpie. Um es gleich vorweg zu nehmen: Magpie hat einige Unzulänglichkeiten. Beispielsweise findet eine Überprüfung der Richtigkeit der RSS-Daten nicht statt und die Unterstützung des aktuellsten RSS-Standards 2.0 ist zum Zeitpunkt der Version 0.72 noch nicht komplett. Dennoch lohnt ein Blick auf Magpie, denn es bietet auch viele Vorteile - sofern man eine PHP-Installation mit dem XML Parser expat zur Vergügung hat, was in der Regel so ist. Magpie kann RSS-Feeds cachen - so werden erst dann neue Informationen vom Server des RSS-Feeds geholt, wenn es auch welche gibt. Zudem gibt Magpie Informationen in PHP-freundlicher Form aus, so dass die Weiterverarbeitung ein Kinderspiel ist.
Magpie startklar machen
Magpie ist ein Open-Source-Projekt, welches dank der GNU General Public License (GPL) kostenlos genutzt werden darf. Unter magpierss.sourceforge.net kann das aktuelle Release herunter geladen werden. Zunächst erstellen wir ein Unterverzeichnis magpie, dort hinein werden die Dateien rss_fetch.in, rss_utils.inc, rss_cache.inc und rss_fetch.inc, sowie das Unterverzeichnis extlib aus dem Magpie-Archiv kopiert. Neben magpie wird noch ein Unterverzeichnis cache erstellt, welches mit Schreibrechten (chmod 775) ausgestattet werden muss.
RSS-Parser starten
Zu den beiden Unterverzeichnissen magpie und cache gesellt sich nun das PHP-Skript, welches einen RSS-Feed lesen und ausgeben soll. In diesem Beispiel soll eine Liste der Überschriften der angebotenen Informationen erscheinen. Darüber hinaus soll die Feed-Bezeichnung und -beschreibung auf dem Bildschirm erscheinen. Zunächst wird magpie eingebunden und konfiguriert.
<?
//Magpie einbinden und konfigurieren
define("MAGPIE_DIR", "./magpierss/");
define("MAGPIE_CACHE_ON", true);
define("MAGPIE_CACHE_DIR", "./cache/");
define('MAGPIE_OUTPUT_ENCODING', "ISO-8859-1");
include(MAGPIE_DIR."/rss_fetch.inc");Die Konstante MAGPIE_DIR gibt an, wo sich die Magpie-Bibliothek befindet, MAGPIE_CACHE_ON schaltet das Cachen von Feeds ein und MAGPIE_CACHE_DIR spezifiziert den Ort, wo die dazu notwendigen Daten abgelegt werden sollen - in diesem Falle, in das beschreibbaren Unterverzeichnis cache. Mittels MAGPIE_OUTPUT_ENCODING gibt man an, in welcher Kodierung die Daten ausgegeben werden sollen. Übrigens: Wird Magpie in einer PHP4-Umgebung ausgeführt, kann es unter Umständen zu Problemen kommen, wenn der Quellfeed mit UTF-8 kodiert ist.
Magpie ist einsatzbereit und wartet nur noch auf den URL des RSS-Feeds.
//Feed-URL
$url = "http://www.pixblog.de/?x=rss";
//Feed laden und parsen
$feed = fetch_rss($url);Mit fetch_rss wird nicht nur der Feed geladen, sondern auch gleich küchenfertig in seine Einzelteile zerlegt und in dem Objekt $feed gespeichert. Es kann angerichtet werden.
RSS-Inhalte ausgeben
//Titel und Beschreibung ausgeben
echo "<h1>" . $feed->channel["title"] . "</h1>";
echo "<h2>" . $feed->channel["description"] . "</h2>";
//Überschriften mit Link in einer Liste ausgeben
echo "<ul>";
foreach ($feed->items as $item) {
$link = $item["link"];
$title = $item["title"];
echo "<li><a href=\"$link\" target=\"_blank\">$title</a></li>";
}
echo "</ul>";
?>$feed ist ein Objekt mit vier Feldern, wovon zwei für diese Beispiele interessant sind: channel und items. channel ist ein assoziatives Array, dessen Feldbezeichnungen sich aus der Struktur unterhalb des channel-Tags des RSS-Feeds ergeben.
...
<channel>
<title>pixblog.de</title>
<link>http://www.pixblog.de/</link>
<description>pixblog.de photoblog</description>
<docs>http://blogs.law.harvard.edu/tech/rss</docs>
<generator>pixelpost</generator>
...Liegt ein solcher RSS-Feed vor, entsteht ein Array mit den Feldern $feed->channel[’title’], $feed->channel[’link’], $feed->channel[’description’], $feed->channel[’docs’] und $feed->channel[’generator’].
items ist auch ein Array, dessen Felder die Beiträge des RSS-Feeds enthalten. Da jeder Beitrag aus Überschrift, Link, Text, … besteht, erfolgt der Zugriff darauf über ein weiteres Array. Ein Blick auf den obigen Quelltext des Skriptes als auch auf folgenden Ausschnitt eines RSS-Feeds macht dies verständlicher.
...
<item>
<title>Herbstnacht am Treptower Hafen</title>
<link>http://www.pixblog.de/?showimage=41</link>
<description><img src="http://www.pixblog.de/thumbnails/thumb_20060109233943_treptow3.jpg" align="right"> Während einer beträchtlichen Belichtungszeit spielt der Wind mit den welken Blättern der Bäume am verstummten Hafen in Berlin Treptow.</description>
<pubDate>Tue, 10 Jan 2006 07:29 +0100</pubDate>
</item>
<item>
<title>Schwedter Steig</title>
<link>http://www.pixblog.de/?showimage=40</link>
<description><img src="http://www.pixblog.de/thumbnails/thumb_20060108200304_schwedter2.jpg" align="right"> Auf dem Weg zur Behmstraße leitet der Schwedter Steig in Berlin Prenzlauer Berg Fußgänger und Radfahrer sicher durch den Herbstnebel.</description>
<pubDate>Sun, 08 Jan 2006 20:03 +0100</pubDate>
</item>
...Hinweise und Ideen
Das nun fertige PHP-Skript gibt die Überschriften aller Nachrichten des RSS-Feeds aus, wobei diese Zahl abhängig vom Betreiber des selbigen ist. Mit den umfangreichen Array-Funktionen von PHP kann man die Ausgabe aber leicht auf ein gewisses Maß einschränken, so dass man beispielsweise nur die zehn neuesten Beiträge ausgeben lässt:
$feed->items=array_slice($feed->items, 0, 10);Mit ein paar Zeilen CSS kann man die Ausgabe auch für’s Auge ansehnlich machen und so nahtlos in jede Website einbauen. Magpie ist auch eine gute Basis, Bloglines oder ähnlichen Diensten Konkurrenz zu machen oder etwas wie dnews anzubieten.
Tags
Bookmarken
Trackback
http://www.devblog.de/index.php/archives/2006/01/10/64/trackback/












Björn meint:
Danke erstmal für die ANleitung. Eine Frage mal: Kann es sein, dass auch einige Anbieter zum Beispiel nicht die Veröffentlichungszeit mit bereitstellen?
Cheatz meint:
Danke gut beschrieben, bisher habe ich es noch nicht hinbekommen. Werde mich aber nun intensiver damit beschäftigen.
Mastblau RSS-Feed mit Magpie parsen meint:
[…] RSS-Feeds bieten eine Menge an Funktionionen und erleichtern dem Surfer wie dem Webmaster das Leben. Nicht nur, dass die Feeds gemütlich mittels einem RSS-Reader gesammelt und verwaltet werden können, diese können auch leicht in die eigene Homepage integriert werden. Mit dem OpenSource Tool MagpieRSS können die einzelnen Feeds einfachst in die eigenen Webseiten integriert werden. Denny Carl vom devblog beschreibt dazu ausführlich, wie Magpie konfiguriert werden kann, um einzelne Feeds auf den eigenen Webseiten anzuzeigen. Ich selbst verwende Magpie seit ca. 2 Jahren ohne Probleme, und mit der eingebauten Cache-Funktion wird die Severlast auf ein Minimum reduziert. Stichwort: rss, rss feed, RSS InfosPopularität unranked […]
cosmictrade meint:
Danke!! Der Artikel war genau dass, was ich benötigt habe. Habe gleich Magpie auf meiner Seite eingebunden, und funktioniert wunderbar. Siehe hier, china eshop community news. Gleich drei Seiten mit newsfeeds erstellt. Die zu parsenden Feeds habe ich in einer separaten php-datei abgelegt, die dann über php include in die Webpage eingebunden wird.
Roland meint:
Echt cool. Hab ne weile gesucht, aber bin ja glücklicherweise auf deiner Page gelandet. Funktioniert wunderbar und ich werde den gleich mal bei mir einbauen.
PS: Mach mal noch vor dein magpierss.sourceforge.net nen http, dann funzt der Link auch wieder
.
Schönen Gruß,
Roland