Preisvergleich mit PHP
Schnäppchen-Finder

DeveloperE-CommerceIT-ProjekteMarketingSoftware

Preisvergleichsdienste im Internet sind sehr beliebt. Internet Professionell zeigt, wie Sie Schnäppchenjägern einen eigenen Service mit PHP anbieten.

So geht’s

Preisvergleich mit PHP

Um Preise zu vergleichen, müssen Sie mehrere Shops nach dem gleichen Produkt abfragen und die Ergebnisse nach Preisen sortiert ausgeben. In diesem Workshop zeigen wir ein PHP-Skript, das dies in mehreren Schritten erledigt. Der größte Aufwand dabei besteht nicht darin, die Produktinformationen von den verschiedenen fremden Servern abzurufen. Spannend wird es erst, wenn die Preisangaben aus dem HTML-Quelltext herausgefiltert werden müssen. Das gelingt mit regulären Ausdrücken, und die sind ebenso mächtig wie kryptisch. Sind die Preise erst gefunden, ist der Rest halb so wild. Die Ergebnisse müssen nur noch sortiert und ausgegeben werden. Aber der Reihe nach.


Suche in Webshops

Preisvergleich mit PHP

Der Preisvergleich baut auf Online-Shops auf, die eine Suchfunktion anbieten ? das tun zum Glück die meisten. Das Skript nimmt vom Eingabeformular ein Suchwort entgegen, leitet es an die Shops weiter und nimmt die Ergebnisseite in Empfang. Das funktioniert mit einer GET-Abfrage, bei der der Suchbegriff im URL übergeben wird, zum Beispiel so:

http://www.fun4kids.de/catalog/ advanced_search_result.php?keywords=puppe

Zunächst wird ermittelt, wie diese Suchadresse bei jedem Shop aussieht. Dann wird sie in Basisadresse und Suchbefehl zerlegt und zusammen mit dem Namen des Shops in einer Konfigurationsdatei gespeichert. Der Suchbefehl enthält zusätzlich zum Dateinamen des Suchskripts noch ein Fragezeichen, den Variablen-Namen, den der Shop für Suchbegriffe benutzt, und ein Gleichheitszeichen. Vorteil: Das Preisvergleich-Skript kann den Suchbegriff hier einfach anhängen. Das sieht dann so aus:


Fun 4 Kids
http://www.fun4kids.de/catalog/ advanced_search_result.php?keywords=

Anhand dieser Konfigurationsdatei fragt das Skript alle eingetragenen Online-Shops nacheinander ab. Falls Sie Shops einbeziehen wollen, die sich nicht mit GET abfragen lassen, können Sie auf cURL mit der Option CURLOPT_POST oder die Pear-Klasse HTTP_Request zurückgreifen. Hilft das alles nichts, müssen Sie komplexere Skripts auf der Basis von fsockopen() programmieren. Diese Komplikationen kommen in unserem Beispiel nicht vor. Mit dem folgenden Befehl schickt das Skript seine Suchanfrage an den Shop:


$shopseite = fopen($adresse.$suchseite.$suchwort, 'r') or die($php_errormsg);

Wenn der Shopserver wie erwartet mit einer HTML-Seite antwortet, wird diese komplett als String in die Variable $page eingelesen.


while (! feof($shopseite)) {
$page .= fread($shopseite,1011111);
}
fclose($shopseite);


Reguläre Ausdrücke

Preisvergleich mit PHP

Wenn reguläre Ausdrücke nicht so erfolgreich wären, könnte man sie glatt für eine esoterische Programmiersprache wie zum Beispiel Brainfuck halten (de.wikipedia.org/wiki/Esoterische_Pro
grammiersprache
). Aber was man sich da mühsam Zeichen für Zeichen zusammenbastelt, ist durchaus ernst gemeint und funktioniert in der Praxis sehr effektiv – wenn der Ausdruck dann irgendwann mal fertig ist.

Auch in diesem Projekt kommen Sie um reguläre Ausdrücke nicht herum. Einen brauchen wir, um die Produktinformationen aus dem HTML der Ergebnisseite herauszufischen. Der zweite fieselt daraus wiederum den Preis heraus. Und wenn Sie die beiden hinter sich haben, wird Ihnen der Ausdruck, der relative Links erkennt, wie ein Kinderspiel vorkommen.

Um einen regulären Ausdruck zu finden, muss zunächst der Quelltext gesichtet werden, der mit dem Ausdruck durchkämmt werden soll. Bei unserem Shop zeigt sich, dass die Produkte in Tabellenzeilen angeordnet sind, die abwechselnd mit einer dieser Zeichenfolgen beginnen:

Damit beide Varianten erkannt werden, wird in den regulären Ausdruck ein Platzhalter für mehrere beliebige Zeichen eingefügt. Am Ende des gesuchten Tags steht eine spitze Klammer. Davon gibt es in HTML jede Menge. Nun können reguläre Ausdrücke gierig oder nicht-gierig sein. Die gierige Variante eines Ausdrucks liefert so viel Text wie möglich zurück. Und weil ganz am Ende jedes HTML-Dokumentes eine spitze Klammer steht, bekämen wir mit einem gierigen Ausdruck den kompletten Rest der Seite. Damit das nicht passiert, fügen wir ein Fragezeichen ein. Jetzt findet der Ausdruck den korrekten String bis zur nächsten schließenden spitzen Klammer:


(.+?)

#is', $page, $produkte);

Die Funktion preg_match_all() liefert alle passenden Ergebnisse und legt sie in einem Array ab. In unserem Fall liegen die Produktinformationen nach der Abfrage in dem Array $produkte[0].


Adressen ergänzen

Preisvergleich mit PHP

Einige Bilder in den Produkt-Listings tragen relative Adressen, die nur auf dem Shopserver selbst funktionieren. Da der Preisvergleich die Infos auf einen fremden Server entführt, müssen die fehlenden absoluten Adressen ergänzt werden. Das geschieht mit einem regulären Ausdruck, der nach Image-Tags ohne die Zeichenfolge http:// sucht:

";


Und wie geht's weiter?

Preisvergleich mit PHP

Wenn Sie diesen Workshop nachvollziehen, haben Sie eine gute Grundlage für einen eigenen Preisvergleichsdienst. Das Skript aus diesem Workshop finden Sie übrigens unter it-journalist.de/preisvergleich. Wenn Sie es weiterentwickeln wollen, ist der nächste Schritt, weitere Shop-Systeme zu integrieren. Um Shop-Systeme mit unterschiedlicher Programmierung abzuarbeiten, muss die Konfigurationsdatei eine vierte Zeile je Shop bekommen, in der das Shop-System vermerkt ist. Anhand dieses Merkmals wird dann eine Fallunterscheidung programmiert, die die passenden Abfragen und regulären Ausdrücke für das jeweilige Shop-System aktiviert.