RSS-Feeds mit YQL aggregieren und abrufen

YQL hatte sich innerhalb kürzester Zeit zu einem meiner Lieblingswerkzeuge gemausert. Schon seit über einem Jahr hatte Yahoo!s Developer Evangelist Chris Heilmann in regelmäßigen Abständen die Fähigkeiten der API für APIs unter Beweis gestellt. Die Yahoo! Query Language ist eine SQL-ähnliche Syntax, unter deren Verwendung man alle möglichen Dritt-Schnittstellen einheitlich abrufen kann. Die kleinen Beispiele in diesem Artikel sollen zeigen, welchen Einsatzzweck diese Schnittstelle haben kann. Werfen wir mal einen Blick auf einen einfachen Aufruf:

select * from html where url='http://mashable.com'

Diese Query ist relativ sinnfrei, liefert sie doch das gesamte body-Konstrukt der mashable.com-Startseite. Dennoch erkennt man schon das Potenzial, wenn man für den Zugriff auf Inhalte eine Art SQL anwenden kann. Öffnet man diese Query in der YQL-Konsole, kann man sich die Rückgabewerte anzeigen lassen.Nehmen wir einmal an, mashable.com hätte keinen RSS-Feed, wir möchten aber gerne die neuesten drei News abrufen und in unserer Webseite zeigen. Mit ein bisschen xpath-Magie und einen Blick in den Quelltext ist das kein Problem. mashable.com verwendet WordPress und versteckt seine News in einem div-Element und dort in einem h2/a-Konstrukt. Eine Funktion reduziert die Resultate auf die obersten 3. In Verbindung mit einer XML-Query sieht unsere Abfrage also so aus:

select * from html
    where url='http://mashable.com'
    and xpath='//div/h2/a' | truncate(count=3)

Am besten schaut man sich das Resultat wieder in der YQL-Konsole an. Wählt man JSON als Output und ruft das Ganze über die API ab, kann man leicht durch das Resultat iterieren.

Abruf von mehreren Feeds

Wie der Abruf eines HTML-Konstruktes ist auch das Einlesen von RSS-Feeds überaus einfach. Nehmen wir an, ich möchte die letzten Einträge des Hasematzel-RSS einlesen – und zwar nur die Titel, Links und das Veröffentlichungsdatum der einzelnen Einträge. Die Query sieht dann so aus:

select title, link, pubDate from rss
    where url='http://feeds.feedburner.com/hasematzel'

Im Ausgabefenster der Konsole sind die Einträge nach Datum absteigend sortiert. Das liegt bei RSS in der Natur der Dinge. Bei der Aggregierung von mehreren Feeds bekomme ich aber die Feeds (nicht die Beiträge) nacheinander angezeigt. Ich rufe mal meinen delicious.com-Feed und meinen Twitter-Feed ab:

select title, link, pubDate from rss
    where url in (
        'http://twitter.com/statuses/user_timeline/818226.rss',
        'http://feeds.delicious.com/v2/rss/hasematzel?count=15')

Bei zwei Feeds könnte man ja noch schnell ein bisschen Basteln, die Rückgabe auseinandernehmen und die Arrays/Objekte in der richtigen Reihenfolge wieder zusammenfügen. Je mehr Feeds man aber aggregiert, umso umständlicher wird das. Zusätzlich bürde ich meinem Code zusätzliche Arbeit auf, die auch YQL verrichten kann.

select title, link, pubDate from rss
    where url in (
        'http://twitter.com/statuses/user_timeline/818226.rss',
        'http://feeds.delicious.com/v2/rss/hasematzel?count=15',
        'http://oliverschwarz.tumblr.com/rss',
        'http://piepmatzel.de/feed/')

Sortieren und Abschneiden

Für die Sortierung (und auch das Abschneiden) von Daten hat das YQL-Team spezielle Funktionen bereitgestellt. Die Funktionen werden einfach am Ende der Query positioniert. So ist es möglich, zunächst nach pubDate aufsteigend zu sortieren und das Resultat zusätzlich auf maximal fünf Einträge zusammenzuschneiden:

select title, link, pubDate from rss
    where url in (
        'http://twitter.com/statuses/user_timeline/818226.rss',
        'http://feeds.delicious.com/v2/rss/hasematzel?count=15',
        'http://oliverschwarz.tumblr.com/rss','http://piepmatzel.de/feed/'
    ) | sort(field='pubDate',descending='true') | truncate(count=5)

So einfach ist das mit YQL. Der Spasseffekt kommt dann auf, wenn ich das nicht nur in der YQL-Konsole mache, sondern die Resultate über die API abrufe. Dazu wird es dann noch einmal einen zusätzlichen Beitrag geben. In Chris Heilmanns github-Account gibt es dazu auch schon jede Menge Beispiele. Vor dem Einsatz in produktiven Systemen sollte damit gerechnet werden, dass die YQL-API auch mal nicht da sein kann. Es empfiehlt sich, die Ergebnisse für einen gewissen Zeitraum zu cachen (Dirk Ginader hat dazu eine einfache Lösung).

Dieser Beitrag wurde unter Tipps & Tricks, Tutorial, Werkzeuge abgelegt und mit , , , , verschlagwortet. Setze ein Lesezeichen auf den Permalink.

5 Antworten auf RSS-Feeds mit YQL aggregieren und abrufen

  1. Pingback: Yahoo! Query Language (YQL) erklärt | PHP Gangsta - Der PHP Blog

  2. Steven sagt:

    Geil. Das teste ich auch mal… gibt es auch die Möglichkeit mit YQL Texte zu übersetzen?

  3. Oliver sagt:

    Ja, ohne Probleme. Der Weg: Den Text per YQL an den Google Translator übergeben und das Resultat auslesen. Den Code gibt es hier:http://github.com/oliverschwarz/translatorDie Demo hier:http://wrkplace.de/sandbox/translator/

  4. Steven sagt:

    Cool danke dir. Gruß Steven

  5. Pingback: Linkdump vom Mi, 06. Juli 2011 bis Do, 07. Juli 2011 Links synapsenschnappsen

Hinterlasse eine Antwort

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *

*

Du kannst folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>