rankingCHECK
MENÜ

Keywordmonitor in PHP selber bauen

PHP ist die beliebteste Programmiersprache im Internet. Lerne die Grundlagen der Programmiersprache, die Seiten wie Facebook, WordPress oder Spiegel ermöglichen.

“Wer programmieren kann ist klar im Vorteil” – So oder so ähnlich lautet eine alte (Internet) Weisheit. Wenn man in irgend einer Form mit dem Internet arbeitet, ist es auf jeden Fall sehr sinnvoll wenigstens die Grundbegriffe und Konzepte zu verstehen. Zum Einstieg entwickeln wir ein relativ einfaches Programm, mit dem wir ein Keyword in Google überprüfen können.

Lasst euch nicht von der Länge des Artikels abschrecken, ich versuche viele Konzepte zu erklären, das Programm an sich ist relativ simpel.

Ziel ist es, die Top 10 Positionen zu einem bestimmen Keyword bei Google zu tracken. Natürlich wollen wir nicht jeden Tag bei Google vorbei schauen und gucken ob sich etwas verändert hat. Stattdessen bauen wir uns ein kleines PHP Script, das uns automatisch jede Woche die Top 10 Ergebnisse zu dem Keyword per Email sendet.

Vorbereitung

Wir benötigen für die Entwicklung unseres Scriptes eine lokale Entwicklungsumgebung. Wie das genau geht habe ich in diesem Artikel beschrieben.

Wir legen uns einen neuen Projektordner an, den wir “keywordmonitor” nennen. Dann laden wir uns das PHP Framework Flight runter, entpacken es und legen den flight Ordner in unseren neuen Projektordner.

Als letzten Schritt der Vorbereitung erstellen wir eine neue Datei, die wir unter dem Namen “.htaccess” auf der gleichen Ebene wie unsere Ordner speichern.

Der Inhalt der .htaccess sieht folgendermaßen aus:


RewriteEngine On
RewriteBase /keywordmonitor
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [QSA,L]

Diese Zeilen sorgen dafür, dass alle URL Aufrufe zur index.php umgeleitet werden. Hiermit können wir so genannte “sprechende URLs” nutzen.

Die Zeile mit dem RewriteBase reflektiert den Namen unseres Projektordners. Wenn dieser anders benannt sein sollte, muss diese Zeile angepasst werden.

index.php

Ebenfalls auf der gleichen Ebene erstellen wir die index.php. Dies ist der Dreh- und Angelpunkt unseres Keyword Monitoring Tools. Als erstes müssen wir das Flight PHP Framework einbinden:


<?php
require 'flight/Flight.php';
?>

Dies Zeile sorgt lediglich dafür, dass wir gleich das Framework nutzen können. Jetzt schreiben wir unsere ersten Funktionen:


<?php
require 'flight/Flight.php';

Flight::route('/', function(){
    echo 'Hallo Welt!';
});

Flight::start();

?>

Mit diesen Zeilen haben wir das Hallo Welt Beispiel aus dem oben genannten Artikel reproduziert.

Flight PHP Framework in Kurzform

Flight stellt eine Reihe von Funktionen zur Verfügung, die alle nach dem folgenden Schema aufgerufen werden: Flight::funktionsname().

Mit Flight sagen wir PHP, dass wir das Framwork nutzen wollen, welches wir zu Beginn eingebunden haben. Anschließend wird die Funktion route() aufgerufen, die sich innerhalb des Flight Framework befindet. So kann man den Funktionsaufruf dann auch lesen: Flight::route();

Die route() Funktion nimmt ein sogenanntes URL-Matching vor, das heißt die aktuell aufgerufene URL wird mit allen route() Aufrufen verglichen um eine Übereinstimmung zu finden. Ist eine Übereinstimmung vorhanden, wird die Funktion innerhalb der route() abgearbeitet.

Die erste Angabe in der route() Funktion, ist das Slash (/). Diese Angabe sagt PHP, dass die folgendene Funtion unter dieser URL (in diesem Fall die Domain, ohne etwas dahinter) aufgerufen werden soll.

Die anonyme Funktion function() {...} schließlich verarbeitet den URL Aufruf. Die Funktion wird als anonym bezeichnet, da sie keinen Namen hat, anders als die route() Funktion.

Wir können beliebig viele route() Funktionen in unserem PHP Script haben.

Ganz zum Schluss muss immer der Flight::start() Aufruf stehen, damit unser Script auch ausgeführt wird.

Goolge SERPS Scrapen

Hinweis: Laut Google AGB ist es nicht erlaubt, die Ergebnisse in automatisierte Weise abzurufen.

Als erstes müssen wir die Google Ergbenisse in PHP “einlesen”. Dazu benötigen wir eine URL, die uns die Ergebnisse in einer Form zurück gibt, die wir in PHP verarbeiten können. Wenn wir eine standard Google Suche starten, sieht die URL folgendermaßen aus:


https://www.google.de/#q=keyword

Wenn wir uns aber den Quellcode ansehen, bekommen wir nur einen haufen Javscript Code angezeigt. In dem Quellcode selber scheint kein Suchergebnis zu stehen. Das liegt daran, dass Google inzwischen standardmäßig eine ganze Menge Javascript ausführt. Um die Ergbnisse im Quelltext zu sehen, schalten wir einfach Javascript komplett aus und erhalten folgende URL:


https://www.google.de/search?q=keyword&sa=G&gbv=1&sei=fK1HVIq-LtftaLKUglg

Wenn wir uns den Quellcode jetzt anschauen, sehen wir noch immer einen Haufen Javascript Code, aber auch unsere Suchergebnisse. Damit können wir in PHP etwas anfangen.

Die Scrape Funktion

Um die Google Ergbenisse zu scrapen und die entsprechenden Links zu extrahieren, nutzen wir ein weiteres vorgefertigtes Script. Webseiten zu scrapen ist ziemlich kompliziert und beinhaltet typischerweise sehr viel trial & error. Daher ist es einfacher ein fertiges Script zu benutzen um sich die grauen Haare zu ersparen.

Ladet euch das aktuellste “simple_html_dom” Script runter und legt es in euren Projektordner.

Anschließend binden wir das Script per require unter dem flight php require ein:


require 'flight/Flight.php';
require 'simple_html_dom.php';

Nun geht es an das Scrapen. Dazu schreiben wir eine neue route, die wir unter ‘/scrape’ erreichen. Die Funktion sieht folgendermaßen aus:


Flight::route('/scrape', function(){
$url = 'https://www.google.de/search?q=keyword';
$serps = file_get_html($url);
...
});

Die Variable $url beinhaltet die URL, die wir abfragen wollen. In PHP beginnen Variablen immer mit einem $ Zeichen, danach kommt der Name und anschließend wird der Variable mit dem = Zeichen ein Wert zugewiesen. Jedes mal wenn wir jetzt die URL benutzen wollen, müssen wir lediglich $url schreiben.

Die Funktion file_get_html() stellt uns das simple_html_dom Script zur Verfügung. Die Funktione liest die URL, holt den Inhalt (Quellcode) und macht ihn durchsuchbar.

Links Extrahieren

Jetzt müssen wir die Links aus dem Quelltext extrahieren. Dazu verwenden wir die find()Funktion, ebenfalls zur Verfügung gestellt durch das simple_html_dom Script.


Flight::route('/scrape', function(){
$url = 'https://www.google.de/search?q=keyword';
$serps = file_get_html($url);

foreach($serps->find('#ires li h3 a') as $link) {
    echo $link->href . '<br>';
}

});

Wenn wir uns das ganze im Browser ansehen, sollten wir eine Liste mit Links sehen, die ungefähr so ausschaut:


/url?q=https://adwords.google.de/KeywordPlanner&sa=U&ei=...

Die find() Funktion findet ein oder mehr Elemente nach einem bestimmten Muster und gibt diese zurück, so das diese in PHP verarbeitet werden können. Das Muster kann in folgender Weise gelesen werden:

  1. finde ein Element mit der id = ires
  2. innerhalb dieses elements finde alle li Elemente
  3. innerhalb aller gefundenen li Elemente finde alle h3 Elemente
  4. innerhalb aller gefundenen h3 Elemente, finde alle a Elemente

Die foreach() Schleife ist ein wichtiger Bestandteil von PHP und sorgt dafür, dass die Aktion innerhalb der geschweiften Klammern jedes Mal ausgeführt wird, wenn die Bedingung in den runden Klammern erfüllt ist.

In diesem Fall also jedes Mal, wenn unser Muster einen Treffer geliefert hat. Das as Keyword sorgt dafür, dass wir innerhalb der geschweiften Klammern auf das gefundene Ergebnis zugreifen können. Schließlich greifen wir auf das href Attribut des a Elements zu und geben dieses per echo aus.

Am Ende hängen wir ein <br> dran, das ist ein HTML Tag und erzeigt einen Zeilenumbruch ansonsten würden alle Links direkt hintereinander stehen. Der Punkt verbindet in PHP ein oder mehrere Strings (Text).

URL extrahieren

Wir haben jetzt unsere Links gefunden, allerdings sind sie noch nicht so, wie wir uns das wünschen. Neben der URL sind noch andere Parameter drin, die uns nicht interessieren.

Daher wenden wir eine sogennante Regular Expression, oder auch einfach nur RegEx, an um die URL zu extrahieren. RegEx sind extrem mächtig, aber auch extrem kompliziert, daher werde ich hier nicht weiter darauf eingehen.

Wir müssen unser PHP noch ein wenig anpassen, so das der Link nicht mehr per echo ausgegeben wird. Daher löschen wir diese Zeile und schreiben statt dessen unsere RegEx Funktion:


preg_match_all('#http(s)?://b[^&](.?)#', $link->href, $href);
var_dump($href);

Die PHP Funktion preg_match_all() wendet die RegEx auf den ersten String an (in diesem Fall ist das unser Link, den wir vorher per echo ausgegeben haben) und speichert alle gefundenen Ergebnisse in einer Variablen ab (hier $href).

Anschließend geben wir den Inhalt von $href per var_dump() aus. Moment, warum nicht mit echo fragst du? Der Inhalt von $href ist ein Array, das ist im Grunde eine Liste von Elementen, auf die sich nur über eine bestimmte Art und Weise zugreifen lässt. Mit var_dump() lässt sich trotzdem auf den Inhalt zugreifen, um schnell den Inhalt überprüfen zu können.

Wenn wir jetzt unseren Browser neu laden, sehen wir in etwa folgendes:


array(3) { [0]=> array(1) { [0]=> string(40) "https://adwords.google.de/KeywordPlanner" } [1]=> array(1) { [0]=> string(1) "s" } [2]=> array(1) { [0]=> string(0) "" } }

Wie wir sehen können, hat es also geklappt und die URL ist extrahiert worden.

URL für die Email vorbereiten

In der derzeitigen Form könnten wir theoretisch die Links schon rausschicken, aber wir wollen diese natürlich doch noch ein wenig schöner haben.

Daher gehen wir jetzt über unsere $href Liste und speichern nur die URL in einer Variablen. Dazu benötigen wir natürlich noch eine Variable, in der wir unsere Links dann speichern.

Erinnerst du dich noch an die foreach() Schleife von weiter oben? Vor dieser Schleife definieren wir unsere Variable $links.


$links = '';

foreach($serps->find('#ires li h3 a') as $link) {

preg_match_all('#http(s)?://b[^&]*(.*?)#', $link->href, $href);
$links .= '<p>'.$href[0][0].'</p>';

}

In unserer foreach() Schleife extrahieren wir zunächst die URLs per RegEx und greifen anschließend auf das Array in der $href Variablen zu.

Wie schon weiter oben erwähnt, muss man auf ein Array auf eine bestimmte Art zugreifen und man sieht in dem Beispiel wie. Man gibt den Namen der Variable an, in dem sich das Array befindet und verwendet anschließend eckige Klammern mit einer Zahl drin. Dabei muss man beachten, dass bei Arrays bei 0 (null) angefangen wird zu zählen. Das bedeutet, dass das erste Element in einem Array die Nummer 0 trägt.

In unserem Fall, befindet sich an Array Element 0 ein weiteres Array, welches nur einen Eintrag hat, nämlich unsere URL. Daher greifen wir auf dieses Element mit der folgenden Syntax zu: $href[0][0].

Jetzt weisen wir unserer $links Variable unser Ergebnis zu, indem wir den . Operator benutzen um den String an den vorherigen dran zu hängen. Ich habe zusätzlich noch <p> Tags hinzugefügt, um die Email später leserlicher zu gestalten. Wir hätten auch ein <br> Tag benutzen können, wie zu Beginn.

Wichtig zu behalten ist hier, dass wir die $links Variable außerhalb unserer foreach() Schleife definiert haben, damit wir innerhalb der Schleife unsere Strings aneinander hängen können. Hätten wir das nicht gemacht, dann hätten sich die Werte immer wieder gegenseitig überschrieben, da wir uns ja in einer Schleife befinden, die so oft abläuft, wie wie sich Links im Ergbnis befindet.

Jetzt können wir nach unserer foreach() Schleife überprüfen, ob auch Ergbenisse in unserer $links Variable sind. Dazu benutzen wir wieder die var_dump() Funktion.


$links = '';

foreach($serps->find('#ires li h3 a') as $link) {

preg_match_all('#http(s)?://b[^&]*(.*?)#', $link->href, $href);
$links .= '<p>'.$href[0][0].'</p>';

}

var_dump($links);

Im Browser sollte das ungefähr so aussehen:


string(577) "

https://adwords.google.de/KeywordPlanner

http://de.wikipedia.org/wiki/Keyword_(Online-Marketing)

Keyword Datenbank

http://t3n.de/news/keyword-tools-besten-479112/

Keyword Recherche Tool

http://www.search-one.de/tools/long-tail-keyword-tool/

http://www.klick-kantine.de/themen/sem/11/keyword-tools-recherche

http://www.gergey.com/keywords-finden.pdf

http://keywords.netzum-sorglos.de/

http://www.seo-united.de/links-tools/keyword.html

"

Liste per Email verschicken

Jetzt haben wir unsere URLs und müssen sie nur noch per Email verschicken. Dazu schreiben wir eine neue Funktion, mit Hilfe von Flight PHP.


Flight::map('email', function() {
...
});

Die map()Funktion registriert eine Funktion, die sich innerhalb eines PHP Scriptes aufrufen lässt, ohne dafür eine URL aufrufen müssen (anders als bei der route()Funktion). Die Funktion lässt sich später per Flight:::email() wieder aufrufen.

PHP stellt uns eine mail()Funktion zu Verfügung, mit der sich ganz einfach emails verschicken lässt.


Flight::map('email', function() {
$email = 'info@graff.cc';
$subject = 'Keyword Report vom '. date('d.m.Y');
$message = '';

$headers = "From: Keyword Script <info@graff.cc>rn";
$headers .= "MIME-Version: 1.0rn";
$headers .= "Content-Type: text/html; charset=ISO-8859-1rn";

mail($email, $subject, $message, $headers);

});

Bis auf die $headers Variable sollte alles selbsterklärend sein. Der Email Header sorgt dafür, dass unsere Email als HTML-Email verschickt wird. Außerdem können wir hier auch noch eine Absender Email Adresse festlegen.

Was jetzt noch fehlt, ist der eigentliche Inhalt unserer Email, nämliche unsere URLs. Dazu gehen wir zurück zu unser /scrape route. Am Ende hatte wir ein var_dump() stehen, welches uns den Inhalt unserer $links Variablen ausgegeben hat. Wir ersetzen den Aufruf mit folgendem:


Flight::set('links', $links);
Flight::email();

Mit der set() Funktion speichern wir unseren Link in einer internen Flight Variablen. Das müssen wir machen, da man von einer Funktionen nicht auf Variablen in anderen Funktionen zugreifen kann. Die zweite Zeile ruft unsere email() Funktion auf, die wir zuvor geschrieben haben.

Wir gehen zurück zu unserer email() Funktion und schreiben folgendes an die Stelle wo unsere $messageVariable steht:


$message = Flight::get('links');

Wir weisen hier unserer Variablen die Links zu, die wir vorhin in der internen Flight Variable gespeichert hatten.

Wenn wir jetzt unseren Browser neu laden, sollten wir eine weiße Seite erhalten. Da wir an keiner Stelle unseres Scriptes etwas ausgeben, sehen wir natürlich auch nichts. Statt dessen sollte eine Email ankommen mit unseren Links!

Verbesserungen

Im Grunde funktioniert unser Keyword Monitor schon sehr gut. Allerdings gibt es ein paar Situationen, in denen der Monitor nicht funktionieren wird oder sogar einen Fehler auswirft.

Wenn wir ein Keyword mit Sonderzeichen verwenden wie z.B. “Geschenkideen für Männer”, werden wir einen Fehler erhalten. Die Sonderzeichen (ü,ä) werden leider nicht erkannt und durch andere Zeichen ersetzt. Wir lösen das folgendermaßen:


$keyword = rawurlencode('Geschenkideen für Männer');

Die Funktion rawurlencode() bringt unser Keyword in eine Form, die interpretiert werden kann.
Anschließend müssen wir die $keyword Variable an unsere Google URL hängen.


$url = 'http://www.google.de/search?q='.$keyword;

Manchmal gibt es zu bestimmten Suchanfragen in den Google Suchergebnissen sogenannte Universal Search Ergebnisse. Das können Bilder, Videos oder Lokale Ergebnisse sein.

Unser Script kommt dabei etwas durcheinander und liefert keine Ergebnisse.
Das lösen wir in unserer foreach() Schleife mit folgendem Code:


foreach($serps->find('#ires li h3 a') as $link) {

preg_match_all('#http(s)?://b[^&]*(.*?)#', $link->href, $href);

if(isset($href[0][0])) {
    $links .= ''.$href[0][0].'';
}

}

Die Abfrage überprüft ob der Array Eintrag überhaupt existiert. Wenn ja, dann wird unsere URL ganz normal an unsere Variable gehangen. Ansonsten wird nichts gemacht und der nächste Treffer wird verarbeitet.

Jetzt müssen wir unseren Keywordmonitor nur noch auf einen Server laden, den wir unter einer öffentlichen URL erreichen können. Dabei entsteht allerdings noch ein weiteres Problem.

Wenn wir den Keywordmonitor auf unseren Server laden, kann theoretisch jeder das Script ausführen. Das kann ziemlich blöd sein, wenn z.B. ein Bot die Seite ein paar 1000 Mal aufruft. Wir können dem ein wenig vorbeugen, indem wir einen Code an unsere URL hängen, den natürlich nur wir kennen.

Damit das ganze funktioniert müssen wir ganz oben in unserer index.php noch eine Zeile ergänzen:



Jetzt können wir unseren Keywordmonitor nur mit dem entsprechenden Key aufrufen:

http://deinedomain.de/keywordmonitor/?key=1asAmMjd7Dld

Die if Abfrage überprüft, ob die Bedingungen in den Klammern erfüllt werden. Hier fragen wir per empty() Funktion ab, ob der key Eintrag in $_GET Variablen leer ist oder (die beiden senkrechten Balken bedeuten oder) ob der Eintrag nicht mit unserem String übereinstimmt.

Die $_GET Variable wird von PHP zur Verfügung gestellt und beinhaltet alle URL Parameter in einem Array, falls welche vorhanden sind.

Wenn einer der beiden Bedingungen mit “Ja” (im Fachjargon “true”) beantwortet werden kann, dann wird der Code in den geschweiften Klammern ausgeführt. Hier wird ein false zurückgegeben, welches dafür sorgt, dass das Script an der Stelle abbricht.

Automatisches Abrufen des Scriptes

Jetzt funktioniert unser Script, aber unser Ziel ist es ja, das es uns automatisch die Links zu sendet. Dazu müssen wir unseren Keywordmonitor als erstes auf einen Webserver laden, so das wir ihn per Internet erreichen können. Anschließend registrieren wir uns bei http://www.mywebcron.com/. Hier kann man Zeitgesteuert bestimmte URLs aufrufen lassen, also genau das was wir benötigen.

Hier müssen wir lediglich unsere URL eintragen, den Zeitinterval in dem wir die Keywords checken wollen (ich habe hier 7 Tage eingetragen) und wann das ganze starten soll und wann aufhören. Danach nur noch speichern und alles sollte bereit sein.

Zusammenfassung

Puh, das war viel komplizierter zu erklären als gedacht. Jetzt hast du aber deinen eigenen Keyword Monitor in PHP gebaut. Ganz nebenbei hast du auch noch ein paar wichtige Konzepte angewendet.

Variablen

Variablen fangen immer mit einem $Zeichen an und es wird ihnen ein Wert zugewiesen per = Zeichen. Du kannst auf den Inhalt der Variable einfach mit einem Aufruf des Variablen Namen zugreifen.

Arrays

Arrays sind ein essentielles Datenobjekt in PHP und auch in allen anderen Programmiersprachen. Auf Arrays lässt sich per [0] zugreifen.

Schleifen

Schleifen sind für das Abarbeiten von Aufgaben zuständig. Es gibt noch ein paar mehr Schleifen, die für andere Gelegenheiten gut sind, die wir später kennen lernen werden.

echo & var_dump()

Diese beiden PHP Funktionen sind eure besten Freunde, wenn ihr eure eigenen Sachen entwickelt. Immer wenn ihr eine Variable überprüfen müsst, oder euch den Inhalt eines Arrays ansehen wollt, verwendet eine der beiden Funktionen.

Flight PHP

Bei der Entwicklung von eigenen Programmen ist ein Framework eine enorme Hilfe. Du hast bestimmt schon einmal von Zend PHP gehört, das ist auch nichts anderes als ein PHP Framework.

Der gesamte Code

Disclaimer – Dieses Tutorial dient dazu, etwas zu lernen. Es wird kein Anspruch auf Vollständigkeit erhoben. Der Einsatz des Scriptes oder Teile davon geschehen auf eigene Verantwortung und der Autor übernimmt keine Haftung für daraus resultierende Schäden.

Geschrieben von

Nico Graff ist ein selbstständiger Webentwickler aus Köln. Er baut Programme und Services und schreibt über die Selbstständigkeit unter graff.cc

4.56 / 5 (9 votes)

Schreibe einen Kommentar

Loading Facebook Comments ...

5 Kommentare

Artur Kosch schrieb am 7. Januar, 2015 @ 15:25

Hey Nico,

super Beitrag. Habe mein Keywordmonitor umgesetzt. Läuft alles super!

Vielen Dank für den Beitrag!

VG
Artur

Sören schrieb am 8. Januar, 2015 @ 14:36

Vielleicht wichtig zu berücksichtigen: Die hier vorgestellte Methode (weil simpel) wird immer eine lokale Färbung in den Ergebnissen beinhalten.

nk schrieb am 11. Januar, 2015 @ 15:45

“Hinweis: Laut Google AGB ist es nicht erlaubt, die Ergebnisse in automatisierte Weise abzurufen.”

Immer wieder spannend zu sehen, wie gerade die, die sich sonst über jede Algorithmusänderung von Google maßlos aufregen, hier für ihren Vorteil die Regeln von Google brechen und Google damit direkt den Grund liefern, regelmäßig die Algorithmen zu ändern.

Btw. kann man problemlos 100 Requests pro Tag über die Google-Api kostenfrei abrufen. Völlig ohne Handstände.

Philipp-Malte schrieb am 11. Februar, 2015 @ 20:49

Hallo Nico,

vielen Dank für den ausführlichen Artikel. Hast du mal getestet wie viele Requests durchgehen bzw. ab wann Google die Anfragen abweist?

Ich habe nämlich selbst mal mit was ähnlichem rumprobiert und bin ohne Proxys schnell an meine Grenzen gestoßen.

Beste Grüße
Philipp-Malte

Trackbacks

Schreibe einen Kommentar

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

Loading Disqus Comments ...