WebcrawlerJS - Universität Freiburg
Transcription
WebcrawlerJS - Universität Freiburg
Albert-Ludwigs Universität Freiburg WebcrawlerJS Programmdokumentation Malte Ahl 7. Oktober 2009 Inhaltsverzeichnis 1 WebcrawlerJS 1.1 Voraussetzungen . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2 Start des Suchdurchlaufs . . . . . . . . . . . . . . . . . . . . . . . 2 3 3 2 WebcrawlerJS Webinterface 6 3 Programmargumente für den WebcrawlerJS 7 1 Kapitel 1 WebcrawlerJS Aktuelle Suchdienste bieten keine Möglichkeit Anfragen über die Struktur eines JavaScript Skripts zu stellen, sondern erlauben lediglich eine Stringsuche. Der WebcrawlerJS ist ein in Java geschriebenes Kommandozeilen Programm, welches mit Hilfe von Yahoo [Yah] und Google CodeSearch [Gooc] Javascript Dateien aus dem Intenet herunterlädt und mit Hilfe von Mozillas Javascript Parser Rhino [Rhia] in eine XML Darstellung umwandelt. Dabei spielt es keine Rolle wie oft und mit welchen Argumenten der WebcrawlerJS ausgeführt wird: Werden neue URL Adressen gefunden, versucht der WebcrawlerJS die zugehörigen Dateien herunter zu laden und dem vorhandenen Datenbestand hinzu zu fügen, wenn es sich dabei um Javascript Dateien oder HTML Dateien mit eingebetteten Javascript handelt, ansonsten werden die URL Adressen verworfen 1 . Besonderheiten der jeweiligen Suchdienste bleiben vor dem Benutzer transparent. Auf die resultierenden XML Dateien kann der Benutzer mit einem Dateimanager oder über den Berkeley XML Datenbankmanger DBXML von Oracle [DBX] zugreifen. Für den Zugriff über einen Webbrowser steht ein Webinterface zur Verfügung welches mit Hilfe von PHP die XML Dateien mit ihren zugehörigen Javascript Code verlinkt, statistische Übersichten über den Datenbestand zur Verfügung stellt und XPATH Anfragen mit Hilfe von PHPs SimpleXML sowohl auf einzelnen Dateien, als auch auf dem gesamten Datenbestand ausführt. Das Webinterface steht unter [20009] öffentlich zur Verfügung und enthält derzeit einen Datenbestand von 2455 Javascript Dateien, was 38955 Zeilen Code entspricht. 1 Der WebcrawlerJS merkt sich nur die URL Adressen von Dateien, die erfolgreich im Verzeichnis js/“des Hauptordners abgespeichert wurden. Verworfene URL Adressen werden erneut ” geprüft, wenn z.B. der Startindex zurückgesetzt wird. 2 1.1 Voraussetzungen , Software Java Betriebssystem Webbrowser Webserver Sprache 1.2 Anforderung Der WebcrawlerJS lief bisher nur unter Version 6 von Suns Java. Der WebcrawlerJS wurde auf dem Linuxsystem Ubuntu(Jaunty Jackalope) entwickelt und getestet. Das Webinterface des WebcrawlerJS verwendet HTML mit Framesets und UTF-8 codierung, Javascript, XSLT und CSS. Das Webinterface sollte in einer Umgebung mit PHP 5 ausgeführt werden, um XPATH Anfragen mit SimpleXML stellen zu können. Unter dem Linuxsystem Ubuntu (Jaunty Jackalope) reicht es, das Webinterface in das Verzeichnis /var/www “zu kopieren, die Zu” griffsrechte entsprechend anzupassen und die aktuellen PHP Pakete aus dem Paketverwaltungssystem Synaptic herunterzuladen und zu installieren. Quellcode, bzw. Textausgaben vom WebcrawlerJS und dem Webinterface sind in Englisch Start des Suchdurchlaufs Der WebcrawlerJS verfügt über eine Reihe von Argumenten [Kap. ??,S. ??] mit denen sich der Suchdurchlauf, aber auch die Umwandlung der Javascript Dateien in XML steuern lässt. Um die Benutzung möglichst einfach zu halten, existiert neben dem WebcrawlerJS ein sogenanntes Webcrawler-Starterkit ” “. Dieses enthält eine Reihe von Bash Skripten mit selbst erklärenden Namen, welche den WebcarwlerJS mit den entsprechenden Parametern starten. Einen schnellen Eindruck von der Programmfunktionalität erhält man, wenn man das Bash Skript start “in einer Kommandozeile ausführt. Damit legt der ” WebcrawlerJS in dem aktuellen Verzeichnis einen Hauptordner mit dem Namen WebcrawlerJS “an, der einige Unterordner besitzt, sucht über Yahoo die URL ” Adressen von 100 Javascript Dateien und lädt diese von ihrem Ursprungsort herunter, sofern sie vorhanden sind. Direkt im Anschluß wird die Umformung der Javascript Dateien gestartet. In diesem Schritt werden auch die statistischen Informationen wie Anzahl an Code Zeilen und verwendeteten Javascriptelementen für das Webinterface ermittelt und die Dateien in der XML Datenbank abgespeichert. Zum Schluß wird das Webinterface erzeugt. Informationen und 3 Fehlermeldungen werden in einer Logdatei im Hauptordner abgelegt. Wechselt der Benutzter nun in den angelegten Hauptordner findet er die HTML Dateien index.html “und statistic.html“. Verfügt das Linuxsystem über eine Apache ” ” Installation mit PHP 5 kann der Benutzer einen symbolischen Link in dem Linux Verzeichnis /var/www/“auf diese index.html“erstellen und im Webbrowser ” ” das Webinterface ohne weitere Konfiguartionsschritte öffnen und XPATH Anfragen über einzelne Dateien oder den gesamten Datenbestand stellen. Fehlt eine PHP Installation, erhält der Benutzer einen schnellen Überblick über den Datenbestand indem er die Datei statistic.html“in einem Webbrowser öffnet. ” Diese entspricht einer PHP freien“Version der Startseite des Webinterface und ” zeigt unter anderem auch an, wieviele von den 161 erkennbaren Javascriptelementen in dem aktuellen Datenbestand vorkommen. Neben den beiden HTML Dateien befinden sich in dem Hauptordner die Verzeichnisse XML“, DB“, js“, html“und token“, sowie natürlich die Logbücher ” ” ” ” ” die bei jedem Programmstart erstellt werden und die Datei .urls“welche nicht ” sichtbar ist und einige Meteinformationen über den Datenbestand enthält, sowie alle URL Adressen aller Javascript Dateien die im genannten Verzeichnis js“ ” abgespeichert wurden, um ein erneutes Herunterladen bei weiteren Programmstarts zu vermeiden. Der Benutzer hat nun die Möglichkeit, mit einem Dateimanager in den Ordner XML“zu navigieren um auf die erzeugten XML Dateien zuzugreifen. Diese ” Methode ist aber nur für eine geringe Anzahl an Dateien zu empfehlen. Zuverlässiger ist hier der Zugriff über ein Konsolenprogramm, da dieses in der Regel mit großen Dateimengen besser umgehen kann. Eine weitere Möglichkeit auf die XML Dateien zuzugreifen erhält man, indem man in einer Konsole in das Verzeichnis DB“wechselt. Dieses enthält die Binärdatei dbxml“, das Daten” ” bankarchiv files.dbxml“, sowie die Textdatei query“und eine Readme. Mit ” ” dem Befehl ./dbxml“startet man nun den DBXML Manager, was man daran ” erkennt, dass sich der Eingabeprompt ändert. Gibt man nun den Befehl run ” query “ein, listet der DBXML Manager alle URL Adressen auf, deren Javascript Dateien erfolgreich von Rhino geparst und in eine XML Darstellung umgeformt wurden. Dabei greift der DBXML Manager nicht auf die XML Dateien im Ordner XML/ “zu, sondern auf die Datei files.dbxml“, welche eine Kopie aller ” ” XML Dateien in einer effizienteren Knotendarstellung enthält [DBX]. Die Anweisung, alle URL Adressen aufzulisten erhält der DBXML Manager über eine XQuery Anfrage welche in der genannten Textdatei query“abgespeichert ist. Da ” die Steuerung des DBXML Managers sehr einfach gehalten ist und zum Beispiel nicht das Vor- und Zurücknavigieren erlaubt, ist es zu empfehlen, XQuery Anfragen und alle anderen Befehle in einer Textdatei wie der genannten abzuspeichern und diese mit dem Befehl run [Textdatei]“im DBXML Manager auszuführen. ” Auf die Javascript Dateien kann der Benutzer zugreifen, indem er im Hauptordner in das Verzeichnis js/“wechselt. Möchte er für weitere Programmstarts ” Änderungen an der XML Struktur vornehmen, findet er im Hauptordner im Verzeichnis token“zwei Textdateien mit den Namen TokenNameSettings.txt“und ” ” XMLTextNodeSettings.txt“. In der ersten kann der Benutzer einen alternativen ” 4 Namen für alle Token der verwendeten XML Struktur einstellen indem er die ID eines Tokens, gefolgt von einem Semikolon und einer neuen Bezeichnung in eine neue Zeile einfügt. Die ID ist in der Datei Token.java“in der Javadoc unter ” [Rhib] angegeben. Die zweite Textdatei im Verzeichnis token“legt fest, welche ” XML Knoten einen Textknoten besitzten dürfen. Die Standarteinstellung, welche Textknoten für STRING“, NUMBER“und NAME“erlaubt reicht aus. Sollen ” ” ” auch Knoten anderen Tokentyps Textknoten enthalten dürfen, muss lediglich die Token ID von [Rhib] in einer neuen Zeile angegeben werden. Hinweis 1 (Einstellungsdateien) Sollen vor dem Start des Suchdurchlaufs Einstellungen an der XML Struktur vorgenommen werden, kann der WebcrawlerJS mit dem Argument --tfiles aufgerufen werden. Es wird dann nur die Ordnerstruktur und die Einstellungsdateien angelegt und kein Suchdurchlauf gestartet. Alternativ kann mit den Argumenten --tnames=[Pfadangabe] und -tvalues=[Pfadangabe] explizit auf Einstellungsdateien für alternative Token Namen und Textknoten Einstellungen hingewiesen werden. Schlußendlich sei noch das Verzeichnis “html erwähnt, welches alle Dateien ” des Webinterfaces enthält. Es benötigt den wenigsten Speicherplatz, beinhaltet jedoch eine sehr große Anzahl an Dateien, was eine Rolle spielt, wenn der Datenbestand mit Hilfe des Webinterfaces auf einem Server veröffentlicht und mit FTP oder SVN kopiert werden soll. 5 Kapitel 2 WebcrawlerJS Webinterface Das Webinterface des WebcrawlerJS wird automatisch bei jedem Transformationsprozess des WebcrawlerJS neu angelegt. Mit Transformationsprozess ist die Umwandlung der heruntergeladenen Javascript-Dateien in eine äquivalente XML-Darstellung gemeint. Dieser Schritt schließt das Parsen der Javascript Dateien mit dem Javascript Interpreter Rhino ein. Das Webinterface kann ohne weitere Konfigurationsschritte auf einem Webserver mit einer PHP5 Instalation ausgeführt werden. Unter [20009] ist eine aktuelle Version des Webinterface mit einem aktuellen Datenbestand von 2455 Javascript-Dateien zu finden. 2455 Javascript-Dateien entsprechen 38955 Zeilen Programmcode, wobei Kommentare mitgezählt wurden. Über eine Eingabemaske lassen sich sowohl über einzelnen Dateien als auch über dem ganzen Datenbestand XPAth-Anfrage stellen. Bei dem Stellen von XPath-Anfragen müssen allerdings Besonderheiten des Rhino AST berücksichtigt werden. So gilt eine For-In-Anweisung als Spezialfall einer For-Anweisung. Es existiert zwar ein ELSE Token, dieser wird aber nicht verwendet. Statt dessen wird eine Else-Verzweigung durch eine Zusätzliche Anweisung innerhalb eines If-Knotens angegeben. Dies gilt auch für den SWITCH Token, dessen DEFAULTToken zwar existiert, aber ebenfalls, auf Grund alternativer Darstellungsmöglichkeiten, nie verwendet wird. Außerdem existiert ein TYPEOFNAME Token, der laut Quellcode für den Operator typeof verwendet werden soll, aber ebenfalls nicht zum Einsatz kommt. Für den Operator typeof wird der Token TYPEOF verwendet. 6 Kapitel 3 Programmargumente für den WebcrawlerJS , 7 Argument --help --index --limit=[zahl ≥1] --yahoo --google --query=[Zeichenfolge] --addquery=[Zeichenfolge] , Beschreibung Zeigt eine Liste der verfügbaren Argumente an. Diese Angabe setzt bei Programmstart den Index-Wert des ersten HTTPRequests, welches an den Suchdienst gesendet wird. Der Defaultwert ist 1. Der WebcrawlerJS inkrementiert die Indezes für alle weiteren HTTP-Requests automatisch. Wird der Index bei Programmstart nicht angegeben, lädt der WebcrawlerJS den letzten Wert der für einen Index, der im letzten Programmdurchlauf verwendet wurde. Begrenzt die Anzahl der Javascript Dateien die erfolgreich heruntergeladen und formatiert wurden und für eine Umwandlung in XML zur Verfügung stehen. Diese Angabe ist nicht notwendig, da der Suchdienst Yahoo momentan als Default eingestellt ist. Diese Angabe ersetzt den Suchdienst Yahoo (default) durch Google CodeSearch Ohne diese Angabe wird in Abhängigkeit vom verwendeten Suchdienst ein Anfrage verwendet, die möglichst viele Javascript Dateien als Resultat liefern soll. Bei Yahoo ist das ’inurl:.js’, bei Google CodeSearch ’lang:javascript’. Das Argument -query ersetzt den Defaultwert. Ergänzt die Anfrage durch weitere Suchbegriffe. Diese Angabe ist praktisch um bei einem beschränkten Suchindexintervall durch geschickt gewählte Suchbegriffe immer wieder neue Resultate zu erhalten. Diese Angabe erzielt zusammen mit dem Argument --yahoo sehr gute Ergebnisse. Das Programm BashScriptGenerator.jar aus dem Webcrawler-Starterkit generiert ein Bashscript welches den WebcrwalerJS mit unterschiedlichen Suchbegriffen aus einer Wortliste aufruft. 8 Argument --delemiter=[Zeichen] --steps=[Zahl ≥1] --delay=[Zahl ≥0] , Beschreibung Die Suchdienste Yahoo und Google CodeSearch verwenden unterschiedliche Zeichen, um einzelne Suchbegriffe von einander zu trennen. Mit diesem Argument kann ein beliebiges Zeichen als Trennzeichen angegeben werden. Der Defaultwert is +. Der WebcrawlerJS sendet bei Ausführung HTTP-Requests an den Suchdienst und inkrementiert dabei automatisch den Index. Mit diesem Argument kann die Anzahl an Resultaten angegeben werden, die bei jedem HTTP-Request angefordert werden sollen. Der Defaultwert ist 10. Ein sehr gutes Ergebnis erhält man mit dem Wert 40 und dem Argument --yahoo. Gibt die Wartezeit an, die der WebcrawlerJS warten soll, bis er neue HTTP-Requests an den Suchdienst schickt. 9 Argument --convert --search --notquiet --nodbxml --nocheck --maxindex=[zahl ≥1] --alias[Zeichenfolge] --email=[Emailadresse] --passwd=[Zeichenfolge] Beschreibung Convertiert die abgespeicherten Javascript Dateien in XML ohne nach neuen Javascript Dateien zu suchen. Sucht nach neuen Javascript Dateien. Wird dieses Argument nicht verwendet, startet der Webcrwaler die Konvertierung der Javascript Dateien in XML direkt nach Beenden des Suchdurchlaufs. Zeigt zusätzliche Informationen während des Programmdurchlaufs an. Dieses Argument sollte verwendet werden, wenn es nicht möglich ist die native shared libraries der Berkeley DBXML einzubinden. Die XML Dokumente können nachträglich der XML Datenbank hinzugefügt werden, indem der WebcrawlerJS mit dem Argument -convert ausgeführt wird, vorausgesetzt, die nativ shared libraries stehen dann zur Verfügung. Der Webcrawler sendet beim Programmstart zwei HTTP-Requests an den Suchdienst, einmal, um die Verfügbarkeit zu prüfen, und ein zweites mal um die Verfügbarkeit unter Verwendung des aktuellen Wertes für den Startindex zu prüfen. Um Zeit zu sparen, können diese Tests mit --nocheck deaktiviert werden. Dieser Parameter ist nützlich, wenn Google CodeSearch als Suchdienst verwendet wird. Google CodeSearch beschränkt die Anzahl der Resultate ebenfalls auf ein Indexintervall von 1 bis 1000, unterbricht aber meistens vorher die Verbindung. Wird der WebcrawlerJS mehrmals mit den gleichen Parametern (ohne die Angabe von --index ) z.B. in einem Skript gestartet, wird der Index nach erreichen des Wertes zurückgesetzt und nicht weiter erhöht. Wird Google CodeSearch verwendet, kann mit diesem Argument ein Token, z.B. der alternative Benutzername aus einem Googleaccount, angegeben werden.[Gooa] Wird Google CodeSearch verwendet, 10 kann hier der Benutzername (Emailadresse) eines Googleaccounts angegeben werden.[Goob],[Gooa] Wird Google CodeSearch verwendet, kann hier dass zum Benutzernamen gehörende Passwort angegeben werden. , Argument --debug --xmltoken --noformat , Beschreibung Zur Umwandlung der Javascript Dateien in XML verwendet der WebcrawlerJS den Rhino Parser von Mozilla. Dieser stellt eine Debugansicht des erzeugten AST, die Grundlage des resultierenden XML Dokumentes, zur Verfügung die mit --debug für jede umgewandelte Javascript Datei auf der Konsole ausgegeben wird. Der WebcrawlerJS entfernt XML Dateien, die lediglich einen Token vom Typ XML verwenden, da dies darauf hinweist, das der Rhino Parser mit einem HTML Dokument aufgerufen wurde. --xmltoken deaktiviert dieses Verhalten. Der Rhino Parser, aber auch die Klasse StringBuilder aus der java.lang reagieren empfindlich auf Textdateien, welche eine sehr große Anzahl Zeichen in nur einer Zeile besitzen. Der WebcrawlerJS fügt deshalb Zeilenumbrüche ein, mit Rücksicht auf die Javascript Syntax. Mit --noformat wird ein Zeilenumbruch nach 50 Zeichen beim nächsten Semikolon erzwungen, wenn bis dahin kein Zeilenumbruch erfolgte. 11 Argument --duplicates=[zahl ≥0] --notload --tnames=[Pfadangabe] --tvalues=[Pfadangabe] -- tfiles Beschreibung Die Anzahl an Duplikaten, bei der der WebcrawlerJS die Suche abbrechen soll. Der Defaultwert von 5 erzielt sehr gute Ergebnisse. Deaktiviert das Laden von Javascript Dateien, die in vorhergehenden Programmausführungen erfolgreich heruntergeladen wurden. Mit diesem Argument kann der Pfad zu einer Textdatei angegeben werden, mit der sich die Namen der Token einstellen lassen, die für die resultierenden XML Dokumente verwendet werden sollen. Der Defaultwert verweist auf die Dateien im Ordner WebcrawlerJS/token der beim ersten Programmstart erzeugt wird. Gibt den Pfad zu einer Textdatei an, die bestimmt welche XML-Knoten einen Textknoten beinhalten dürfen. Nach Aufruf des WebcrawlerJS mit diesem Argument wird nur die Ordnerstruktur und die Einstellungsdateien für die XML Struktur erstellt und anschließend das Programm beendet. 12 Literaturverzeichnis [20009] Webcrawlerjs webinterface. September 2009. http://webcrawlerjs.malteahl.de/, [DBX] Dbxml. http://www.oracle.com/technology/products/ berkeley-db/xml/index.html. [Gooa] Google account. https://www.google.com/accounts/ManageAccount. [Goob] Google authentication. http://code.google.com/intl/de-DE/apis/ accounts/docs/AuthForInstalledApps.html. [Gooc] Google codesearch. http://www.google.com/codesearch?hl=de. [Rhia] Rhino. http://www.mozilla.org/rhino/. [Rhib] Rhino javadoc. http://mxr.mozilla.org/mozilla/source/js/ rhino/src/org/mozilla/javascript/. [Yah] Yahoo. http://de.yahoo.com/. 13