Montag, 24. Oktober 2011

Mini-Suchmaschine mit Frontend-Technologien

Die SenSEO-Extension bekommt ein neues Feature "Analyze all pages". Hiermit soll es möglich sein, mit einem Klick die gesamte Website zu crawlen und sämtliche Seiten anhand vorgegebener Keywords zu bewerten. Dieses Crawlen und Bewerten wird ausschließlich mit Frontend-Technologien implementiert. Die nachfolgende Grafik zeigt die geplanten Schritte.

Mini-Searchengine

Der Anfang ist bereits geschafft. Mit diesem Prototypen (läuft nur im Firefox) ist es möglich, aus dem Markup einer vorgegebenen Seite sämtliche Links zu extrahieren. Es können lediglich Seiten von sensational-seo.com angegeben werden, da die Same Origin Policy nur Seiten der selben Domain für die Analyse zulässt.

Das Markup wird mit der XMLHttpRequest API abgerufen und mit der evaluate Function der Firefox XPath JavaScript API geparst.

Da die API lediglich DOM Dokumente https://developer.mozilla.org/en/DOM/document verarbeitet, wird die als String gelieferte XMLHttpRequest Response vorher einem iFrame als Inhalt zugewiesen. Der folgende Code macht dies möglich.

// create iframe
var responseTextIframeElement = document.createElement('iframe');
responseTextIframeElement.setAttribute('width', '0');
responseTextIframeElement.setAttribute('height', '0');
responseTextIframe = document.body.appendChild(responseTextIframeElement);
responseTextIframe.contentWindow.document.write(responseText);
var responseXML = responseTextIframe.contentWindow.document;
// clear iframe
responseTextIframe.parentNode.removeChild(responseTextIframe);
mse.Crawler.gotPageContentByUrl(responseXML);


Möchte man ohne XMLHttpRequest API arbeiten, kann man einem zuvor erzeugten iFrame auch einfach den URL als scr-Attribut zuweisen.

// create iframe
var responseTextIframeElement = document.createElement('iframe');
responseTextIframeElement.setAttribute('width', '0');
responseTextIframeElement.setAttribute('height', '0');
responseTextIframe = document.body.appendChild(responseTextIframeElement);
responseTextIframe.addEventListener('load', function(e) {
var responseTextIframe = this;
var responseXML = responseTextIframe.contentWindow.document;
// clear iframe
responseTextIframe.parentNode.removeChild(responseTextIframe);
// this is not the best sollution
mse.Crawler.gotPageContentByUrl(responseXML);
}, false);
responseTextIframe.src = url;


Die Extrahierung der href-Attribute aus sämtlichen Anker-Tags übernimmt dann der folgende Code.

var allLinksXpath = responseXML.evaluate('/html/body//a/@href', responseXML, null, XPathResult.ANY_TYPE, null);


In einem nächsten Schritt sollen all die Verlinkungen extrahiert werden, welche absolut (mit http Schema) auf die selbe Domain verweisen oder Seiten relativ referenzieren. Diese Verlinkungen werden mit der Local Storage API auf einem Stack abgelegt und sequentiell nach dem LILO-Prinzip (Last in, Last out) gecrawlt. Dabei wird die Bereinigung von Dubletten mit Hilfe des Canonical-Tag eine wichtige Rolle spielen. Im Local Storage wird neben der extrahierten URL also auch immer eine zweite kanonische URL abgelegt, welche durch einen entsprechenden Abgleich das doppelte Crawlen von Seiten verhindern soll.

Kommentare

Ansicht der Kommentare: (Linear | Verschachtelt)
Bin mal gespannt wie du das machst .. da ich meinen Scraper auch um eine solche Funktion erweitern möchte .. allerdings macht mir die Performance etwas sorgen
#1 Matthias (Homepage) am 24.10.2011 21:15 (Antwort)
Ich hab mich mal ein wenig umgeschaut. Die meisten Crawler-Programme verlangen eine Beschränkung der Verzeichnistiefe und der Anzahl zu crawlender Domains. Bei der Verzeichnistiefe werde ich auch abriegeln - der zweite Punkt gilt zumindest nicht für meine Implementierung, da ich die Seiten nur einer Domain analysieren werde.
#1.1 Nico am 24.10.2011 21:52 (Antwort)

Kommentar schreiben


Standard-Text Smilies wie :-) und ;-) werden zu Bildern konvertiert.

Um maschinelle und automatische Übertragung von Spamkommentaren zu verhindern, bitte die Zeichenfolge im dargestellten Bild in der Eingabemaske eintragen. Nur wenn die Zeichenfolge richtig eingegeben wurde, kann der Kommentar angenommen werden. Bitte beachten Sie, dass Ihr Browser Cookies unterstützen muss um dieses Verfahren anzuwenden.
CAPTCHA

 
 

Blog abonnieren

RSS 2.0 Feed

Suche

Kalender

Zurück Februar '12 Vorwärts
Mo Di Mi Do Fr Sa So
    1 2 3 4
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29        

Verwaltung des Blogs

Blogroll

Projects/Web

vCard

  • Nico Steiner
  • www.nicosteiner.de
  • Karlsruhe/Germany
  • Senior Frontend-Developer at 1&1