Rheinwerk Computing < openbook > Rheinwerk Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

Inhaltsverzeichnis
Geleitwort
Vorwort
1 PEAR – Einführung
2 Authentication
3 Caching
4 Date and Time
5 File Formats
6 HTTP
7 Internationalization
8 Mail
9 Networking
10 PHP
11 Text
12 Web Services
13 Benchmarking
14 Configuration
15 Database
16 File System
17 HTML
18 Images
19 Logging
20 Math
21 Numbers
22 Tools and Utilities
23 XML
24 Selbst Pakete erstellen
25 PECL
Index
Ihre Meinung?

Spacer
 <<   zurück
PHP PEAR von Carsten Möhrke
Anwendung und Entwicklung – Erweiterungen für PHP schreiben
Buch: PHP PEAR

PHP PEAR
798 S., 39,90 Euro
Rheinwerk Computing
ISBN 3-89842-580-0
gp 12 Web Services
  gp 12.1 Services_Google
  gp 12.2 Services_Amazon
  gp 12.3 Services_Weather
    gp 12.3.1 weather.com
    gp 12.3.2 Globalweather
  gp 12.4 Services_Ebay

12 Web Services

Web Services sind ein sehr spannendes und aktuelles Thema. Immer mehr Betreiber von Internet-Plattformen bieten Schnittstellen an, mit denen Sie deren Dienste in Ihre Anwendungen einbinden können. Neben Google oder Ebay gehört beispielsweise auch Amazon dazu.

Web Services werden von den meisten Anbietern noch kostenlos angeboten. Allerdings möchte ich Sie bitten, immer einen Blick in die AGB des Anbieters zu werfen, bevor Sie einen Web Service nutzen. Da alle Anbieter natürlich auf die eine oder andere Art ein kommerzielles Interesse haben, kann es durchaus passieren, dass ein Anbieter zukünftig Gebühren erhebt oder auf die Einblendung eines Copyright-Vermerks oder von Werbung besteht.

Vorweg ein kleiner Hinweis: Die meisten Web Services sind heutzutage für eine internationale Zielgruppe ausgelegt. Um Probleme mit verschiedenen Zeichensätzen zu vermeiden, wird oft der UTF-8-Zeichensatz genutzt. Bitte beachten Sie, dass Sie Daten, beispielsweise wenn sie von einer Suchmaske übernommen werden, entsprechend kodieren müssen.


Rheinwerk Computing

12.1 Services_Google  toptop


Besprochene Version: 0.1.1 Lizenz: PHP-Lizenz 2.02
Klassendatei(en): Services/Google.php

Die Suchmaschine Google stellt seit geraumer Zeit eine Schnittstelle zur Verfügung, um den Leistungsumfang von Google extern nutzbar zu machen. Services_Google bietet Methoden, mit denen Sie die Funktionalitäten von Google schnell und einfach in Ihre Scripts einbinden können.

Um über diese API auf Google zuzugreifen, benötigen Sie einen Lizenz-Schlüssel. Dieser kann kostenlos unter dieser URL angefordert werden: http: //www.google.de/apis/. Bitte klicken Sie dort den Punkt »Create a Google Account« an, und folgen Sie den Anweisungen.

Der Schlüssel, den Google Ihnen zuschickt, authentifiziert Sie gegenüber dem System. Sie sind damit berechtigt, bis zu 1000 Suchabfragen pro Tag auszuführen.

Diesen Schlüssel übergeben Sie direkt dem Konstruktor. Sobald das Objekt instanziiert ist, können Sie den Text, nach dem Sie suchen, an die Methode query() übergeben. Diese führt sofort die Abfrage durch, wobei sie davon ausgeht, dass die übergebenen Daten im UTF-8-Format vorliegen. Um herauszufinden, wie viele Datensätze gefunden wurden, können Sie die Methode numResults() aufrufen. Werden sehr viele Datensätze gefunden, wird die Anzahl der Treffer nur geschätzt.

Interessant ist, dass die Klasse Services_Google ein Iterator ist. Genauer gesagt implementiert sie das Interface Iterator. Das hat zur Folge, dass Sie die einzelnen Datensätze nicht von Hand mit der Methode fetch() auslesen müssen. Sie können das Objekt direkt in einer foreach-Schleife nutzen, die dann die einzelnen gefundenen Datensätze ausliest.

Eine kleine »Suchmaschine« auf Basis von Services_Google könnte so funktionieren wie in Listing 12.1.

 
require_once('Services/Google.php'); 
 
// Ueberpruefung, ob schon eine Suchabfrage abgeschickt wurde 
if (true===isset($_POST['query'])) 
{ 
   $query=$_POST['query']; 
} 
else 
{ 
   $query=''; 
} 
 
// Ausgabe des Formulars 
echo <<<EOF 
<form method='post'> 
Suchtext <input type='text' name='query' value='$query'/> 
<br /> 
<input type='submit' value='Suchen' /> 
</form> 
EOF; 
 
// Wurde eine Anfrage abgeschickt? 
if (''!==$query) 
{ 
   // Hier muss _IHR_ Schluessel eingefuegt werden 
   $key = "UiFsjg1QFHWurZeLTJZmExQHzE1KKQx4Tc3s7"; 
 
   // Neues Objekt ableiten 
   $google = new Services_Google($key); 
 
   // Ergebnisliste auf 10 Treffer beschraenken 
   $google->queryOptions['limit'] = 10; 
 
   // Suche ausfuehren 
   $google->search(utf8_encode($query)); 
 
   // Gab es einen Treffer? 
   if (0==$google->numResults()) 
   { 
      echo "F&uuml;r $query konnten keine Ergebnisse 
                                            gefunden werden"; 
   } 
   else 
   { 
      // Treffer ausgeben 
      echo '<table>'; 
      // Ergebnisse ausgeben 
      foreach($google as $result) 
      { 
         echo '<tr><td><u>Link</u>: '; 
         echo "<a href='$result->URL' target='_blank'>"; 
         echo utf8_decode($result->title); 
         echo '</a>'; 
         echo '</td></tr>'; 
 
         if (''!==$result->summary) 
         { 
            echo '<tr><td><u>Zusammenfassung</u>: '; 
            echo utf8_decode($result->summary); 
            echo '</td></tr>'; 
         } 
 
         echo '<tr><td>'; 
         echo utf8_decode($result->snippet); 
         echo '</td></tr>'; 
         echo '<tr><td>&nbsp;</td></tr>'; 
      } 
      echo '</table>'; 
   } 
}

Listing 12.1 Suchformular auf Basis von Services_Google

Abbildung 12.1 Ausgabe der Suchabfrage im Browser

Wie Sie in Listing 12.1 sehen, können Sie das Services_Google-Objekt direkt in einer Schleife nutzen. Jeder Treffer, den Google zurückgeliefert hat, wird hier in Form eines Arrays zurückgegeben. Die Daten, die in diesem Array enthalten sind, liegen im UTF-8-Zeichensatz vor, so dass sie dekodiert werden müssen.

Wie Sie in Abbildung 12.1 sehen können, sind die Suchbegriffe in den Fundstellen markiert. Die Begriffe werden direkt durch Google markiert, indem sie durch <b></b> eingeschlossen werden.

Innerhalb des Arrays ist eine Vielzahl von verschiedenen Schlüsseln enthalten, in denen die einzelnen Werte zurückgegeben werden. Eine Liste der Eigenschaften finden Sie in Tabelle 12.1.

Einige der Informationen, die zurückgegeben werden, beziehen sich auf das Open Directory Project, kurz ODP genannt. Hierbei handelt es sich um ein nicht kommerzielles Katalog-System, das Sie unter http://dmoz.org bzw. http://dmoz.de im Internet finden.


Tabelle 12.1 Schlüssel im Ergebnis-Array
Schlüssel Erläuterung
summary Zusammenfassung der Seite; wird vom ODP übernommen und ist nicht immer vorhanden
URL Die absolute URL der gefundenen Datei
snippet Auszug aus dem Text der gefundenen Seite
title Titel der gefundenen Seite; üblicherweise der Inhalt des Title-Tags
cachedSize Größe der bei Google gecachten Kopie der Datei
relatedInformationPresent Enthält den booleschen Wert true, wenn Google ähnliche Seiten kennt.
hostName Hier ist der Name des Hosts abgelegt, falls mehr als zwei Seiten vom selben Host kommen und die Option filter eingeschaltet ist.
directoryCategory Enthält ein Array mit den Feldern fullViewableName und specialEncoding. Der erste Wert ist der komplette Pfad zu der Kategorie im ODP (Top/Computers/Programing /Languages/PHP), und der zweite enthält eventuell einen speziellen Zeichensatz.
directoryTitle Ist der Server im ODP gelistet, finden Sie hier den Namen der Kategorie.

Um das Verhalten von Google bei Suchabfragen zu beeinflussen, gibt es zwei unterschiedliche Ansätze. Zum Ersten können Sie natürlich alle Schlüsselwörter und Konstrukte in Ihrer Abfrage nutzen, die Google bei der Suche unterstützt. Mit "Hänsel und Gretel" würden also nur die Seiten gefunden, auf denen exakt die Phrase Hänsel und Gretel zu finden ist, und die Suchabfrage xml site:www.galileocomputing.de würde nur Seiten vom Server www.galileocomputing.de zurückgegeben, auf denen der String xml vorkommt. Die komplette Syntax-Referenz finden Sie unter http://www.google.de/apis/refe rence.html#2_2.

Zum Zweiten ist in dem Services_Google-Objekt eine Eigenschaft namens queryOptions definiert. Hierbei handelt es sich um ein Array. Der Schlüssel maxResults legt fest, wie viele Suchergebnisse maximal mit dieser Anfrage zurückgegeben werden. Das heißt, hiermit definieren Sie, wie lang der Ausschnitt sein soll, der aus der Gesamtliste der Ergebnisse zurückgegeben werden soll. An welcher Stelle dieses »Fenster« beginnt, wird über die Option start definiert. [Bei der Nutzung der Option start generiert das Paket zurzeit sporadisch Fehler. ]

Mit dem Schlüssel restrict können Sie die Suchergebnisse nach bestimmten Kriterien einschränken. Die Restriktionen werden als String übergeben. Um die zulässigen Sprachen zu verändern, können Sie einen String übergeben, der mit lang_ beginnt. Beispielsweise steht lang_de für Deutsch, lang_ja für Japanisch und lang_da für Dänisch. Google hat sich nicht ganz an die ISO-Sprachcodes gehalten, so dass ich Sie an dieser Stelle auf die Google-API-Referenz verweisen möchte: http://www.google.de/apis/reference.html#2_4.

Google unterstützt auch eine Selektion nach Ländern. Um herauszufinden, zu welchem Land eine Domain gehört, benutzt Google einen Algorithmus, der die Toplevel-Domain, die Sprache und die IP-Adresse auswertet. Somit können auf Seiten, die Google als zu Deutschland gehörend identifiziert, durchaus auch englische oder anderssprachige Texte zu finden sein. Die Strings, die die Länder identifizieren, werden mit country eingeleitet und enden auf den entsprechenden ISO-Code, der in Großbuchstaben anzugeben ist, also countryDE für Deutschland, countryFR für Frankreich und so weiter. Eine komplette Liste der unterstützten Länder finden Sie unter der URL, in der auch die Sprachen erläutert werden.

Des Weiteren kennt Google noch vier Einschränkungen nach Themenbereich. Seiten, die sich mit dem Thema Linux beschäftigen, werden über linux referenziert. bsd schränkt die Seiten auf das Thema FreeBSD ein und mac auf den Apple Macintosh. Die letzte Kategorie in diesem Zusammenhang ist unclesam und umfasst Seiten der amerikanischen Regierung.

Diese einzelnen Strings können Sie mithilfe vorgegebener Operatoren miteinander verknüpfen. Ein logisches Und wird mit einem Punkt (.) symbolisiert, das Oder mit einem Pipe-Symbol (|), und um Seiten auszuschließen, auf die einer der oben genannten Strings zutrifft, können Sie den String mit einem Minus davor (-) negieren. Um Seiten zu finden, die deutschsprachig sind oder aus Deutschland kommen, nutzen Sie:

$google->queryOptions['restricts'] = 'lang_de|countryDE';

Mit

$google->queryOptions['restricts'] = 'lang_de.-countryDE';

würden deutschsprachige Seiten gefunden, die nicht aus Deutschland kommen, und es ist auch möglich, Teilausdrücke mithilfe von Klammern zu gruppieren:

$google->queryOptions['restricts'] = 
               '(lang_de).(-(countryDE|countryAT|countyCH))';

Damit würden nur deutschsprachige Seiten gefunden, die nicht aus Deutschland, Österreich oder der Schweiz kommen.

Um Seiten mit pornografischen oder anderen Inhalten auszuschließen, die sich primär an volljährige Personen richten, können Sie mit dem Feld safeSearch den Wert true übergeben.

Die letzte Option ist der Filter, der mithilfe eines booleschen Werts im Schlüssel filter ein- oder ausgeschaltet werden kann. Ist der Filter eingeschaltet, nutzt Google den »Near-Duplicate Content Filter« und das »Host Crowding«. Die erste Funktion definiert, dass unterschiedliche Seiten, die einen identischen bzw. sehr ähnlichen Inhalt haben, nicht ausgegeben werden. Das »Host Crowding« sorgt dafür, dass immer dann, wenn mehrere Seiten vom selben Server kommen, nur zwei Seiten ausgegeben werden. In dem Fall ist in der Eigenschaft hostName des Rückgabeobjekts der Name des Servers enthalten.

Sollte eine Anfrage keine oder nur sehr wenige Treffer zurückliefern, kann es sein, dass ein Tippfehler vorliegt. In so einem Fall können Sie die Methode spellingSuggestion() nutzen. Sie bekommt einen UTF-8-kodierten String übergeben und prüft in der Google-Datenbank, ob es einen Text gibt, der »ähnlich« ist, und liefert diesen zurück.

$suggestion=$google->spellingSuggestion(utf8_encode($query)) 
echo "Meinten Sie: \"$suggestion\"";

Wenn Sie Google nutzen, kennen Sie sicher den Link »Im Cache«, der bei jedem Suchergebnis eingeblendet wird. Da Google jede indizierte Seite in einem Cache ablegt, können Sie auch auf diesen Cache zugreifen. Die Methode getCachedPage() bekommt die URL der Seite übergeben, die Sie aus dem Cache auslesen wollen, und liefert sie als String zurück. Google liefert die Datei Base64-kodiert zurück. Die Methode dekodiert diese Daten direkt, so dass der Rückgabewert im ursprünglichen Zeichensatz vorliegt.

Bei der Nutzung der Google-API sind momentan einige Einschränkungen durch Google vorgegeben. Neben der Tatsache, dass Sie nur 1000 Abfragen pro Tag durchführen können, sind noch die folgenden Punkte zu beachten.

Der Query-String für eine Suchabfrage darf maximal 2048 Bytes lang sein. Die Anzahl der Wörter ist hierbei auf 10 beschränkt. Das Schlüsselwort site: darf innerhalb der Abfrage nur einmal vorkommen.

Pro Abfrage liefert Google maximal 10 Treffer zurück, [Das geht aus der API-Referenz hervor. Ich habe aber auch schon mehr Ergebnisse pro Anfrage erzielen können. ] wobei pro Query-String insgesamt maximal 1000 Treffer ausgelesen werden können. Das heißt, dass das Feld start in der Eigenschaft queryOptions in Summe mit dem Inhalt des Feldes maxResults maximal 1000 ergeben darf.

 <<   zurück
     
  Zum Katalog
Zum Katalog: PHP PEAR
PHP PEAR
Jetzt bestellen!
 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Buchtipps
Zum Katalog: PHP 5.6 und MySQL 5.7






 PHP 5.6 und
 MySQL 5.7


Zum Katalog: Einstieg in PHP 5.6 und MySQL 5.6






 Einstieg in PHP 5.6
 und MySQL 5.6


Zum Katalog: Responsive Webdesign






 Responsive Webdesign


Zum Katalog: Moderne Websites entwickeln






 Moderne Websites
 entwickeln


Zum Katalog: MySQL 5.6






 MySQL 5.6


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo








Copyright © Rheinwerk Verlag GmbH 2007
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


[Rheinwerk Computing]

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de