Yahoo! Query Language (YQL) erklärt
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 <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äft ist Größ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ü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ür Natal bis zu Neuem vom Nukem</span> <span>Festplatte fürs Wohnzimmer mit Füllstandsanzeige</span> <span>Microsoft bestä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ä 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ür alle - Barrierefreie Technologienutzung - Neu! Checkliste fü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.webkrauts.de/2009/12/17/webinhalte-einfach-vermischen-mit-yql/
Der YQL Guide mit vielen Beispielen, Videos etc: http://developer.yahoo.com/yql/guide/
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
Korrekt! Hab es berichtigt, Danke!
Michael Kliewe
14 Jun 10 at 13:33
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
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
[…] 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 […]
Max’ Lesestoff zum Wochenende – 24/2010 | PHP hates me - Der PHP Blog
19 Jun 10 at 07:00
[…] 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 […]
TTMMHTM – lovely HTML5 training book, CPU in minecraft and a few games. | Christian Heilmann's blog – Wait till I come!
18 Nov 10 at 20:21
[…] YQL Erklaerungen in deutsch […]
SWL-Projekt » TTMMHTM – lovely HTML5 training book, CPU in minecraft and a few games.
20 Nov 10 at 22:01