PHPGangsta - Der praktische PHP Blog

PHP Blog von PHPGangsta


Yahoo! Query Language (YQL) erklärt

with 7 comments

Vorwarnung: Dieser Post ist relativ lang, aber mit vielen Beispielen gefüllt und sehr interessant wie ich finde. Wer durchhält, wird belohnt!

Wer von euch schonmal auf Web-APIs zugegriffen hat weiß dass die APIs alle unterschiedlich sind, ein einheitlicher Zugriff ist nicht möglich. Des weiteren möchte man eventuell Daten von Webseiten abgreifen, z.B. direkt aus einer Tabelle Wetterdaten oder Flugdaten auslesen. Dazu muss man den HTML-Code laden, parsen und die Informationen extrahieren.

Für dies und vieles mehr kann man die Yahoo Query Language (YQL) einsetzen. YQL ist eine SQL-ähnliche Sprache um den Yahoo-Servern eine Aufgabe zu geben, die Mengen von Daten betreffen, die die Yahoo-Server sammeln und das Ergebnis berechnen, welches man dann in einer einheitlichen XML-Antwort oder als JSON erhält.

Wer sich das nicht vorstellen kann, hier ein paar Einführungsbeispiele:

Wir greifen auf die „virtuelle Tabelle“ flickr.photos zu und möchten 10 Fotos haben die mit Katzen zu tun haben:

select * from flickr.photos.search where text="Cat" limit 10

Das Ergebnis sieht dann wie folgt aus:

<?xml version="1.0" encoding="UTF-8"?>
<query xmlns:yahoo="http://www.yahooapis.com/v1/base.rng" yahoo:count="10" yahoo:created="2010-06-11T08:46:15Z" yahoo:lang="en-US">
    <results>
        <photo farm="5" id="4691131143" isfamily="0" isfriend="0" ispublic="1" owner="45068189@N04" secret="8d771ee481" server="4004" title="Miishoo &lt;3"/>
        <photo farm="2" id="4691768486" isfamily="0" isfriend="0" ispublic="1" owner="7348297@N03" secret="2a194ea37c" server="1286" title="Maasikad elutoas / Strawberries in living room"/>
        <photo farm="5" id="4691122535" isfamily="0" isfriend="0" ispublic="1" owner="87903647@N00" secret="934339f441" server="4001" title="Birdy"/>
        <photo farm="5" id="4691754660" isfamily="0" isfriend="0" ispublic="1" owner="77493975@N00" secret="325339bb4d" server="4006" title="TheEdgeOfDreaming_12"/>
        <photo farm="5" id="4691754402" isfamily="0" isfriend="0" ispublic="1" owner="87903647@N00" secret="24a0a41924" server="4040" title="Birdy"/>
        <photo farm="5" id="4691744462" isfamily="0" isfriend="0" ispublic="1" owner="49190197@N04" secret="ce789b4f94" server="4003" title="Cat"/>
        <photo farm="5" id="4691114247" isfamily="0" isfriend="0" ispublic="1" owner="50345411@N08" secret="0b1763e77f" server="4050" title="More Sink-iness"/>
        <photo farm="4" id="4559034920" isfamily="0" isfriend="0" ispublic="1" owner="12572868@N08" secret="b787a9ee10" server="3270" title=""/>
        <photo farm="5" id="4691741730" isfamily="0" isfriend="0" ispublic="1" owner="50411747@N06" secret="e06f30b8d0" server="4040" title="Leave me alone..I'm going to sleep."/>
        <photo farm="2" id="4691741494" isfamily="0" isfriend="0" ispublic="1" owner="50411747@N06" secret="64896cc3eb" server="1274" title="Sleepy boy."/>
    </results>
</query>

Inklusive der Community Tables sind 793 dieser Datenquellen verfügbar und es kommen fast täglich welche dazu, man kann natürlich auch selbst welche erstellen und veröffentlichen.

Hier holen wir uns die letzten 5 Titel des Heise-RSS-Feeds. Hierbei zu beachten: Yahoo cacht die Datei, und liefert uns nur 5 Einträge, obwohl der Feed im Original 50 Einträge enthält. Außerdem filtert uns Yahoo nur den Titel heraus, alle anderen Informationen brauchen wir nicht. Wir haben also minimale CPU-Last und geringen Traffic.

select title from rss where url="http://www.heise.de/newsticker/heise.rdf" limit 5

Das Ergebnis:

<?xml version="1.0" encoding="UTF-8"?>
<query xmlns:yahoo="http://www.yahooapis.com/v1/base.rng" yahoo:count="5" yahoo:created="2010-06-11T09:32:51Z" yahoo:lang="en-US">
    <results>
        <item xmlns="http://my.netscape.com/rdf/simple/0.9/">
            <title>Im TV-Gesch&auml;ft ist Gr&ouml;&szlig;e gefragt</title>
        </item>
        <item xmlns="http://my.netscape.com/rdf/simple/0.9/">
            <title>Motorola und RIM legen Patentstreit bei</title>
        </item>
        <item xmlns="http://my.netscape.com/rdf/simple/0.9/">
            <title>Bitkom rechnet mit raschem Ausbau des breitbandigen Mobilfunks</title>
        </item>
        <item xmlns="http://my.netscape.com/rdf/simple/0.9/">
            <title>Bericht: E-Book-Pionier Irex in Schwierigkeiten</title>
        </item>
        <item xmlns="http://my.netscape.com/rdf/simple/0.9/">
            <title>All-in-One-PC mit Core-i-Prozessor f&uuml;r Firmen</title>
        </item>
    </results>
</query>

Wir möchten die 5 ersten Artikel-Überschriften von Golem:

select content from html where url="http://www.golem.de" and xpath="//h2/a/span" limit 5

Wir holen sie also nicht aus dem RSS-Feed, sondern direkt aus dem HTML-Code der Seite, indem wir per XPath alle h2-Tags suchen, die einen Link und ein span-Element drin haben. Und hier sind sie:

<?xml version="1.0" encoding="UTF-8"?>
<query xmlns:yahoo="http://www.yahooapis.com/v1/base.rng" yahoo:count="5" yahoo:created="2010-06-11T09:21:56Z" yahoo:lang="en-US">
    <results>
        <span>Leichtes Solarflugzeug soll Monate in der Luft bleiben</span>
        <span>Vom Namen f&uuml;r Natal bis zu Neuem vom Nukem</span>
        <span>Festplatte f&uuml;rs Wohnzimmer mit F&uuml;llstandsanzeige</span>
        <span>Microsoft best&auml;tigt Windows-Sicherheitsloch und ist sauer</span>
        <span>Google bricht Werbeaktion auf der Suchstartseite ab</span>
    </results>
</query>

Mit dem folgenden Query bekommen wir diese Überschriften übersetzt auf Finnish:

select * from google.translate where q in (
     select content from html where url="http://www.golem.de" and xpath="//h2/a/span" limit 5
) and target="fi"

Wer finnisch kann möge die Qualität von Google Translate beurteilen:

<?xml version="1.0" encoding="UTF-8"?>
<query xmlns:yahoo="http://www.yahooapis.com/v1/base.rng" yahoo:count="5" yahoo:created="2010-06-11T09:26:41Z" yahoo:lang="en-US">
    <results>
        <translatedText>Kevyt aurinko ilma pysyy ilmassa kuukauden</translatedText>
        <translatedText>Nimest&auml; Natal uuden Nukem</translatedText>
        <translatedText>Vaikea olohuone osoitin</translatedText>
        <translatedText>Microsoft vahvistaa, Windows tietoturva-aukko ja on hapan</translatedText>
        <translatedText>Googlen mainoskampanja rikkoo kiinni haku kotisivu</translatedText>
    </results>
</query>

Hier noch ein letztes SELECT Beispiel das ich von Oliver Schwarz geklaut habe. Darin sieht man die Sortierfunktion und das anschliessende Abschneiden (Alternative zu Limit welches man vor dem Sortieren nutzen könnte):

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)

Das Ergebnis ist ein Mix aus allen Quellen:

<?xml version="1.0" encoding="UTF-8"?>
<query xmlns:yahoo="http://www.yahooapis.com/v1/base.rng" yahoo:count="5" yahoo:created="2010-06-11T09:44:44Z" yahoo:lang="en-US">
    <results>
        <item>
            <title>oliverschwarz: HA! RT @jrotering: Up early to finish building the World Wide Web.   Someone's got to do it.</title>
            <pubDate>Fri, 11 Jun 2010 10:02:02 +0000</pubDate>
            <link>http://twitter.com/oliverschwarz/statuses/15917732651</link>
        </item>
        <item>
            <title>oliverschwarz: RT @steno: WTF is HTML5 (infographic) http://bit.ly/aIxSvh  #html5 #sheet via @sprungmarkers</title>
            <pubDate>Thu, 10 Jun 2010 09:59:37 +0000</pubDate>
            <link>http://twitter.com/oliverschwarz/statuses/15840068112</link>
        </item>
        <item>
            <title>WTF is HTML5 (Infographic)</title>
            <pubDate>Thu, 10 Jun 2010 09:59:24 +0000</pubDate>
            <link>http://www.focus.com/images/view/11905/</link>
        </item>
        <item>
            <title>Zugang f&uuml;r alle - Barrierefreie Technologienutzung - Neu! Checkliste f&uuml;r barrierefreies Webdesign 2.0</title>
            <pubDate>Thu, 10 Jun 2010 09:58:28 +0000</pubDate>
            <link>http://www.access-for-all.ch/ch/barrierefreiheit/barrierefreies-webdesign/checklist-2.html</link>
        </item>
        <item>
            <title>oliverschwarz: RT @mayflowerphp: Check out this SlideShare presentation : HTML 5 Security http://slidesha.re/cG73TL</title>
            <pubDate>Wed, 09 Jun 2010 12:09:55 +0000</pubDate>
            <link>http://twitter.com/oliverschwarz/statuses/15777203994</link>
        </item>
    </results>
</query>

Aber nicht nur Daten abfragen ist möglich, mit Hilfe von INSERT/UPDATE/DELETE können wir auch schreibend auf APIs zugreifen!

INSERT INTO wordpress.post (title, description, blogurl, username, password) VALUES ("Test Title", "This is a test body", "http://yqltest.wordpress.com", "yqltest", "password")

oder:

INSERT INTO bitly.shorten (login, apiKey, longUrl)  VALUES ('USERNAME', 'API_KEY', 'http://yahoo.com')

oder einen Löschbefehl senden:

DELETE FROM twittertable WHERE tweetid="12345" and username="twitter_username" and password="twitter_password"

Ich hoffe man sieht dass man viele erdenkliche Daten sehr einfach abfragen und nutzen kann. Flickr, Youtube, Wikipedia, Twitter, RSS-Feeds, HTML… All diese Queries kann man entweder direkt per URL „ausführen“:

http://query.yahooapis.com/v1/public/yql?q=select * from html where url%3D“http%3A%2F%2Fwww.slideshare.net%2Fnateabele%2Fpractical-php-53″ and xpath%3D’%2F%2Fol%2Fli’&format=xml
(Damit erhält man das Transcript einer Präsentation aus Slideshare über PHP 5.3)

oder zum Testen erstmal in der YQL-Console ausprobieren, dort ist auch die Liste aller Data-Tables sichtbar.

Bevor man also viel Arbeit in die Abfrage von APIs steckt oder häufiger Daten von anderen Webseiten einbinden möchte sollte man sich YQL genauer anschauen.

———————————————————

Hier noch einige interessante Links mit Beispielen:

http://www.wait-till-i.com/2009/01/11/adding-transcripts-to-presentations-embedded-from-slideshare-using-yql/

http://www.wait-till-i.com/2009/08/10/die-reise-zum-mittelpunkt-der-daten-vortrag-am-webmontag-in-frankfurt/

http://www.webkrauts.de/2009/12/17/webinhalte-einfach-vermischen-mit-yql/

Der YQL Guide mit vielen Beispielen, Videos etc: http://developer.yahoo.com/yql/guide/

Written by Michael Kliewe

Juni 14th, 2010 at 10:13 am

7 Responses to 'Yahoo! Query Language (YQL) erklärt'

Subscribe to comments with RSS or TrackBack to 'Yahoo! Query Language (YQL) erklärt'.

  1. Schöner Artikel. In deinem ersten Beispiel hat sich ein Tippfehler eingeschlichen. Du meinst wohl limit 10 um die ersten 10 zu bekommen und nicht limit 5.

    Viele Grüße

    Norbert Bartels

    14 Jun 10 at 12:57

  2. Korrekt! Hab es berichtigt, Danke!

    Michael Kliewe

    14 Jun 10 at 13:33

  3. Cooler Artikel! Ich hatte YQL schon seit langem auf der TODO Liste stehen. Jetzt ist die erste Huerde schon genommen und YQL ist weiter nach oben gerutscht. Danke!

    Christian

    14 Jun 10 at 16:51

  4. Ja, cooler Artikel. Muss ich unbedingt mal ausprobieren.

    Jetzt weiss ich endlich, wie die ganzen Vergleichsplattformen die Daten bekommen (bzw. vermute ich einfach mal)

    Ralph Meier

    16 Jun 10 at 21:32

  5. […] the teenage years | php|architect Vergangenheit und Zukunft, wo PHP hinsteuern könnte/sollte Yahoo! Query Language (YQL) erklärt | PHP Gangsta – Der PHP Blog YQL verständlich erklärt und mit einigen Beispielen aufbereitet. Gibt finde ich einen guten […]

  6. […] between web sites.Andrew Woolridge has a great writeup on how to create web services with JS and YQLYQL Erklaerungen in deutschChaos invaders – bit confusing but then pretty cool3D Pong in jQuery is quite a lot […]

  7. […] YQL Erklaerungen in deutsch […]

Leave a Reply

You can add images to your comment by clicking here.