Kategorien
Webdesign

Workshop Webservices: Google Webservices mit PHP nutzen

Auch Google stellt seine Dienstleistungen über Webservices Entwicklern zur Verfügung. Angepasste Suchergebnisse können ohne weiteres in eigene Projekte eingebunden werden. Zur Hilfe kommt PHP. Zwar befinden sich die Google Webservices immer noch in einer Testphase,…

Auch Google stellt seine Dienstleistungen über Webservices Entwicklern zur Verfügung. Angepasste Suchergebnisse können ohne weiteres in eigene Projekte eingebunden werden. Zur Hilfe kommt PHP.

Zwar befinden sich die Google Webservices immer noch in einer Testphase, doch findet man im Internet bereits zahlreiche Anwendungen. Zum Beispiel die „Übersuchmaschine“ Fast Forward, die jede Menge mehr aus Google herausholt. Oder Douwe Osingas fantasievolle Google Hacks.

Um mit der Entwicklung von Anwendungen mit Webservices zu starten, sollte man sich zunächst die Entwickler API bei Google herunterladen – sie enthält auch eine ausführliche Dokumentation.

Weiterhin muss man sich als Entwickler einmalig registrieren. Man erhält man eine Entwicklerkennung per Email, die bei jeder Google Webservice Implementierung verwendet werden muss.

Die Nutzung von Google über Webservices ist für den Privatanwender eingeschränkt. So sind nur maximal 1000 Suchanfragen pro Tag möglich, bei welchen maximal 10 Ergebnisse angezeigt werden. Für kleine Webseiten lohnt sich dies jedoch bereits – da man die Google Suchtechnik für die eigene Homepage kostenlos verwenden kann.

Google verwendet bei seinen Webservices das SOAP Protokoll (Simple Object Access Protocol), welches die Kommunikation zwischen Anwendungen auf Basis von HTTP ermöglicht. Dabei werden Anfragen und Antworten der Applikationen in einer normierten Form dargestellt. SOAP ist Teil einer W3C Empfehlung für die Konstruktion von Webservices und ein Kernelement von Microsofts .NET Architektur.

Für die Nutzung von SOAP mit PHP gibt es mit NUSoap von Dietrich Ayala eine mächtige PHP-Klasse die kostenlos heruntergeladen werden kann. Dabei werden die Parameter, die für den Webservice relevant sind – bei der Google Suche ist das insbesondere der Suchstring – an ein Objekt der NUSoap Klasse übergeben. Diese macht aus den Parametern eine in SOAP verfasste Suchanfrage und übermittelt diese an den Google Webservice. Dieser beantwortet nach Verarbeitung der Anfrage ebenfalls über eine SOAP Nachricht. Sie wird wiederum von NUSoap in ein bearbeitbares Objekt überführt.

Die Struktur beziehungsweise der Datenfluss bei der Nutzung von Google Webservices ist im folgenden Diagramm gezeichnet – anlehnend an das allgemeine Diagramm aus Teil 1 des Workshops. Dabei stellen die roten Pfeile den Datenfluss der Suchanfrage dar, die blauen Pfeile denjenigen der von der Google Datenbank zurückgegebenen Ergebnisse.

Screenshot
Datenfluss bei Google Webservices (vereinfacht)

Mithilfe von NUSoap wird die Handhabung von Webservices mit PHP um einiges vereinfacht. Man kann NUSoap auch mit vielen anderen Webservices verwenden. Man muss also nicht unbedingt SOAP beherrschen, um Webservices nutzen zu können.

Eine einfache Suchanfrage an Google mit PHP und NUSoap könnte wie folgt aussehen:

google_ws1.php

  <?php
    include ("nusoap.php");
    //der Suchstring
    $query = "drweb";
    //neuer SOAP Client, an welchen die Anfragen gesendet werden.
    $client = new soapclient("http://api.google.com/search/beta2");
    //die Parameter die Google für die Anfrage benötigt, in Form eines
    Arrays.
    $parameter['key'] = "Ihre Entwicklerkennung";
    $parameter['q'] = $query; //die Suchanfrage
    $parameter['start'] = 1;
    $parameter['maxResults'] = 10;
    $parameter['filter'] = false;
    $parameter['restrict'] = "";
    $parameter['safeSearch'] = false;
    $parameter['lr'] = "lang-de";
    $parameter['oe'] = "";
    $parameter['ie'] = "";
    $suchergebnis = $client->call("doGoogleSearch", $parameter, "urn:GoogleSearch");
    echo "<pre>";
    var_dump($suchergebnis);
    echo "</pre>";
    ?>

Über new soapclient() wird ein neues Objekt der Klasse NUSoap erzeugt. Dem Objekt wird dabei gleich die Adresse zum Webservice übergeben. Für eine Google Suchanfrage sind verschiedene Suchparameter notwendig. Diese werden in Form eines Arrays $parameter gespeichert.

Die Suche wird durch den Aufruf der Google Suchfunktion über $client->call(„doGoogleSearch“, $parameter, „urn:GoogleSearch“); durchgeführt. Das Suchergebnis wird durch die NUSoap Klasse in ein Array überführt und durch die var_dump() Funktion ausgegeben.

Die einzelnen Parameter, die für eine Suchanfrage benötigt werden sind:

  • key
    Die Entwicklerkennung, die man bei der Anmeldung für die Nutzung der Google Webservices per Email zugesendet bekommen hat.
  • q
    Der Suchstring, bzw. der Query – der Suchstring kann frei gewählt werden. Es gibt neben den „normalen“ Suchanfragen auch spezielle – so kann man beispielsweise die Suche auf die eigene Domain beschränken. Dies soll weiter unten näher erläutert werden.
  • start
    Die Suchergebnisseite, welche angezeigt werden. Gibt es zu einer Suche z.B. 170 Ergebnisse, so sind diese auf 17 Seiten zu jeweils 10 Ergebnissen unterteilt. Wird start auf zwei gesetzt, so werden die Suchergebnisse auf der zweiten Ergebnisseite angezeigt.
  • maxResults
    Die Anzahl der maximalen Suchergebnisse, die ermittelt werden sollen. Der Wert kann aufgrund von den Begrenzungen von Google nur zwischen 1 und 10 liegen.
  • filter
    Die Frage, ob z.B. gleiche oder ähnliche Suchergebnisse ausgefiltert werden sollen.
  • restrict
    Über den restrict Parameter kann man die Suche auf bestimmte Überbegriffe oder Länder beschränken. Ein Überbegriff kann z.B. Windows oder auch PHP sein.
  • safeSearch
    Über diesen Parameter kann man einstellen ob nicht jugendfreie Suchergebnisse aus der Ergebnisliste herausgefiltert werden sollen oder nicht.
  • lr
    Über den lr-Parameter wird die Sprache der Suchergebnisse bestimmt. Mit dem Parameter lang-de kann man festlegen, dass nur deutschsprachige Suchergebnisse angezeigt werden.
  • oe und ie
    ie und oe stet für „input“ bzw. „output“ encoding. Dabei werden diese Parameter jedoch in der neueren Entwicklungsversion der Google Webservices ignoriert – dennoch müssen für sie in der Suchanfrage vorhanden sein. Der Parameter war dafür gedacht, dass über ihn die Codierung der Anfragen und der Ergebnisse angegeben werden kann und somit verschiedene Sprachen unterstützt werden könnten – standardmäßig wird von einer UTF-8 Codierung ausgegangen.

Was macht NuSoap aus den Parametern?
Für Interessierte ist es vielleicht gut zu wissen, wie NuSoap die Schnittstelle zwischen SOAP und PHP darstellt. An NuSoap werden alle notwendigen Informationen übergeben; dieser wandelt die Informationen in eine SOAP Anfrage um und sendet diese an Google.

Die SOAP Anfrage – der so genannte SOAP Envelope- aus unserem Beispiel sieht wie folgt aus:

      
    POST /search/beta2 HTTP/1.0
    User-Agent: NuSoap/0.6.8 (1.76)
    Host: api.google.com
    Content-Type: text/xml; charset=ISO-8859-1
    SOAPAction: "urn:GoogleSearch"
    Content-Length: 988

    <?xml version='1.0' encoding='UTF-8'?>
    <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance" xmlns:xsd="http://www.w3.org/1999/XMLSchema">
    <SOAP-ENV:Body>

    <ns1:doGoogleSearch xmlns:ns1="urn:GoogleSearch" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
    <key xsi:type="xsd:string">[die Entwicklerkennung]</key>
    <q xsi:type="xsd:string">drweb</q>
    <start xsi:type="xsd:int">1</start>
    <maxResults xsi:type="xsd:int">10</maxResults>
    <filter xsi:type="xsd:boolean">false</filter>
    <restrict xsi:type="xsd:string"></restrict>
    <safeSearch xsi:type="xsd:boolean">false</safeSearch>
    <lr xsi:type="xsd:string">lang-de</lr>
    <ie xsi:type="xsd:string"></ie>
    <oe xsi:type="xsd:string"></oe>
    </ns1:doGoogleSearch>

    </SOAP-ENV:Body>
    </SOAP-ENV:Envelope>

Diese Anfrage wird von Google wiederum über SOAP beantwortet.

Möchte man sich die SOAP Anfrage oder die SOAP Antwort im Browser anschauen, so kann man diese über echo $client->request; bzw.echo $client->response; ausgeben lassen; dabei handelt es sich um in NuSoap integrierte Methoden.

Das Suchergebnis
Das Suchergebnis beinhaltet maximal 10 Ergebnisse. Dabei liefert Google zu jedem Suchergebnis detaillierte Informationen. Diese werden durch NuSoap in Arrays gespeichert. Dabei handelt es sich um ein zweidimensionales Array – es sind zwei Arrays ineinander verschachtelt. Im ersten Array befinden sich die Details zur Suche zum Beispiel Anzahl der Suchergebnisse, Suchdauer und so weiter. Im zweiten Array befinden sich die Details zu den einzelnen Suchergebnissen.

Das Array $suchergebnis aus dem Beispiel enthält folglich folgende Informationen:

  • $suchergebnis[‚documentFiltering‘]
    Ein boolscher Wert der angibt, ob die Suchergebnisse gefiltert wurden.
  • $suchergebnis[’searchComments‘] Kommentar zu er durchgeführten Suche; z.B. wenn Wörter wie „und“, „oder“ etc. aus der Suchanfrage entfernt worden sind.
  • $suchergebnis[‚estimatedTotalResultsCount‘]
    Die geschätzte Anzahl der Suchergebnisse.
  • $suchergebnis[‚estimateIsExact‘]
    Ein boolscher Wert, der angibt, ob die geschätzte Zahl an Suchergebnissen exakt ist.
  • $suchergebnis[‚resultElements‘]
    In diesem Array befinden sich die einzelnen Suchergebnisse und die Details zu ihnen.
  • $suchergebnis[’searchQuery‘]
    Der Suchstring.
  • $suchergebnis[’searchTips‘]
    Eine Zeichenkette, die dem Benutzer Tipps gibt, wie die Suche optimiert werden kann.
  • $suchergebnis[‚directoryCategories‘]
    Ein Array, in welchem zu der Suche passende OPD Kategorien angegeben sind.
  • $suchergebnis[’searchTime‘]
    Die Suchdauer..

Das Array $suchergebnis[‚resultElements‘] enthält die einzelnen Suchergebnisse. Sie sind numerisch im Array hinterlegt. Auf das erste Suchergebnis könnte man folglich mit $suchergebnis[‚resultElements‘][0] zugreifen. Zu jedem Einzelnen Suchergebnis sind in dem Array folgende Daten gespeichert:

  • summary
    Ist das Suchergebnis im Open Directory Project (OPD) eingetragen, so wird der Text der zu dem Link im OPD steht übergeben.
  • URL
    Der URL zu dem Suchergebnis wird als Zeichenkette übergeben.
  • snippet
    Ein Auszug aus der gefundenen Seite, die die gesuchten Wörter beinhaltet. Diese sind mit HTML fett markiert.
  • title
    Der Titel der Seite, ebenfalls bereits über HTML formatiert.
  • chachedSize
    Die gechachte Größe der Seite in Kilobytes.
  • relatedInformationPresent
    Ein boolscher Wert, ob verwandte Webseiten gefunden wurden.
  • hostName
    Werden ähnliche Suchergebnisse ausgefiltert (ist der filter Paramter in der Suchanfrage auf true gestellt), so erscheinen nur zwei Ergebnisse von dem Host. Der Hostname ist hierbei als String gespeichert.
  • directoryCategory
    Die Kategorie, in welcher die Seite im OPD angegeben ist.
  • directoryTitle
    Der Titel unter welchem die Seite im OPD erscheint.

Screenshot
Suchanfrage bei Google – die relevanten Daten sind markiert

Möchte man folglich den Titel des ersten Suchergebnisses ausgeben, so könnte man dies über echo

      $suchergebnis['resultElements'][0]['title']; 

machen.

Google Suchmaschine für die eigenen Seiten…
Binden wir Google nun in ein eigenes Projekt ein. Benutzer sollen die Möglichkeit haben im ganzen Web oder nur auf einer bestimmten Seite zu suchen.

Die Suche wird über ein einfaches Formular aufgerufen. Dieses Formular übergibt den Suchstring, den Query an das Skript, die daraufhin über NuSoap eine Anfrage an Google sendet und die Antwort formatiert ausgibt.

Das Skript könnte wie folgt aussehen:

suche.php

      <?php
    include ("NuSoap.php");

    function google_search($query) {
    //neuer SOAP Client, an welchen die Anfragen gesendet werden.
    $client = new soapclient("http://api.google.com/search/beta2");
    //die Parameter die Google für die Anfrage benötigt, in Form eines
    Arrays.
    $parameter['key'] = "[Entwicklerkennung]";
    $parameter['q'] = $query; //die Suchanfrage
    $parameter['start'] = 1;
    $parameter['maxResults'] = 10;
    $parameter['filter'] = false;
    $parameter['restrict'] = "";
    $parameter['safeSearch'] = false;
    $parameter['lr'] = "lang-de";
    $parameter['oe'] = "";
    $parameter['ie'] = "";

    $suchergebnis = $client->call("doGoogleSearch", $parameter, "urn:GoogleSearch");
    return $suchergebnis;
    }

    $host = "www.drweb.de";
    $query = $_POST["query"];
    $search_type= $_POST["search_type"];

    if (isset($query)) {
    if ($search_type == "local") {
    $query = "site:".$host." ".$query;
    }
    $suchergebnis = google_search($query);

    echo "<h3>Suche nach:".$suchergebnis['searchQuery']."</h3>";
    echo "<h4>Suchdauer: ".$suchergebnis['searchTime'].",
    Suchergebnisse ".$suchergebnis['estimatedTotalResultsCount']."</h4>";

    foreach ($suchergebnis['resultElements'] as $elem) {
    //Ausgabe der Suchergebnisse
    echo "<p><b><a href=".$elem['URL'].">".$elem['title']."</a></b>
    <br\>".$elem['snippet']."<br /><small>".$elem['URL']."</small></p>";
    }
    }
    //da $query leer ist, wird das Formular ausgegeben
    else {
    ?>
    <form method="post" action="suche.php">
    Suchen nach...<br />
    <input type="text" name="query" value="Suche"/><br
    />
    nur auf dieser Seite...
    <input type="radio" name="search_type" value="local"
    checked="checked"/>
    <br /> das ganze Web...
    <input type="radio" name="search_type" value="all"
    /><br />
    <input type="submit" value="Senden"/><br />
    </form>
    <?php
    }
    ?>

Die Funktion, durch die die Suche durchgeführt wird, sieht eigentlich genau so aus, wie im ersten Beispiel. Lediglich der Suchstring wird über die Funktion als Parameter übergeben. Dieser wird im Formular eingegeben und über POST gesendet.

Ist $query jedoch gesetzt, so muss überprüft werden, ob es sich um eine seiteninterne Suche handelt, oder um eine Suche im ganzen Web. Dies wird durch die Radiobuttons ausgewählt. Handelt es sich um eine siteinterne Suche, so wird der $query so angepasst, dass nur Suchergebnisse von der Domain durchsucht werden.

Bei Google kann man über den Suchstring site:www.drweb.de html nur die Seite www.drweb.de nach dem String durchsuchen. Entsprechend wird die Funktion google_search($query) aufgerufen. Daraufhin wird das Suchergebnis über eine Foreach-Schleife formatiert ausgegeben.

Bei einer Suche nach „html kurs“ im Internet könnte das Ergebnis dann so aussehen:

Screenshot
Formatierte Ausgabe der Google Suchergebnisse

Es gibt zahlreiche Möglichkeiten, die Ausgabe speziellen Wünschen anzupassen. Lohnenswert ist die Benutzung von Google als siteinterne Suchmaschine auf jeden Fall – sie erhöht das Usability der Seite für den Benutzer ohne großen Aufwand für den Sitebetreiber.

Von Thiemo Fetzer

Thiemo Fetzer lebt seit 2008 in London und promoviert dort im Fachbereich "Entwicklungsökonomie" an der London School of Economics. Zuvor hat er Wirtschaftswissenschaften, Mathematik und Informatik in Magdeburg und Ulm studiert.

3 Antworten auf „Workshop Webservices: Google Webservices mit PHP nutzen“

Hallo

Seit September 2009 gibt es das SOAP API nicht mehr, google hat es in die Rente geschickt. Vielleicht solltest du das gleich am ANFANG deines Artikels einfügen, nicht dass weitere Leute wie ich sinnlos den ganzen Text durchlesen der dann ins nirgendwo führt :(

Schreibe einen Kommentar

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