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:
- finde ein Element mit der id = ires
- innerhalb dieses elements finde alle li Elemente
- innerhalb aller gefundenen li Elemente finde alle h3 Elemente
- 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)
http://t3n.de/news/keyword-tools-besten-479112/
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 $message
Variable 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.
Kostenlose SEO Tools? Dann haben wir hier den perfekten Artikel für Dich!
6 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
Peter schrieb am 28. Mai, 2019 @ 17:51
Hallo Nico,
ich verwende den Monitor seit einigen Monaten. Seit Freitag den 24.5.2019 funktioniert er nicht mehr. Ich habe den Quelltext von Google-Ergebnisseiten gecheckt und finde dort kein ires … etc. mehr. Hat Google vielleicht die Ausgabe geändert und man müsste den Suchterm ändern?
Grüße
Peter