Hochschule Wismar University of Applied Sciences Technology, Business and Design Fakult¨at fur¨ Ingenieurwissenschaften, Bereich EuI

Bachelor-Thesis

Vergleich aktueller Web-Crawling-Werkzeuge

Gedruckt am: 30. April 2021

Eingereicht am:

von: Christoph Werner

Betreuende Professorin: Prof. Dr.-Ing. Antje Raab-Dusterh¨ ¨oft Zweitbetreuer: Prof. Dr.-Ing. Matthias Kreuseler

Aufgabenstellung

Das Ziel der Bachelor Thesis ist ein Vergleich aktueller Web-Crawling-Werkzeuge. Die Crawler sind hinsichtlich ihrer Funktionsweise und Crawling-Ergebnisse zu ver- gleichen und zu bewerten. Des Weiteren ist ein Tool zu konzeptionieren, welches diese Werkzeuge fur¨ die Nutzung in Laborpraktika verfugbar¨ macht.

3 Kurzreferat

Webcrawling im Verbund mit Webscraping ist eine der grundlegenden Technologien, um gezielt und automatisiert Daten aus dem Internet zu sammeln.

Zun¨achst wird in dieser Thesis auf die Grundlagen des Crawlings und Scrapings eingegangen. Hierbei soll besonderes Augenmerk auf der Architektur und Funkti- onsweise eines Crawlers, dem Robots Exclusion Protocol (REP), zu bedenkende Sicherheitsaspekte, sowie Anti-Crawling/Scraping-Maßnahmen liegen.

Darauf aufbauend werden verschiedenste Crawling Frameworks auf Grundlage ihrer Dokumentation bewertet und gegenubergestellt.¨

Abschließend wird ein Tool mit einer grafischen Benutzeroberfl¨ache (GUI) zum Ver- gleich von verschiedenen Crawling Frameworks entwickelt.

4 Abstract

Web crawling in combination with web scraping is the key technology for the targeted and automated collection of data from the World Wide Web.

First of all, this thesis deals with the basics of crawling and scraping. Special at- tention will be paid to the architecture and functionality of a crawler, the Ro- bots Exclusion Protocol (REP), security aspects to be considered as well as anti- crawling/scraping measures.

Based on this, various crawling frameworks are evaluated and compared on the basis of their documentation.

Afterwards a tool with a Graphical User Interface (GUI) for the comparison of different crawling frameworks will be developed.

5 Inhaltsverzeichnis

Inhaltsverzeichnis

1 Motivation ...... 10

2 Grundlegendes zu Webcrawlern ...... 11 2.1 Architektur eines modernen Crawlers...... 11 2.2 Downloader und Parser Prozess...... 12 2.3 Robots Exclusion Protocol...... 13 2.3.1 Implementierung als robots.txt...... 13 2.3.2 Implementierung als META-Tag...... 15 2.3.3 Sicherheitsaspekte...... 15 2.4 Crawler Identifizierung...... 16 2.5 Crawling-Richtlininen...... 17 2.5.1 Selection Policy (Auswahlrichtlinie)...... 17 2.5.2 Re-Visit Policy (Richtlinie fur¨ erneuten Aufruf)...... 20 2.5.3 Politeness Policy (H¨oflichkeitsrichtlinie)...... 22 2.5.4 Parallelization Policy (Parallelisierungsrichtlinie)...... 23 2.6 Maßnahmen gegen Crawler...... 24 2.6.1 Prufung¨ der HTTP Request Header...... 24 2.6.2 Blockieren vonIP-Adressen...... 24 2.6.3 Inhaltslose Gestaltung von Fehlermeldungen...... 25 2.6.4 Honeypot Fallen...... 25 2.6.5 Regelm¨aßiges Andern¨ des HTML Code...... 25 2.6.6 Verstecken von Inhalten...... 25 2.7 Nutzung von Crawlern...... 26

3 Eigenschaften des optimalen Crawlers ...... 28 3.1 Robuste Extraktion von Links...... 28 3.2 Datenbank und Datenexport...... 28 3.3 Ausfuhren¨ von JavaScript...... 28 3.4 Anwendung des REP...... 29 3.5 Passende Request Header...... 29

6 Inhaltsverzeichnis

3.6 Richtlinienanwendung...... 29 3.7 Skalierbarkeit...... 29 3.8 Umgehen eines Banns durch Adminstratoren...... 30

4 Bewertungsschema ...... 31 4.1 Datenextraktionsmechanismen...... 31 4.2 Datenbankanbindung...... 32 4.3 JavaScript Unterstutzung¨ ...... 32 4.4 Datenexport...... 33 4.5 Anwendung des Robots Exclusion Protocol...... 33 4.6 Request Header Anpassung...... 34 4.7 Integrierte Crawling-Richtlinien...... 34 4.8 Skalierbarkeit...... 35 4.9 Proxyserverunterstutzung¨ ...... 35

5 Bewertung der vorausgew¨ahlten Tools ...... 36 5.1 Einschr¨ankungen...... 36 5.2 Ungewichtete Bewertung...... 38 5.3 Gewichtung der Bewertungskriterien...... 39 5.4 Gewichtete Bewertung...... 40 5.5 Erl¨auterung der Notenvergabe bei , und Storm- crawler...... 42 5.5.1 Scrapy...... 42 5.5.2 Apache Nutch...... 44 5.5.3 StormCrawler...... 45 5.6 Ergebnisanalyse...... 47 5.6.1 Test auf Normalverteilung der Noten...... 47 5.6.2 Vergleich der Tools...... 48 5.6.3 Spezialf¨alle in der Auswahl...... 49

6 Funktionsweisen der drei bestbewerteten Werkzeuge ...... 50 6.1 Scrapy...... 50 6.2 Apache Nutch...... 52 6.3 StormCrawler...... 54

7 Werkzeugtest ...... 56 7.1 Vorgaben fur¨ Crawler im Test...... 56 7.2 Testvorkehrungen...... 57 7.2.1 Proxy-Pool...... 57

7 Inhaltsverzeichnis

7.2.2 User-Agent-Pool...... 57 7.2.3 Seed-URLs...... 57 7.3 Test von Scrapy...... 58 7.3.1 Konfigurationen von Scrapy Crawler...... 58 7.3.2 Auswertung von Scrapy...... 59 7.4 Test von Apache Nutch...... 60 7.4.1 Konfigurationsdateien fur¨ Apache Nutch Crawler...... 60 7.4.2 Auswertung von Apache Nutch...... 62 7.5 Test von StormCrawler...... 63 7.5.1 Vorausgesetzte Programme fur¨ Stromcrawler...... 63 7.5.2 Konfigurationsdatei fur¨ StromCrawler...... 65 7.5.3 Auswertung von StormCrawler...... 66 7.6 Vergleich der Ergebnisse...... 67

8 Tool fur¨ das Praktikum ...... 69 8.1 Anforderungen an das Tool...... 69 8.2 Grafische Benutzeroberfl¨ache des Tools...... 69 8.3 Verarbeitung der Formulareingaben...... 71 8.3.1 Auswahl des Crawlers...... 71 8.3.2 Generierung von Skripten fur¨ Scrapy...... 71 8.3.3 Generierung von Dateien fur¨ Apache Nutch...... 72 8.3.4 Generierung von Stormcrawler-Dateien...... 73 8.4 Zu bedenkende Punkte bei Generierung von Konfigurationsdateien.. 74

9 Fazit ...... 77

Literatur ...... 79

Bildverzeichnis ...... 87

Tabellenverzeichnis ...... 88

Codeverzeichnis ...... 89

Abkurzungen¨ ...... 91

Selbstst¨andigkeitserkl¨arung ...... 93

Thesen ...... 94

A Liste von h¨andisch gesammelten Crawling-Werkzeugen ...... 95

8 Inhaltsverzeichnis

B Code Anhang: Scrapy ...... 97

C Code Anhang: Apache Nutch ...... 106

D Code Anhang: Stromcrawler ...... 114

Daten-CD ...... 118

9 Kapitel 1. Motivation

1 Motivation

Auf Grund des stetig wachsenden Umfangs des Internets und den dadurch steigen- den Informationsgehalt wird es n¨otig die Inhalte, oder zumindest einen Großteil davon, zu indexieren. Wie in einer Bibliothek wird ein Verzeichnis angelegt, welches Grundinformationen zu dem jeweiligen Inhalt fuhrt.¨ Da das internationale Netz je- doch neben seiner Gr¨oße zus¨atzlich sehr dynamisch ist, Webseiten und Inhalte also st¨andig aktualisiert, entfernt oder hinzugefugt¨ werden, ist eine manuelle Fuhrung¨ eines Internetverzeichnisses unm¨oglich.

Diese Aufgabe ubernehmen¨ Suchmaschinen mit ihren Bot-Programmen, sogenann- ten Crawlern, welche die Technologie Webcrawling im Verbund mit Webscraping nutzen, um gezielt und automatisiert Daten aus dem Internet zu sammeln und zu indexieren.

Diese Thesis besch¨aftigt sich zun¨achst mit den Grundlagen und der Funktionsweise dieser Crawler.

Die Nutzung von Webcrawlern ist jedoch nicht nur den großen Suchmaschinenan- bietern vorbehalten, sondern steht auch dem einfachen Nutzer offen. Dieser kann mit Hilfe einer Vielzahl an Frameworks und Funktionsbibliotheken ebenfalls Web- crawler zur Informationsrecherche, Datensammlung oder Indexierung erstellen und betreiben.

Ab Kapitel4 befasst sich diese Arbeit zun ¨achst mit einem Bewertungsschema zur Benotung einer Auswahl von Crawling-Werkzeugen. Anschließend stellt sie diese gegenuber¨ und skizziert danach die internen Abl¨aufe der drei Bestbenoteten.

Im Anschluss werden in Kapitel7 diese drei Crawling-Werkzeuge hinsichtlich ihrer Ergebnisse in verschiedenen Konfigurationen getestet. Hierbei soll gekl¨art werden welches dieser Werkzeuge am effektivsten und zuverl¨assigsten arbeitet. Außerdem soll in diesem Zuge ein Programm geschrieben werden, mit dessen Hilfe zukunftig¨ Studierende an der Hochschule Wismar im Fach Informationsrecherche“ selbst ein- ” fache Crawler definieren und Konfigurationsdateien fur¨ diese erzeugen k¨onnen.

10 Kapitel 2. Grundlegendes zu Webcrawlern

2 Grundlegendes zu Webcrawlern

In diesem Kapitel wird zun¨achst auf die grundlegende Architektur eines Web-Crawlers eingegangen. Anschließend wird das Robots Exclusion Protocol (REP) n¨aher be- leuchtet und auf Crawling-Richtlinien, die sowohl die Aktualit¨at der bereits besuch- ten Inhalte, als auch die Resourcennutzung des Crawlers betreffen, eingegangen. Zum Abschluss werden Anti-Crawling-Maßnahmen betrachtet, die bei einer sp¨ateren Konfiguration der Crawler bedacht werden mussen.¨

2.1 Architektur eines modernen Crawlers

Als Ausgangspunkt dient dem Scheduler ein Satz von Uniform Resource Locators (URLs), der eine m¨oglichst breite Inhaltsf¨acherung erzeugt. Wie der Name schon im- pliziert, plant der Scheduler die Ubergabe¨ von URLs an den Downloader, sodass die Betriebsmittel des Rechners oder des verteilten Systems optimal genutzt werden.

Das Herzstuck¨ eines jeden Crawlers ist sein Downloader und Parser. Der Downloa- der erh¨alt eine URL vom Scheduler, deren Inhalte durch den Downloader aus dem Internet zun¨achst angefragt und anschließend durch den Parser verarbeitet wird. Hierbei extrahiert der Parser aus dem Hypertext Markup Language (HTML) Co- de der Webseite weiterfuhrende¨ URLs und gegebenenfalls Metadaten. Die besuchte Seite wird anschließend samt URL und Metadaten in eine Datenbank abgelegt.

Bevor die gefundenen URLs an die URL Queue weitergegeben werden, wird jede mit der Datenbank von bereits besuchten Seiten abgeglichen. So soll vermieden werden, dass eine Webseite mehrfach besucht wird.

Sobald der Scheduler wieder freie Kapazit¨aten im System erkennt, entnimmt er eine URL aus der URL Queue und ubergibt¨ sie an den Downloader/Parser. Dieses Pro- zedere wird wiederholt, bis eine definierte Endbedingung erfullt¨ ist (meist eine leere URL Queue oder ein abgelaufenes Zeitlimit). Die beschriebene Crawler-Architektur ist in Bild 2.1 veranschaulicht.

11 Kapitel 2. Grundlegendes zu Webcrawlern

Bild 2.1 Aufbau eines modernen Crawlers

2.2 Downloader und Parser Prozess

Hinter dem in Bild 2.1 dargestellten Prozess des Downloaders und Parsers verbirgt sich eine deutlich komplexere Abfolge von Prozessen.

Der Downloader stellt einen URL-Request an den Webserver und erh¨alt von diesem ein HTML Dokument zuruck.¨ Dieses HTML Dokument wird vom Parser verarbeitet und nach URLs und optional nach weiteren interessanten Merkmalen durchsucht. Die URLs und Metadaten werden abschließend fur¨ die weitere Verarbeitung ausge- geben.

Das Parsing, also die Syntaxanalyse, der HTML-Datei erfolgt meist mit einem spe- zialisierten Programm oder einer Softwarebibliothek. Ein Scraper extrahiert im An- schluss mittels Selektoren oder durch regul¨are Ausdrucke¨ die relevanten Seitenin- halte. Als Selektoren k¨onnen Cascading Style Sheet (CSS) Klassen, HTML Tags oder eine Kombination aus beidem dienen. Diese Selektoren werden als CSS- und Xpath-Selektoren bezeichnet.[1][2]

12 Kapitel 2. Grundlegendes zu Webcrawlern

2.3 Robots Exclusion Protocol

Mit dem in Kapitel 2.1 beschriebenen Webcrawler wird jede aufgefundene Webseite und deren Inhalt verarbeitet. Dieses Vorgehen ist jedoch nicht von allen Webseiten- betreibern erwunscht.¨ Abhilfe schafft das als Industriestandard etablierte Robots Exclusion Protocol (REP).

Erstmals vertreten ist das REP im HTML-Standard der Version 4.01.[3]

Eine genauere Beschreibung der Implementierungen als Textdatei [4] oder als HTML- META-Tag [5] wird im Folgenden erl¨autert.

2.3.1 Implementierung als robots.txt

Das Format des REP ist 1996 von Martijn Koster in einem Internet Draft mit dem Titel A Method for Web Robots Control“ beschrieben worden.[6] ” Demnach muss die Datei robots.txt vom Internet Media Type text/plain sein und im Wurzelverzeichnis der Webseite liegen. Jede Zeile der Datei ist nach dem Schema : formatiert. In der ersten Beschreibung sind drei Wer- te fur¨ spezifiziert: User-agent , Allow und Disallow . Sp¨ater kamen Crawl-delay und Sitemap als Werte hinzu. Bei Angabe von -Werten ist auf die Groß- und Kleinschreibung zu achten (Angaben sind ‘case sensitive’). Eine beispielhafte robots.txt ist in Code 2.1 abgebildet.

User-agent gefolgt von einem String als gibt an, dass jeder Craw- ler, dessen Name ein Superstring des gegebenen Strings ist, die sich anschließen- den Regeln befolgen soll. So wird zum Beispiel mit User-agent: google auch googlebot , googlebot-image und mediapartners-google angesprochen.

Soll jeder Crawler angesprochen werden, wird ein User-agent: * gesetzt. Dies sollte, wie in Code 2.1 zu sehen, stets nach den crawlerspezifischen Regeln eingefugt¨ werden, um alle noch nicht behandelten Crawler aufzufangen. Außerdem ist zu be- achten, dass immer nur die erste passende Ubereinstimmung¨ angewendet wird.

13 Kapitel 2. Grundlegendes zu Webcrawlern

Allow und Disallow gefolgt von einem String, informiert den Crawler uber¨ einen Verzeichnis- oder Dateipfad, welcher besucht oder nicht besucht werden darf. Die Pfadangabe kann ein vollst¨andiger Pfad oder ein Teilpfad sein. Pro Zeile in der robots.txt ist nur eine Regel erlaubt. Ein Crawler muss jede URL mit die- sen Regeln gegenprufen¨ und die erste passende Regel anwenden. Sollte keine Re- gel gefunden werden, wird angenommen, dass die URL erlaubt ist. Zum Beispiel schließt Disallow: /foo sowohl die Datei /foo.html als auch den kompletten Pfad /foo/bar.html aus. Wohingegen Disallow: /foo/ nur den Pfad und sei- nen Inhalt ( /foo/bar.html ) fur¨ den Crawler als nicht besuchbar anzeigt.

Wird der -String leer gelassen, bedeutet dies bei Disallow , dass alle Pfade besucht werden durfen¨ – fur¨ Allow heißt es, dass kein Pfad erlaubt ist.

Die URL /robots.txt ist standardm¨aßig immer erlaubt und darf nicht in den Allow/Disallow Regeln vorkommen.

Crawl-delay gefolgt von einer Zahl z (z ∈ N) gibt dem Crawler eine Dauer in Sekunden vor, die er zwischen zwei aufeinanderfolgenden Besuchen pausieren soll. Dieses Feld ist optional.

Sitemap ist ein ebenfalls optionales Feld, welches mehrfach vorkommen darf. Es enth¨alt als Wert eine volle URL, die auf eine Sitemap im xml -Format verweist.[7]

Kommentare sind uberall¨ in der Datei erlaubt. Sie beginnen mit # und werden mit dem Zeilenende terminiert.

Wildcards und Regul¨are Ausdrucke¨ sind im REP nicht spezifiziert, werden jedoch von den meisten Crawlern verstanden und verarbeitet.[8]

So schließt Disallow: /*.php alle Dateien mit genau dieser Endung aus. Dateien mit Endung PHP bleiben fur¨ den Crawler erlaubt.

Einige Crawler erlauben auch regul¨are Ausdrucke.¨ So wird durch $ , welches das En- de einer URL anzeigt, eine hilfreiche Funktion eingebunden. Mit Disallow: /*.php$ wird also zum Beispiel /foobar.php nicht indexiert, jedoch /foobar.php?p1 .

14 Kapitel 2. Grundlegendes zu Webcrawlern

1 # Google Bot darf die gesamte Webseite crawlen 2 User-agent: Google 3 Disallow: 4 5 # BadBot wird im Rootverzeichnis blockiert 6 User-agent: BadBot 7 Disallow: / 8 9 # bisher nicht genannte Bots sind vom Verzeichnis tmp 10 # und von gif-Dateien ausgeschlossen 11 User-agent: * 12 Disallow: /tmp/ 13 Disallow: /*.gif$ 14 15 # beispielhafter Sitemap-Eintrag 16 Sitemap: https://www.example.com/sitemap.xml

Code 2.1 Beispiel einer robots.txt

2.3.2 Implementierung als META-Tag

Das META-Tag zur Konfiguration der Verarbeitung durch Crawler sollte – wie al- le META-Tags – im HEAD des HTML-Code verortet sein und folgt dem Schema . Der Attributwert von name muss ROBOTS lauten, der Attributwert von content kann, je nach Wunsch, durch kommagetrennte Bestandteile, unterschiedlich gestaltet sein und nimmt so Einfluss auf die Verarbeitung der Seite durch Crawler. Mit dem Wert INDEX wird es einem Crawler erlaubt die Seite zu indexieren. Mit FOLLOW darf der Crawler weiterfuhrenden¨ Links auf der Seite folgen. Die Werte NOINDEX und NOFOLLOW bewirken ein Verbot der Indexierung und des Folgen von Verlinkungen.

Ein Minimalbeispiel fur¨ eine Webseite mit allen sinnvollen Varianten dieses Meta- Tags ist in Code 2.2 dargestellt.

2.3.3 Sicherheitsaspekte

Jedem Webseiten-Administrator muss bewusst sein, dass das REP nur ein De-Facto- Standard und deshalb nicht garantiert ist, dass sich ein Crawler an die gegebenen Regeln h¨alt. Außerdem st¨ort eine falsche Konfigurierung die Indexierung der Websei- te durch Suchmaschinen mitunter empfindlich, wenn sie diese nicht sogar g¨anzlich verhindert. Weiterhin kann eine unachtsame Angabe von Disallow -Regeln dazu

15 Kapitel 2. Grundlegendes zu Webcrawlern

1 2 3 ... 4 5 6 11 12 13

Code 2.2 M¨ogliche Robots-META-Tags fuhren,¨ dass die Existenz von Pfaden erkenntlich wird, die sonst nicht weiter auf der Webseite verlinkt sind. Dies kann zu ungewollten URL-Guessing Attacken fuhren.¨

Auch Crawler-Entwickler mussen¨ bei der Verarbeitung der robots.txt gewissen Aspekten eine große Wichtigkeit zukommen lassen: So kann zum Beispiel uber¨ die Dateigr¨oße von robots.txt eine Denial of Service (DoS) Attacke auf den Crawler gefuhrt¨ werden. Durch eine sehr große Datei kann der Crawler nicht effektiv arbeiten, da die verfugbaren¨ Betriebsmittel fur¨ deren Verarbeitung bei jedem Request gebun- den werden. Aus diesem Grund sollten die Ressourcen zur Verarbeitung limitiert werden. Ebenfalls zu beachten ist, dass die robots.txt -Direktiven in separaten, m¨oglicherweise nicht authentifizierten Hypertext Transfer Protocol (HTTP) Trans- aktionen abgerufen und angewendet werden. Dies erm¨oglicht es einem b¨osartigen Server sich als ein anderer auszugeben oder dass anderweitig eine robots.txt ab- gefangen oder ver¨andert wird und so einem Crawler falsche Informationen geliefert werden.

2.4 Crawler Identifizierung

Seri¨ose Crawler geben dem besuchten Webserver ihre Identit¨at uber¨ das User-Agent Feld eines HTTP-Request preis. Spambots und andere sch¨adliche Webcrawler uber-¨ mitteln ihre Identit¨at nicht, maskieren sich als Browser oder immitieren einen be- kannten Crawler.

Eine Identifizierung ist fur¨ Websiteadministratoren deshalb wichtig, weil sie so in der

16 Kapitel 2. Grundlegendes zu Webcrawlern

Lage sind einzelnen Crawlern Regeln aufzuerlegen (vgl. Kapitel 2.3) und gegebenen- falls die Crawlerbetreiber zu informieren, sollte der Crawler den Server uberlasten.¨ Dies kann zum einen eine zu hohe Anzahl an Abfragen der Webseite pro Minute sein oder aber auch das gefangen sein in einer Schleife, die der Crawler selbst nicht unterbrechen kann.

2.5 Crawling-Richtlininen

Das Internet ist auf Grund seiner schieren Gr¨oße mit sch¨atzungsweise mindestens 55 Milliarden Webseiten [9] und der fortlaufende Ver¨anderung durch Hinzufugen,¨ Andern¨ und Entfernen von Inhalten grunds¨atzlich schwer vollst¨andig zu erfassen.

Die Verarbeitungsgeschwindigkeit hat sich dank effektiver Prozessoren mit immer mehr Rechenkernen und moderner Speichermedien wie Solid State Drives (SSDs) uber¨ Peripheral Component Interconnect Express (PCIe)-Interfaces zwar deutlich gesteigert, die Netzwerkgeschwindigkeit sollte in Deutschland zur Zeit jedoch noch als Flaschenhals betrachtet werden.[10]

Bereits 2001 merkte Edwards et al. an: Da die Bandbreite fur¨ die Durchfuhrung¨ ” von Crawls weder unbegrenzt noch kostenfrei ist, wird es immer wichtiger, das Web nicht nur skalierbar, sondern auch effizient zu crawlen, wenn ein vernunftiges¨ Maß an Qualit¨at oder Aktualit¨at aufrechterhalten werden soll.“[11]

Nach Carlos Castillo gibt es vier Richtlinien anhand derer man einen Crawler und sein Verhalten charakterisieren kann.[12] Diese werden im Folgenden dargestellt.

2.5.1 Selection Policy (Auswahlrichtlinie)

Auf Grund der Gr¨oße des Internets [9] kann ein Crawler in einem bestimmten Zeit- fenster nur einen Bruchteil der Webseiten herunterladen. Um aber nicht nur eine zuf¨allige Auswahl an Seiten zu erhalten, sondern m¨oglichst viele relevante, mussen¨ Maßnahmen zur Priorisierung von Webseiten ergriffen werden.

Im Folgenden werden die von Cho et al. dargelegten Priorisierungsmechanismen fur¨ eine Webseite p beschrieben.[13] Mit einem dieser Merkmale oder der Summe mehrerer kann die Relevanz I(p) einer Seite fur¨ den Crawler festgelegt werden.

17 Kapitel 2. Grundlegendes zu Webcrawlern

1. Ahnlichkeit¨ mit einer Anfrage Q: Hierbei wird die Ahnlichkeit¨ des Textes zwischen der Anfrage Q und der Seite p als IS(p) oder IS(p, Q) definiert, falls Q eine explizite Anfrage ist. Um Ahnlichkeit¨ festzustellen, wird jedes Doku-

ment (p oder Q) als ein n-dimensionaler Vektor hw1, . . . , wni aufgefasst. Der

Term wi stellt in diesem Vektor das i-te Wort im Vokabular dar. Wenn wi im

Dokument nicht enthalten ist, dann ist wi gleich Null. Wenn es vorkommt,

wird wi so gesetzt, dass es den Stellenwert des Wortes repr¨asentiert. Ein be- liebter Weg diesen Wert zu bestimmen ist das TF-IDF-Maß (TFIDF), welches das Produkt der relative Vorkommensh¨aufigkeit (TF)1 und der inversen Do- kumenth¨aufigkeit (IDF) ist.

#(w, D) TF (w, D) = 0 (2.1) maxt0∈D#(t ,D)

! ND IDF (w, D) = log (2.2) fw

TFIDF (w, D) = TFn(w, D) ∗ IDF (w, D) (2.3)

Hierbei ist w das Wort, D das Dokument, ND die Dokumentenanzahl im Kor-

pus und fw die H¨aufigkeit von w. Der Korpus besteht aus allen Webseiten des gesamten Internets. Da diese Korpusgr¨oße praktisch nicht erreichbar ist, wird IS0(p) als gesch¨atzer Wert definiert. Dieser kann beispielsweise mit bereits gecrawlten Seiten berechnet werden.

Sollte TFIDF nicht als Verfahren gew¨ahlt werden, kann die Ahnlichkeit¨ zwi- schen p und Q auch lokal durch die Kosinus-Ahnlichkeit¨ (vgl. Gleichung 2.4)

1DieTF wird verwendet um eine Verzerrung des Ergebnisses in langen Dokumenten zu verhindern. Die absolute Vorkommensh¨aufigkeit #(w, D) wird hierfur¨ durch die maximale H¨aufigkeit eines Terms in D geteilt.

18 Kapitel 2. Grundlegendes zu Webcrawlern

der beiden Vektoren bestimmt werden.

Pn p ∗ Q i=1(pi ∗ Qi) cos(θ) = = q q (2.4) kpkkQk Pn 2 Pn 2 i=1(pi) ∗ i=1(Qi)

2. Backlink Count: IB(p) ist die Anzahl der Links im Internet, die auf p zeigen. Je h¨oher dieser Wert, desto warscheinlicher ist eine hohe Relevanz. Praktisch kann IB(p) jedoch nicht genutzt werden, da die Summe aller Referenzierungen auf p im gesamten Internet nie ermittelbar ist. Deshalb wird meist auf IB0(p) ausgewichen, welches die Anzahl der Links zu p auf den bisher besuchten Seiten ist.

3. Page Rank: IB(p) behandelt alle gefundenen Links gleich. Ein Link zu Goo- gle wird also identisch wie der zu einer pers¨onlichen Homepage behandelt. Da die Webseite von Google aber eine h¨ohere Relevanz hat (h¨oheres IB(p)), wurde¨ es Sinn ergeben diesen Link besser zu bewerten. Das Page Rank Merk- mal IR(p) ermittel deshalb die Relevanz rekursiv uber¨ die gewichtete Summe aller Seiten, die einen Backlink zu p besitzen. Sollte nur ein Ausschnitt von Webseiten verfugbar¨ sein, wird IR0(p) genutzt.

Wenn eine Seite keine weiterfuhrenden¨ Links besitzt, wird formell davon aus- gegangen, dass diese Verlinkungen zu jeder Webseite besitzt. Außerdem wird

fur¨ p in Betracht gezogen, dass von den Seiten t1, . . . , tn auf sie gezeigt wird.

Die Anzahl der ausgehenden Links einer Seite ti sei ci. Hinzu kommt d als D¨ampfungsfaktor. Er gibt die Wahrscheinlichkeit an, mit welcher der Nutzer eine zuf¨allige nicht verknupfte¨ Webseite als n¨achstes besucht.

Die resultierende Formel fur¨ die Ermittlung von IR(p) lautet:

n X IR(ti) IR(p) = (1 − d) + d ∗ (2.5) i=0 ci

4. Forward Link Count: IF (p) ist die Anzahl der Links, die von p auf weitere Seiten fuhren.¨ Je h¨oher dieser Wert, desto wertvoller wird die Seite eingestuft, weil davon auszugehen ist, dass sie ein Webverzeichnis2 oder eine Sitemap ist.

2Ein Webverzeichnis (oder Webkatalog) ist eine thematisch sortierte Sammlung von Adressen von Webseiten.

19 Kapitel 2. Grundlegendes zu Webcrawlern

5. Location: IL(p) ist ein Merkmal, welches die Seite p anhand ihrer Verortung bewertet, nicht nach ihrem Inhalt. So kann zum Beispiel eine bestimmte Top- Level-Domain (TLD) oder ein bestimmter Internet Media Type (MIME-Type) als besonders wertvoll angesehen werden. Auch eine URL mit wenigen Schr¨ag- strichen oder mit einer besonderen beinhalteten Zeichenfolge kann eine Prio- risierung erhalten.

2.5.2 Re-Visit Policy (Richtlinie fur¨ erneuten Aufruf)

Da im Internet ein st¨andiger Inhaltswandel durch Hinzufugen,¨ Entfernen und Ver- ¨andern geschieht, ist es sehr wahrscheinlich, dass bereits gecrawlte Webseiten nach einer gewissen Zeit neue Inhalte bieten oder gar nicht mehr existieren. Von Junghoo Cho und Hector Garcia-Molina wurde hierbei der Begriff der Frische (freshness) und des Alters (age) einer Datenbank gepr¨agt. [14][15]

1. Freshness: Gegeben ist eine Datenbank D mit N Elementen he1, . . . , eni. Elemente, welche auf einem aktuellem Stand sind, werden als Menge M be- zeichnet. Da praktisch nie alle Elemente gleichzeitig aktuell gehalten werden k¨onnen, gilt M < N. Die Freshness F zu einem gewissen Zeitpunkt t kann also wie folgt definiert werden.

 1 wenn Datenbankelement ei zum Zeitpunkt t aktuell ist F (ei; t) = (2.6) 0 sonst

N 1 X F (D; t) = ∗ F (ei; t) (2.7) N i=1

Vereinfacht ausgedruckt:¨

F (D; t) = M/N (2.8)

2. Age: Das Alter A einer Datenbank D wird ¨ahnlich der Freshness definiert.

Diesmal jedoch mit Bezug auf den Zeitpunkt der Anderung¨ ti.

 0 wenn ei zum Zeitpunkt t aktuell ist A(ei; t) = (2.9) t − ti sonst

20 Kapitel 2. Grundlegendes zu Webcrawlern

N 1 X A(D; t) = ∗ A(ei; t) (2.10) N i=1

In Bild 2.2 ist ein beispielhafter Verlauf von F (ei; t) und A(ei; t) dargestellt. F (ei) f¨allt auf Null wenn das Element (die Webseite) im Netz ver¨andert, aber noch nicht wieder besucht wurde. Ab diesem Zeitpunkt steigt das Alter (Age) linear an. Wenn das Element synchronisiert wurde, geht die F (ei) zuruck¨ auf den Ausgangswert und

A(ei; t) f¨allt auf Null.

Wie jedoch wird nun eine lokale Datenbank von Webseiten am besten aktuell ge- halten? Fur¨ den Synchronisierungsprozess gibt es mehrere Parameter: Synchroni- sierungsfrequenz, -reihenfolge und -zeitpunkt. Diese werden im Folgenden beschrie- ben.

Die Synchronisierungsfrequenz gibt an wie oft die lokale Datenbank abgegli- chen werden soll. Je ¨ofter abgegelichen wird, desto aktueller wird sie sein. Hierbei sollte jedoch beachtet werden, dass ein kompletter Abgleich bei einer sehr großen Datenbank sehr lange dauern kann, da alle Elemente durchlaufen werden. Diese Form wird im Englischen ’uniform allocation policy’ genannt. Besser ist es einzelne Elemente, die sich h¨aufig ¨andern, ¨ofter zu synchronisieren und jene, die sich kaum ¨andern, mit einer geringen Frequenz (’non-uniform allocation policy’) zu synchroni- sieren.[15]

Der Synchronisierungszeitpunkt kann dabei helfen die Datenbank und die zu besuchenden Webseiten (Datenbankelemente) zu entlasten, indem Webseiten zum Beispiel nur zu einem definierten Zeitfenster geballt oder gleichm¨aßig uber¨ den Tag verteilt besucht werden.[15]

Die Synchronisierungsreihenfolge bestimmt die Abarbeitung der Einzelnen Elemente w¨ahrend eines Abgleichs. Dies kann auf drei unterschiedliche Weisen ge- schehen [15]:

1. In fixer Reihenfolge: Alle Elemente werden in der immer gleichen Abfolge und somit in einem definierten Intervall synchronisiert.

21 Kapitel 2. Grundlegendes zu Webcrawlern

Bild 2.2 Beispielhafter zeitlicher Verlauf von F (ei; t) und A(ei; t)

2. In zuf¨alliger Reihenfolge: Alle Elemente werden in einer zuf¨alligen Abfolge, aber jedoch immer in einem bestimmbaren Zeitfenster synchronisiert.

3. Komplett zuf¨allig: Zu jedem Zeitpunkt einer Synchronisierung wird ein willkurliches¨ Element der lokalen Datenbank ausgew¨ahlt und abgeglichen.

2.5.3 Politeness Policy (H¨oflichkeitsrichtlinie)

Ein Crawler stellt nicht nur Anforderungen an das Netzwerk, sondern auch zus¨atzliche Anforderungen an die Server. Abh¨angig von der H¨aufigkeit, mit der er Dokumente vom Server anfordert, kann dies zu einer betr¨achtlichen Belastung fuhren,¨ was zu einem niedrigeren Serviceniveau fur¨ andere Web-Nutzer fuhrt,¨ die auf den Server zugreifen. Insbesondere wenn der Host auch fur¨ andere Zwecke verwendet wird, ist dies nicht akzeptabel.[16]

Dieses Verhalten kann dann als DoS Attacke, oder im Falle eines verteilten Crawlers3

3Ein verteilter Crawler fuhrt¨ seine Download- und Parsing-Vorg¨ange auf einem Zusammenschluss unabh¨angiger Rechnern aus.

22 Kapitel 2. Grundlegendes zu Webcrawlern auch als Distributed Denial of Service (DDoS) Attacke, auf den Webserver gewertet werden.

Abhilfe schafft hier das in Kapitel 2.3 beschriebene Robots Exclusion Protocol (REP) mit dem Crawl-delay Parameter. Hierin schlug Koster zun¨achst vor: Her- unterladen eines Dokuments pro Minute oder sogar pro funf¨ Minuten.[17] Dies ist jedoch nicht mehr praktikabel, da es mitunter Domains mit mehreren tausend Seiten gibt.

Beispiel: Gegeben sei eine Domain mit 70000 Seiten und eine Verz¨ogerung von 60 (300) Sekunden. Das Herunterladen aller Seiten wurde¨ knapp 48 (243) Tage dauern.

Moderne Crawler nutzen meist eine Verz¨ogerung von zwei bis zwanzig Sekunden, da sowohl Server- als auch Netzwerkleistung seit dem Vorschlag Kosters im Jahre 1994 deutlich gestiegen sind.

2.5.4 Parallelization Policy (Parallelisierungsrichtlinie)

Ein Parallelcrawler fuhrt¨ mehrere Crawling Prozesse gleichzeitig aus, um eine m¨og- lichst hohe Downloadrate bei m¨oglichst kleinem Overhead (Verwaltungsdaten, die keine Nutzdaten sind) und Overlap (Anzahl an wiederholt aufgerufenen Seiten) zu erhalten. Die Herausforderung liegt hier bei der Interprozesskommunikation, da alle Prozesse untereinander bereits besuchte Seiten anzeigen mussen.¨

Nach Cho und Garcia-Molina sind zwei Zuweisungsarten praktikabel [18]:

1. Dynamische Zuweisung: hierbei teilt ein Koordinator das Netz in kleine Partitionen und weist diese dynamisch einzelnen Prozessen zu. Er sendet al- le bereits bekannten URLs, die zu jener Partition geh¨oren, als Start-Set an den Prozess. Dieser l¨adt alle Seiten herunter und verfolgt Links, die in sei- ner zugewiesen Partition liegen. Findet er einen Link, der außerhalb seiner Zust¨andigkeit liegt, sendet er diesen an den Koordinator. Der Koordinator ordnet den Link einer passenden Partition zur weiteren Verarbeitung zu.

2. Statische Zuweisung: Bevor ein Crawl gestartet wird, werden Webpartitio- nen angelegt und den einzelnen Prozessen zugewiesen. Dabei ist jedem Pro- zess bekannt, welche Partition die anderen Prozesse bedienen. So kann der Austausch direkt zwischen den Prozessen geschehen und ein Koordinator ist uberfl¨ ussig.¨

23 Kapitel 2. Grundlegendes zu Webcrawlern

2.6 Maßnahmen gegen Crawler

Es gibt viele Maßnahmen mit unterschiedlichsten Ans¨atzen um Crawling und Scra- ping auf Webseiten zu unterbinden. Sie sollen es Skripten und Maschinen erschweren auf Daten zuzugreifen, jedoch nicht Suchmaschinen und echten Benutzern. Viele der Maßnahmen basieren auf der Analyse von Log-Dateien und der Beobachtung des Verkehrs zwischen Client und Server. Crawler, welche mit Bedacht geschrieben wurden und h¨oflich“ sind, k¨onnen einen Großteil der im Folgenen beschriebenen ” Methoden umgehen.

2.6.1 Prufung¨ der HTTP Request Header

Das User-Agent Feld sollte in jeder Anfrage ubermittelt¨ werden, es sei denn der User-Agent ist speziell so konfiguriert, dass er dies nicht tut.[19] Regul¨are Webbrow- ser senden dieses Feld fur¨ gew¨ohnlich immer mit ihrem Namen und der Versionsnum- mer.[20][21][22] Wenn dieses Feld nicht gesendet wurde oder einem gew¨ohnlich von Crawling Werkzeugen gesendetem entspricht, sollte der Zugriff durch eine Captcha- Abfrage blockiert oder zumindest limitiert werden.

Das Referer Feld beinhaltet die URL der vorherigen Seite, von der aus dem Link gefolgt wurde. Sollte dieses Feld leer oder wiederkehrend mit dem gleichen Inhalt gefullt¨ sein, ist davon auszugehen, dass die jeweiligen Anfragen von einem unprofes- sionell geschrieben Crawler stammen. Ein leeres Referer Feld kann aber auch durch normales Nutzerverhalten auftreten und sollte deshalb nicht automatisch blockiert werden. So darf ein User-Agent kein Referer Header Feld in einer ungesicherten HTTP-Anfrage senden, wenn die verweisende Seite mit einem sicheren Protokoll empfangen wurde.[19]

2.6.2 Blockieren vonIP-Adressen

Ein IP-Bann lehnt alle Anfragen einerIP-Adresse oder einer ganze Reihe vonIP- Adressen ab. Der Bann soll den Server vor missbrauchenden Anfragen von auff¨alligen IP-Adressen schutzen¨ und sollte bestenfalls automatisiert bei Auff¨alligkeiten in den Log-Dateien ausgesprochen werden.

24 Kapitel 2. Grundlegendes zu Webcrawlern

Captcha-Abfragen im Vordergrund [23] oder passiv w¨ahrend der Seitennutzung [24] k¨onnen automatisiertes Ausfullen¨ von Formularen verhindern oder, bei Zweifeln, Klarheit daruber¨ schaffen, ob es sich um einen realen Nutzer handelt.

2.6.3 Inhaltslose Gestaltung von Fehlermeldungen

Wenn Crawler blockiert oder anderweitig limitiert werden, sollten keine erl¨auternden Hinweise gegeben werden, um den Entwicklern des Crawlers die Anpassung zu er- schweren. Statt Too many requests from your IP address, please try again later.“ ” oder Error, User Agent header not present!“ sollte eine ebenfalls realnutzerfreund- ” liche Nachricht wie Sorry, something went wrong. You can contact support via ” [email protected], should the problem persist.“ angezeigt werden.[25]

2.6.4 Honeypot Fallen

Eine Honeypot Falle soll Crawler von echten Daten ablenken, indem fur¨ den norma- len Webseitenbesucher unsichtbare Links und Daten bereit gestellt werden. Dies ge- schieht meist indem der Inhalt von einem Block mit dem CSS-Attribut display:none gerahmt wird. Sollte einer dieser versteckten Links vom Crawler besucht werden, k¨onnen direkt Gegenmaßnahmen getroffen werden (zum Beispiel ein IP-Bann oder eine Captcha-Abfrage). Die falschen Daten machen das Crawlergebnis unbrauch- bar.[25][26]

2.6.5 Regelm¨aßiges Andern¨ des HTML Code

Mit Anderungen¨ im HTML Code der Seite k¨onnen die CSS- oder xPath-Selektoren des Scrapers unbrauchbar gemacht werden. Zus¨atzlich kann der alte HTML-Code mit kleinen Anpassungen als Honeypot Falle genutzt werden.

2.6.6 Verstecken von Inhalten

Eine Registrierung mit anschließendem Login wird genutzt, um Webseiten- inhalte vor nicht fokusierten Crawlern4 zu schutzen.¨ Das Verhalten von Accounts kann besser uberwacht¨ werden, als das von sich st¨andig wechselndenIP-Adressen.

4Fokusierte Crawler sind auf das Durchlaufen und Extahieren von Daten einer bestimmten Web- seite spezialisiert.

25 Kapitel 2. Grundlegendes zu Webcrawlern

Sollte ein Account durch crawler¨ahnliches Verhalten auffallen (zum Beispiel: viele Suchanfragen in sehr schneller Abfolge), kann dieser gezielt behandelt werden.

Das Nachladen von Inhalten per Ajax oder JavaScript nachdem das HTML der Seite geladen wurde, macht es Crawlern, die kein JavaScript ausfuhren,¨ unm¨oglich diese Inhalte zu indexieren.

Text in Bildern zu maskieren ist eine sehr drastische Maßnahme, da sie nicht nur Crawler vom Inhalt ausschließt, sondern auch Assistenzsysteme wie Screenrea- der fur¨ Blinde. Außerdem wird dem allgemeinen Nutzer das Copy-Paste-Verfahren verweigert.

2.7 Nutzung von Crawlern

Der Einsatzbereich von Crawlern strecken sich uber¨ ein weites Anwendungsfeld.

Suchmaschinen indexieren zwar prim¨ar Webseiten und deren Inhalte, jedoch spielt das Thema Webgraphing mittlerweile ebenfalls eine große Rolle. Hierbei tritt nicht mehr der Inhalt einer Webseite, sondern die Verortung im Internet in den Vorder- grund. Nach und nach l¨asst sich so eine Karte mit allen Verlinkungen von Webseiten, seien es hinfuhrende¨ oder ausgehende, erstellen. Dies kann zum einen einer besseren Berechnung des Page Rank dienen, zum anderen aber auch bei der Clusterbildung von Webseiten helfen, um zum Beispiel thematisch ¨ahnliche Seiten fur¨ eine spezia- lisierte Suchmaschine zu gruppieren.

Da das Internet einem stetigen Inhaltswandel unterliegt, haben sich seit Anbeginn Initativen gegrundet,¨ die gewisse St¨ande wichtiger Webseiten und Beitr¨age archivie- ren und so der Nachwelt“ erhalten, die sonst m¨oglicherweise schon nach Minuten ” nicht mehr erreichbar sind. Hierfur¨ werden Crawler eingesetzt, die Schnappschusse¨ (engl. Snapshots) von als besonders wichtig erachteten Webseiten und Beitr¨agen er- stellen. Dabei werden nicht nur die Verlinkungen gespeichert, sondern die komplette Webseite mitsamt aller enthaltenen Daten. Das wohl prominenteste Beispiel hierfur¨ ist ‘The Internet Archive’ mit rund 475 Milliarden Webseiten, 28 Millionen Buchern¨ und Texten, 14 Millionen Audioaufzeichnungen, 6 Millionen Videos, 3,5 Millionen Bildern und 580000 Softwareprogrammen.[27]

26 Kapitel 2. Grundlegendes zu Webcrawlern

Crawler k¨onnen aber auch zur Suchmaschinenoptimierung der eigenen Webseite oder Schwachstellenfindung genutzt werden. Zun¨achst ermittelt ein Crawler alle URLs der Webseite und pruft¨ diese anschließend auf Schwachstellen oder auf die Sichtbarkeit fur¨ Suchmaschinen.

27 Kapitel 3. Eigenschaften des optimalen Crawlers

3 Eigenschaften des optimalen Crawlers

Mit den im vorangegangenen Kapitel beschriebenen Grundlagen wird in diesem Kapitel das K¨onnen und Verhalten eines optimalen Crawlers konzipiert.

3.1 Robuste Extraktion von Links

Das Ziel von Crawlern ist in der Regel die Indexierung des Internets. Hierfur¨ werden nur die Verlinkungen auf einer Seite ben¨otigt, um im Schneeballsystem die Inde- xierung voranzutreiben. Die Extraktion von Verlinkungen kann relativ einfach mit der Suche nach den href -Attributen und der anschließenden Uberpr¨ ufung¨ auf die Merkmale einer URL realisiert werden. Diese Uberpr¨ ufung¨ ist wichtig, da ein href - Attribut auch ein mailto: enthalten oder die Verlinkung auf ein JavaScript- oder eine CSS-Datei sein kann. Außerdem sollten Abschnitte im HTML-Code, die mit dem CSS-Attribut display:none versehen sind, gemieden werden, um nicht in Honeypot-Fallen (vgl. Kapitel 2.6.4) zu geraten.

3.2 Datenbank und Datenexport

Im Hintergrund des Crawlers soll mindestens eine Datenbank laufen, in der bereits besuchte Webseiten und deren Inhalte abgelegt werden k¨onnen. Außerdem sollte das Crawlingergebnis exportierbar sein, um eine Auswertung zu erm¨oglichen. Dies kann uber¨ die Datenbank oder verschiedene Datenformate (z.B. csv) erm¨oglicht werden.

3.3 Ausfuhren¨ von JavaScript

Da immer mehr Webseiten mit Frameworks wie React, Angular und Vue gestaltet werden, die JavaScript nutzen um Inhalte zu laden, muss der Crawler JavaScript

28 Kapitel 3. Eigenschaften des optimalen Crawlers ausfuhren¨ k¨onnen. Dies geschieht zumeist mit Hilfe eines headless Webbrowsers5.

3.4 Anwendung des REP

Das REP sollte respektiert werden. Die Dateigr¨oße von robots.txt ist vor dem Abgleich mit einer URL zu prufen,¨ um DoS-Attacken auf den Crawler zu verhindern (vgl. Kapitel 2.3.3).

3.5 Passende Request Header

Der Crawler soll eigene und nach RCF7231 [19] konforme Inhalte in den Request- Header-Feldern From , Referer (sic) und User-Agent senden.

3.6 Richtlinienanwendung

Die bereits beschriebenen Richtlinien zu Seitenauswahl, erneutem Besuch einer Seite, H¨oflichkeit w¨ahrend eines Crawls und zur Parallelisierung sollen in einer Mischform umgesetzt werden.

3.7 Skalierbarkeit

Der Crawler sollte skalierbar sein, sodass durch Hinzufugen¨ von Ressourcen (Re- chenleistung, Bandbreite) die Aufgabenabarbeitung schneller vonstattengeht. Hier- zu geh¨ort auch die F¨ahigkeit, das Crawlen und Parsen auf verteilten Maschinen durchzufuhren.¨ Außerdem fließt an diesem Punkt die Erweiterbarkeit (Modularit¨at) des Crawlers ein.

5Ein headless Webbrowser, ist ein Browser, der ohne GUI ausgefuhrt¨ wird.

29 Kapitel 3. Eigenschaften des optimalen Crawlers

3.8 Umgehen eines Banns durch Adminstratoren

Zun¨achst muss durch die H¨oflichkeitsrichtlinie gew¨ahrleistet werden, dass keine Uber-¨ lastung des Zielservers stattfindet. Um trotzdem nicht durch zu viele Anfragen von nur einerIP-Adresse aufzufallen, sollten ein oder mehrere Proxy-Server genutzt wer- den.

30 Kapitel 4. Bewertungsschema

4 Bewertungsschema

Das Ziel der Bachelor Thesis ist ein Vergleich von drei aktuellen Web-Crawling- Werkzeugen hinsichtlich ihrer Funktionsweise und Ergebnisse. Um diese ermitteln zu k¨onnen, werden in diesem Kapitel, mit Bezug auf Kapitel3, Bewertungskriterien erarbeitet.

Die im Folgenden genannten Punkte werden in Schulnoten (eins bis sechs) bewertet. Die Bewertung erfolgt auf Basis der jeweiligen Dokumentation. Sollte ein Bewer- tungskriterium in der Dokumentation keine Erw¨ahnung finden, wird davon ausge- gangen, dass es nicht vorhanden ist und mit der Note 6 bewertet.

Die Gesamtnote eines Werkzeuges ergibt sich aus dem Notendurchschnitt der Be- wertungskriterien.

4.1 Datenextraktionsmechanismen

Dieser Bewertungspunkt beurteilt die Auswahl an Mechanismen zur Datenextrakti- on. Mechanismen k¨onnen zum Beispiel CSS-Selectoren, Xpath-Selektoren, Regul¨are Ausdrucke¨ oder Ahnliches¨ sein. Die Note 1 wird vergeben, wenn das Framework darauf spezialisiert ist URLs aus dem HTML-Code einer Webseite zu extrahieren.

Note Vorraussetzung 1 spezialisiert auf URLs 2 vier oder mehr Mechanismen 3 drei Mechanismen 4 zwei Mechanismen 5 ein Mechanismus 6 kein Mechanismus

Tabelle 4.1 Bewertung der Datenextraktionsmechanismen

31 Kapitel 4. Bewertungsschema

4.2 Datenbankanbindung

Dieser Bewertungspunkt betrachtet die Auswahl an m¨oglichen Datenbankanbindun- gen. Je mehr Datenbankanbindungen, desto besser, da dem Nutzer so erm¨oglicht wird, das fur¨ sein Anwendungsfeld best geeignetste Datenbanksystem zu w¨ahlen.

Note Vorraussetzung 1 acht oder mehr zur Auswahl 2 sechs oder sieben zur Auswahl 3 vier oder funf¨ zur Auswahl 4 zwei oder drei zur Auswahl 5 eine relationale oder NoSQL 6 keine integrierte Unterstutzung¨

Tabelle 4.2 Bewertung der Datenbankanbindung

4.3 JavaScript Unterstutzung¨

Mehr und mehr Webseiten werden mit JavaScript Frameworks wie React, Angular, Vue.js und Node.js programmiert. Diese Webseiten besitzen initial nur einen mini- malen HTML-Code und laden ihre Inhalte per JavaScript nach. Um dieses Nach- laden auch fur¨ Crawler zu erm¨oglichen wird ein Headless Browser oder JavaScript Rendering Service ben¨otigt.

Note Vorraussetzung 1 integrierter Headless Browser und JavaScript Parser 2 integrierter Headless Browser oder JavaScript Rendering Service, und integrierter JavaScript Parser 3 unterstutzt¨ externen Headless Browser, JavaScript Rendering Service oder JavaScript Parser 4 unterstutzt¨ nur externe JavaScript Rendering Services 5 unterstutzt¨ nur externe JavaScript Parser 6 keinerlei Unterstutzung¨ von JavaScript

Tabelle 4.3 Bewertung der JavaScript Unterstutzung¨

32 Kapitel 4. Bewertungsschema

4.4 Datenexport

Es sollte eine Exportfunktion fur¨ die gesammelten Daten zur weiteren Verarbei- tung geben. Je mehr Dateiformate, die mit g¨angigen frei zug¨anglichen Programmen gelesen werden k¨onnen, das Werkzeug unterstutzt,¨ desto besser.

Note Vorraussetzung 1 in sechs oder mehr lesbare Formate 2 in drei bis funf¨ lesbare Formate 3 in ein oder zwei lesbare Formate 4 uber¨ eine angebundene Datenbank 5 nur in propriet¨are Formate 6 keine Exportfunktion

Tabelle 4.4 Bewertung der Exportfunktion

4.5 Anwendung des Robots Exclusion Protocol

Ein Crawling Framework erkennt und uberpfr¨ uft¨ im besten Fall sowohl robots.txt, als auch die betreffenden META Tags erkennen und uberpr¨ ufen.¨ Außerdem soll dem Programmierer die Wahl uberlassen¨ werden, ob sein Crawler das REP ignoriert oder respektiert. Des weiteren wird bewertet, ob g¨angige, jedoch nicht standartisierte Erweiterungen des REP (Crawl-Delay und Sitemap) unterstutzt¨ werden.

Note Vorraussetzung 1 unterstutzt¨ und uberpr¨ uft¨ robots.txt und META Tags; unterstutzt¨ nicht standardisierte Erweiterungen; bietet die Auswahl REP zu respektieren oder zu missachten 2 uberpr¨ uft¨ robots.txt; unterstutzt¨ nicht standardisierte Erweiterungen; bietet die Auswahl REP zu respektieren oder zu missachten 3 unterstutzt¨ nicht standardisierte Erweiterungen; Auswahl REP zu respektieren oder zu missachten 4 Auswahl REP zu respektieren oder zu missachten 5 respektiert das REP 6 ignoriert das REP

Tabelle 4.5 Bewertung der Nutzung des REP

33 Kapitel 4. Bewertungsschema

4.6 Request Header Anpassung

Um den Crawler unauff¨alliger fur¨ Webseitenbetreiber zu gestalten, ist die Anpassung von HTTP-Header-Feldern essentiell. Besonders wichtig sind hierbei die Felder User- Agent, Referer und From.

Note Vorraussetzung 1 Anpassung aller Header Inhalte m¨oglich 2 Anpassung der Felder From, Referer und User-Agent 3 nur Anpassung der Felder User-Agent und Referer 4 nur Anpassung des User-Agent-Feldes 5 nur Anpassung des From-Feldes 6 keine Anpassung m¨oglich

Tabelle 4.6 Bewertung der Request Header Anpassung

4.7 Integrierte Crawling-Richtlinien

Mit diesem Bewertungskriterium wird die Anzahl von Crawling-Richtlinien, welche bereits ausw¨ahlbar im zu bewertenden Werkzeug integriert sind und nicht selbst programmiert werden mussen,¨ benotet.

Note Vorraussetzung 1 funf¨ oder mehr 2 vier 3 drei 4 zwei 5 eine 6 keine

Tabelle 4.7 Bewertung der integrierten Crawling-Richtlinien

34 Kapitel 4. Bewertungsschema

4.8 Skalierbarkeit

Hier wird bewertet, wie sich das Framework skalieren l¨asst. Es sollte zun¨achst durch den Nutzer mit eigenem Code erweiterbar sein. Außerdem ist es von Vorteil wenn die Leistung des Frameworks durch das Einbinden zus¨atzlicher Rechenressourcen skaliert. Die Verteilbarkeit ist letztlich die Kr¨onung der Skalierbarkeit.

Note Vorraussetzung 1 verteilbar, skalierbar und erweiterbar 2 verteilbar und skalierbar, aber nicht erweiterbar 3 skalierbar und erweiterbar, aber nicht verteilbar 4 skalierbar, aber nicht erweiterbar oder verteilbar 5 erweiterbar, aber nicht skalierbar oder verteilbar 6 nicht skalierbar, erweiterbar oder verteilbar

Tabelle 4.8 Bewertung des verteilten bzw. parallelen Crawlings

4.9 Proxyserverunterstutzung¨

Die Unterstutzung¨ von Proxyservern ist entscheidend, um einemIP-Bann durch den Webseitenbetreiber entgegen zu wirken. In diesem Punkt wird daher die Art des verwendbaren Proxy bewertet.

Note Vorraussetzung 1 integrierter Pool von wechselnden Proxyservern 2 Proxyserveranbindung durch kostenloses Plugin oder Zusatzbibliothek 3 kostenlose Proxyserveranbindung nur durch externen Dienstleister 4 Proxyserveranbindung mit kostenpflichtigem Plugin oder Zusatzbibliothek 5 kostenpflichtige Proxyserveranbindung durch externen Dienstleister 6 keine Unterstutzung¨ von Proxyservern

Tabelle 4.9 Bewertung der Proxyserverunterstutzung¨

35 Kapitel 5. Bewertung der vorausgew¨ahlten Tools

5 Bewertung der vorausgew¨ahlten Tools

In diesem Kapitel werden zun¨achst Einschr¨ankungen fur¨ die Auswahl der zu bewer- tenden Werkzeugen getroffen. Entsprechend den Bewertungskriterien aus Kapitel4 werden fur¨ jedes betrachtete Tool die Einzelnoten addiert, sodass die unterschiedli- chen Frameworks auf Basis der Gesamtnote sortiert werden k¨onnen. In einem weite- ren Schritt werden den Bewertungskriterien Gewichtungen zugeteilt, wodurch sich die Gesamtnoten ¨andern und somit auch die Reihenfolge der Tools. Auf die Beno- tung der drei am besten bewerteten Werkzeuge wird anschließend eingegangen und abschließend findet eine Ergebnisanalyse statt.

5.1 Einschr¨ankungen

Zun¨achst wurde in einer Recherche nach Frameworks, Bibliotheken und Services gesucht, die Webcrawling als Aufgabe haben. Ergebnis war ein Liste von 111 Werk- zeugen zum Crawlen und Scrapen von Webseiten (vgl. Tabelle A.1).

Um in diese Anzahl fur¨ die weiteren Betrachtung einzuschr¨anken, muss das jeweilige Werkzeug den folgenen Punkten genugen,¨ um in die engere Auswahl aufgenommen zu werden:

1. Letztes Release oder Update nicht vor dem 01.01.2019

2. Quellcode und Dokumentation frei zug¨anglich

3. Dokumentation auf Englisch oder Deutsch

Das Ergebnis der Vorauswahl ist die Liste von Werkzeugen, welche in Tabelle 5.1 festgehalten ist.

36 Kapitel 5. Bewertung der vorausgew¨ahlten Tools

# Tool 1 Abot 2 AbotX 3 ACHE Crawler 4 Apache Nutch 5 BUbiNG 6 Colly 7 Crawler4j 8 Dom-crawler 9 10 GNU WGET 11 Grab 12 Heritrix 13 Icrawler 14 Jaunt 15 Kimurai 16 Node-osmosis 17 Norconex HTTP Collector 18 OpenSearchServer 19 Php-spider 20 Rvest 21 Scrapy 22 Simplecrawler 23 Spatie / Crawler 24 StormCrawler 25 Supercrawler 26 Webster 27 X-ray 28 yacy

Tabelle 5.1 Tools der engeren Auswahl

37 Kapitel 5. Bewertung der vorausgew¨ahlten Tools

5.2 Ungewichtete Bewertung

Die Benotung der Tools anhand der Bewertungskriterien aus Kapitel4 ist in Tabelle 5.2 dargestellt.

utzung¨ utzung¨

# Tool DatenextraktionsmechanismenDatenbankanbindungDatenexportJavaScriptAnwendung UnterstRequest desintegrierte Header REPSkalierbarkeit Anpassung Crawling-RichtlinienProxyserverunterstGesamtnote 1 Scrapy 1 1 1 3 2 1 1 1 2 1,4 2 Apache Nutch 1 1 4 3 1 4 1 1 2 2,0 3 StormCrawler 1 6 4 3 1 1 3 1 2 2,4 4 OpenSearchServer 1 5 3 3 2 4 3 1 2 2,7 5 Frontera 1 1 3 6 5 4 2 1 2 2,8 6 Supercrawler 1 4 2 6 2 1 4 3 2 2,8 7 BUbiNG 1 5 4 6 2 2 4 1 2 3,0 8 Norconex HTTP Collector 1 3 4 3 1 4 2 3 6 3,0 9 yacy 1 4 4 6 4 4 1 1 2 3,0 10 Heritrix 1 5 3 6 2 4 4 3 2 3,3 11 Colly 1 2 6 6 4 3 6 2 2 3,6 12 Spatie / Crawler 1 6 6 2 3 1 5 6 2 3,6 13 Kimurai 5 1 4 3 6 4 5 3 2 3,7 14 Crawler4j 1 4 4 6 6 4 5 2 2 3,8 15 ACHE Crawler 4 5 2 6 6 4 4 2 2 3,9 16 Webster 5 6 6 1 6 4 5 1 2 4,0 17 AbotX 5 6 6 3 1 5 3 3 6 4,2 18 Simplecrawler 4 6 6 6 4 3 4 3 2 4,2 19 X-ray 5 6 6 3 6 1 2 3 6 4,2 20 Node-osmosis 2 6 6 6 6 1 6 5 2 4,4 21 GNU WGET 6 6 6 6 3 1 6 4 2 4,4 22 Jaunt 5 6 6 6 6 1 4 4 2 4,4 23 Grab 4 6 3 6 6 3 6 5 2 4,6 24 Icrawler 5 6 4 6 6 6 6 3 1 4,8 25 Abot 5 6 6 6 1 4 4 5 6 4,8 26 Php-spider 3 6 3 6 6 6 5 3 6 4,9 27 Rvest 5 6 6 6 6 6 6 4 2 5,2 28 Dom-crawler 4 6 6 6 6 6 6 4 6 5,6

Durchschnittsnote 2,9 4,7 4,4 4,8 3,9 3,3 4,0 2,8 2,8 3,74

Tabelle 5.2 Tools der engeren Auswahl sortiert nach ungewichteter Gesamtnote

Hier erhielten die drei Tools Scrapy, Apache Nutch und StormCrawler die besten Gesamtnoten.

38 Kapitel 5. Bewertung der vorausgew¨ahlten Tools

Bild 5.1 visualisiert die Verteilung der kaufm¨annisch auf Ganzzahlen gerundeten Gesamtnoten. Auff¨allig hierbei ist, dass die Noten 3 und 4 besonders h¨aufig auftreten und die durchschnittliche Gesamtnote mit 3,74 ebenfalls in diesem Rahmen liegt.

14 12 10 8

Anzahl 6 4 2 0 1 2 3 4 5 6 Note

Bild 5.1 Notenverteilung der ungewichteten Bewertung

5.3 Gewichtung der Bewertungskriterien

Den in Kapitel4 beschrieben Bewertungskriterien werden in diesem Kapitel Ge- wichtungen zugeteilt. Dies geschieht, um besonders wichtige Punkte wie Datenex- traktion, die Unterstutzung¨ von JavaScript und die Skalierbarkeit in der Bewertung hervorzuheben. Gleichzeitig wird den Punkten Datenexport und integrierte Craw- ling Richtlinien eine geringere Bedeutung zugesprochen. Dies begrundet¨ sich durch die Realisierbarkeit des Datenexports uber¨ die verwendete Datenbank und die rela- tiv einfache Programmierbarkeit von eigene Crawling Richtlinien. Die Gewichtung der einzelnen Kriterien ist in Tabelle 5.3 dargestellt.

39 Kapitel 5. Bewertung der vorausgew¨ahlten Tools

Gewichtung Datenextraktionsmechanismen 15 % JavaScript Unterstutzung¨ 15 % Skalierbarkeit 15 % Datenbankanbindung 10 % Anwendung des REP 10 % Request Header Anpassung 10 % Proxyserverunterstutzung¨ 10 % integrierte Crawling Richtlinien 8 % Datenexport 7 %

Tabelle 5.3 Gewichtung der Bewertungskriterien

5.4 Gewichtete Bewertung

Durch die Wichtung der Bewertungskriterien ¨andert sich die Sortierung anhand der Gesamtnote jedoch nur geringfugig.¨ Crawler4j, Webster und Php-spider steigen jeweils einen Platz auf. Die Tools Kimurai, ACHE Crawler und Abot steigen jeweils einen Platz ab. Die neue Rangfolge ist in Tabelle 5.4 dargestellt. Hierbei f¨allt auf, dass nur ein Viertel der Werkzeuge (7 aus 28) durch die Gewichtung eine schlechtere Gesamtnote erzielt. 14 12 10 8

Anzahl 6 4 2 0 1 2 3 4 5 6 Note

Bild 5.2 Notenverteilung der gewichteten Bewertung

Die vergebenen Noten werden gerundet und gruppiert. Die Notenverteilung ist in Bild 5.2 visualisiert. Im Vergleich mit Bild 5.1 ist eine deutlich flachere Kurve zu

40 Kapitel 5. Bewertung der vorausgew¨ahlten Tools sehen, da die Noten 3 und 4 nun gleich h¨aufig auftreten und die Note 5 ebenfalls einen Zugewinn zu verzeichnen hat.

utzung¨ utzung¨

# Tool DatenextraktionsmechanismenDatenbankanbindungDatenexportJavasSriptAnwendung UnterstRequest desintegrierte Header REPSkalierbarkeit Anpassung Crawling-RichtlinienProxyserverunterstGesamtnoteGesamtnote ungewichtetDifferenz gewichtet 1 Scrapy 1 1 1 3 2 1 1 1 2 1,44 1,50 -0,06 2 Apache Nutch 1 1 4 3 1 4 1 1 2 2,00 1,91 0,09 3 StormCrawler 1 6 4 3 1 1 3 1 2 2,44 2,27 0,17 4 OpenSearchServer 1 5 3 3 2 4 3 1 2 2,67 2,50 0,17 5 Frontera 1 1 3 6 5 4 2 1 2 2,78 2,77 0,01 6 Supercrawler 1 4 2 6 2 1 4 3 2 2,78 2,86 -0,08 7 Norconex HTTP Collector 1 3 4 3 1 4 2 3 6 3,00 2,89 0,11 8 BUbiNG 1 5 4 6 2 2 4 1 2 3,00 2,90 0,10 9 yacy 1 4 4 6 4 4 1 1 2 3,00 2,96 0,04 10 Heritrix 1 5 3 6 2 4 4 3 2 3,33 3,33 0,00 11 Colly 1 2 6 6 4 3 6 2 2 3,56 3,35 0,21 12 Spatie / Crawler 1 6 6 2 3 1 5 6 2 3,56 3,37 0,19 13 (↑ 1) Crawler4j 1 4 4 6 6 4 5 2 2 3,78 3,63 0,15 14 (↓ 1) Kimurai 5 1 4 3 6 4 5 3 2 3,67 3,63 0,04 15 (↑ 1) Webster 5 6 6 1 6 4 5 1 2 4,00 3,67 0,33 16 (↓ 1) ACHE Crawler 4 5 2 6 6 4 4 2 2 3,89 3,96 -0,07 17 AbotX 5 6 6 3 1 5 3 3 6 4,22 4,11 0,11 18 X-ray 5 6 6 3 6 1 2 3 6 4,22 4,13 0,09 19 Simplecrawler 4 6 6 6 4 3 4 3 2 4,22 4,19 0,03 20 Node-osmosis 2 6 6 6 6 1 6 5 2 4,44 4,35 0,09 21 Jaunt 5 6 6 6 6 1 4 4 2 4,44 4,49 -0,05 22 GNU WGET 6 6 6 6 3 1 6 4 2 4,44 4,50 -0,06 23 Grab 4 6 3 6 6 3 6 5 2 4,56 4,64 -0,08 24 Icrawler 5 6 4 6 6 6 6 3 1 4,78 4,76 0,02 25 (↑ 1 ) Php-spider 3 6 3 6 6 6 5 3 6 4,89 4,81 0,08 26 (↓ 1) Abot 5 6 6 6 1 4 4 5 6 4,78 4,84 -0,06 27 Rvest 5 6 6 6 6 6 6 4 2 5,22 5,15 0,07 28 Dom-crawler 4 6 6 6 6 6 6 4 6 5,56 5,40 0,16

Durchschnitt 2,9 4,7 4,4 4,8 3,9 3,3 4,0 2,8 2,8 3,74 3,67 0,06

Tabelle 5.4 Tools der engeren Auswahl sortiert nach gewichteter Gesamtnote

41 Kapitel 5. Bewertung der vorausgew¨ahlten Tools

5.5 Erl¨auterung der Notenvergabe bei Scrapy, Apache Nutch und Stormcrawler

Nachdem sowohl in der ungewichteten, als auch in der gewichteten Bewertung Scra- py, Apache Nutch und StormCrawler die drei Werkzeuge mit der besten Gesamtnote sind, erfolgt in diesem Kapitel eine Erl¨auterung der vergebenen Noten.

5.5.1 Scrapy

Als Quelle der Dokumentation dient der Master-Branch des Github-Repository von Scrapy. Nach dessem Klonen wird im Verzeichnis ./docs der Befehl make latex ausgefuhrt,¨ welcher die Dokumentation als LaTeX-Datei baut und im Verzeich- nis ./build/latex ablegt. Anschließend muss in diesem Verzeichnis der Befehl make all-pdf ausgefuhrt¨ werden. Ergebnis ist die pdf-Datei der Dokumentation [28], auf welches sich die Kapitel- und Seitenzahlen in den folgenden Unterpunkten beziehen.

Datenextraktionsmechanismen In Dokumentationskapitel 3.10.1 wird der LxmlLinkExtractor als Linkextraktor empfohlen, da er auf dem robusten HTML- Parser von lxml basiert. Da dies ein spezialisierter Linkextraktor ist, wurde die Note 1 vergeben.

Datenbankanbindung In Dokumentationskapitel 3.7 wird erkl¨art, dass uber¨ ein Objekt von Typ ItemAdapter Daten in eine Datenbank abgelegt werden k¨onnen. Dies ist fur¨ alle g¨angigen Datenbanksysteme realisierbar. Aus diesem Grund wurde die Note 1 vergeben.

Datenexport Das Dokumentationskapitel 3.8.1 listet sechs Formate (JSON, JSON lines, CSV, XML, Pickle, Marshal) auf und erw¨ahnt, dass uber¨ FEED EXPORTERS weitere Formate hinzugefugt¨ werden k¨onnen. Deshalb wurde dieses Bewertungskri- terium mit 1 benotet.

42 Kapitel 5. Bewertung der vorausgew¨ahlten Tools

JavaScript Unterstutzung¨ Die Dokumentationskapitel 5.7.6 und 5.7.7 fuhren¨ die Integration des Rendering Services Splash und des Headless Browsers Selenium ein. Da es sich bei beiden um externe Programme handelt, wurde hierfur¨ die Note 3 vergeben.

Anwendung des Robots Exclusion Protocol (REP) Dieses Bewertungskrite- rum wurde mit Note 2 gewertet, da mit dem Einstellungsparameter ROBOTSTXT OBEY (vgl. Seite 116 der Dokumentation) angegeben werden kann, ob der Crawler sich dem REP unterwerfen soll. Außerdem ist der standardm¨aßig verwendete robots.txt- Parser Protego (vgl. Seite 205 der Dokumentation).

Request Header Anpassung Alle Felder des Request-Headers k¨onnen uber¨ den Einstellungsparameter DEFAULT REQUEST HEADERS angepasst werden (vgl. Seite 104 der Dokumentation). Aus diesem Grund wurde die Note 1 vergeben.

Integrierte Crawling-Richtlinien Scrapy besitzt funf¨ integrierte anwendbare Crawling-Richtlinien. Diese sind durch die AutoThrottle Erweiterung (vgl. Doku- mentationskapitel 5.11), der dynamischen Zuweisung bei Parallelisierung uber¨ Twis- ted (vgl. Seite 8 der Dokumentation), der statischen Zuweisung bei Parallelisierung (vgl. Dokumentationskapitel 5.4.3) und den Ans¨atzen Depth First“ und Broad ” ” First“ realisiert. Aus diesem Grund wurde die Note 1 vergeben.

Skalierbarkeit Fur¨ dieses Bewertungskriterium wurde ebenfalls die Note 1 ver- geben, da Scrapy laut Dokumentation hochgradig durch Plug-Ins und seine Anwen- dungsschnittstelle (API) erweiterbar ist (vgl. Seite 7 der Dokumentation). Außerdem k¨onnen mehrere Spider gleichzeitig in einem oder mehreren Prozessen ausfuhren¨ wer- den (vgl. Dokumentationskapitel 5.4.2). Ebenfalls werden verteilte Crawls zugelassen (vgl. Dokumentationskapitel 5.4.3).

Proxyserverunterstutzung¨ In Dokumentationskapitel 5.4.4 werden diverse An- s¨atze fur¨ zyklisch wechselnde IP-Adressen genannt. Unter diesen sind zum einen Programme von externen Dienstleistern wie Scrapinghub und ProxyMesh, jedoch auch kostenlose wie das Tor Projekt oder Scrapoxy. Da mit den beiden Letzteren zwei freie und kostenlose Anbindungsm¨oglichkeiten genannt werden, ist die Note 2 gerechtfertigt.

43 Kapitel 5. Bewertung der vorausgew¨ahlten Tools

5.5.2 Apache Nutch

Datenextraktionsmechanismen Apache Nutch crawlt automatisiert alle Web- seiten, die ausgehend von den Start-URLs (Seed URLs) erreichbar sind. Fur¨ Ein- schr¨ankungen, auf zum Beispiel eine Domain, mussen¨ regul¨are Ausdrucke¨ verwendet werden.[29] Daraus folgte die Vergabe der Note 1.

Datenbankanbindung Auf der Hauptseite der Dokumentation von Apache Nutch ist Version 2 beschrieben.[30] Mit ihr lassen sich mittels Apache Gora [31] mehr als zehn Datenbanksystemen anbinden. Aus diesem Grund wurde die Note 1 verge- ben.

Datenexport Daten lassen sich nur uber¨ Apache Nutchs integrierten CrawlDB und LinkDB oder uber¨ eine per Apache Gora angeschlossene Datenbank exportieren. Deshalb wurde dieser Bewertungspunkt mit einer 4 benotet.

JavaScript Unterstutzung¨ Im Abschnitt Other Tutorial(s)“ der Apche Nutch ” Dokumentationsseite [30] findet sich eine Verlinkung namens AJAX/JavaScript ” Enabled Parsing with Apache Nutch and Selenium“. Die verlinkte Seite erkl¨art die Verwendung des headless Browsers Selenium in Verbindung mit Nutch.[32] Hierfur¨ werden die von Mo Omer entwickelten Nutch-PlugIns fur¨ die Nutch Versionen 1 und 2 verwendet.[33][34] Da Selenium ein externer headless Browser ist, wurde die Note 3 vergeben.

Anwendung des Robots Exclusion Protocol (REP) Auf der Unterseite Whi- ” teListRobots“ der Dokumentation ist beschrieben, dass mit dem Konfigurations- parameter http.robot.rules.whitelist eine Liste vonIP-Adressen oder URLs angegben werden kann, auf welchen das REP ignoriert werden soll.[35] Außerdem lassen sich META-Tags auf noFollow , noIndex und noCache hin prufen.[¨ 36] Daraus folgte die Bewertung mit der Note 1.

Request Header Anpassung Mit dem Konfigurationsparameter FetchOptions lassen sich nur User-Agent spezifische Einstellungen t¨atigen.[37] Die restlichen Hea- der Felder lassen sich auch nicht mit anderen Konfigurationsparameter ¨andern. Des- halb wurde die Note 4 vergeben.

44 Kapitel 5. Bewertung der vorausgew¨ahlten Tools

Integrierte Crawling-Richtlinien Apache Nutch integriert mehrere Richtlinien. Uber¨ diverse Einstellungsparameter lassen sich verschiedene Re-Crawling Zeitpl¨ane einstellen.[38] Auch ein Forward Link Count (vgl. Kapitel 2.5.1) ist m¨oglich.[39] Au- ßerdem kann der Backlink Count als Auswahlrichtlinie genutzt werden.[40] Zus¨atzlich kann Nutch die Kosinus-Ahnlichkeit¨ [41], den Naive-Bayes-Klassifikator [42] und Ya- hoos Anthelion [43] als Crawlingfilter anwenden. Da dies funf¨ Richtlinien sind, wurde das Bewertungskriterium mit der Note 1 bewertet.

Skalierbarkeit Apache Nutch ist ein hochgradig erweiterbares und skalierbares Open-Source-Webcrawler-Softwareprojekt.[30] Erweiterbar ist es durch Plugins, ska- lierbar und verteilbar durch Apache Hadoop.[44] Damit waren die Vorraussetzungen fur¨ die Note 1 gegeben.

Proxyserverunterstutzung¨ Mit Tinyproxy wird ein externer HTTP/HTTPS Proxy Daemon unterstutzt.[¨ 45] Aus diesem Grund wurde die Note 2 vergeben.

5.5.3 StormCrawler

Datenextraktionsmechanismen Mit der Klasse JSoupParserBolt werden Da- ten extrahiert.[46] Weil diese Klasse die spezialisierte HTML-Parser Bibliothek jsoup [47] nutzt, wurde fur¨ diesen Bewertungspunkt die Note 1 vergeben.

Datenbankanbindung Fur¨ dieses Bewertungskriterium wurde die Note 6 ver- geben, da sich relationale und NoSQL Datenbanken nicht direkt anbinden lassen. Jedoch ist StormCrawler auch eher als Indexer, denn als Crawler/Scraper zu se- hen. Deshalb k¨onnen statt Datenbanken nur Suchplattformen wie , und AWS Cloudsearch nativ angebunden werden.[48]

Datenexport Es gibt zwar keine Datenbankanbindung, jedoch ist im Normal- fall eine Suchplattform, wie im vorangegangenen Punkt beschrieben, angeschlossen. Uber¨ diese lassen sich Ergebnisse eines Crawls auslesen und exportieren. Entspre- chend wurde das Bewertungskriterium mit einer 4 benotet.

45 Kapitel 5. Bewertung der vorausgew¨ahlten Tools

JavaScript Unterstutzung¨ StormCrawler unterstutzt¨ Selenium als externen headless Browser. Hierfur¨ wird die Klasse SeleniumProtocol genutzt.[49] Deshalb wurde fur¨ diesen Bewertungspunkt die Note 3 vergeben.

Anwendung des Robots Exclusion Protocol (REP) Auf Basis der Richtlini- en in der jeweiligen robots.txt -Datei werden mit Hilfe der Klasse RobotsFilter URLs verworfen.[50] Zus¨atzlich k¨onnen mit der Klasse RobotsTags die spezifischen META-Tags fur¨ Crawler uberpr¨ uft¨ werden.[51] Damit waren die Voraussetzungen fur¨ die Note 1 gegeben.

Request Header Anpassung Alle Request Header lassen sich uber¨ die Konfi- gurationsdatei des jeweiligen Crawlers anpassen. Eine Auswahl ist im Github Wiki [52] und in der API Dokumentation [53] zu finden. Daraus folgte die Vergabe der Note 1 fur¨ dieses Bewertungskriterium.

Integrierte Crawling-Richtlinien Die Klasse AdaptiveScheduler implemen- tiert einen adaptiven Fetch-Scheduler, der durch Signaturvergleich pruft,¨ ob sich eine zum widerholten Mal besuchte Seite ge¨andert hat. Wenn ja, wird das Fetch-Intervall bis zu einem gegebenen Minimum verkleinert, falls nicht, wird das Fetch-Intervall bis zu einem gegebenen Maximum erh¨oht.[54] Mit der Methode getPartition(String, Metadata) der Klasse URLPartitioner werden der Host, die Domain und dieIP einer URL zur uckgegeben,¨ sodass eine Anpassung der H¨oflichkeitsrichtlinie m¨oglich ist.[55] Außerdem kann die Crawling- Verz¨ogerung mit der Methode setCrawlDelay(long) der Klasse RobotRules fest- gelegt werden.[56] Diese drei Richtlinien fuhrten¨ zur vergebenen Note 3.

Skalierbarkeit Auf der Webseite des Projekts wird StormCrawler als ein Open- ” Source-Software Development Kit (SDK) zum Erstellen von verteilten Web-Crawlern auf Basis von .“ [57] beschrieben. Die Verteilbarkeit wird durch Apa- che Storm realisiert. Die Skalierbarkeit wird durch Zuweisung von Threads geregelt. Außerdem lassen sich schnell eigene Parser und Filter entwerfen und einfugen.¨ Dar- aus folgte die Bewertung mit der Note 1.

46 Kapitel 5. Bewertung der vorausgew¨ahlten Tools

Proxyserverunterstutzung¨ Proxyserver k¨onnen mit den uber¨ den Konfigurati- onsparameter http.protocol.implementation auszuw¨ahlenden Netzwerkproto- kollen HttpClient und OKHttp genutzt werden.[58] Diese k¨onnen einen oder meh- rer extern Proxyserver anbinden. Entsprechend wurde dieses Kriterums mit der Note 2 bewertet.

5.6 Ergebnisanalyse

5.6.1 Test auf Normalverteilung der Noten

Die Notenverteilungen werden mit Hilfe des Shapiro-Wilk-Tests auf Normalvertei- lung hin gepruft.¨ Hierfur¨ wird ein Python Skript (vgl. Code 5.1) genutzt. Es verwen- det die Funktion scipy.stats.shapiro(x) [59] mit dem jeweiligen Noten-Array als Parameter x. Diese Funktion gibt eine Teststatistik und einen entsprechenden p-Wert (pvalue) zuruck.¨

Die Nullhypothese Die Notenverteilung entspricht einer Normalverteilung.“ gilt als ” angenommen, wenn der p-Wert gr¨oßer ist als das mit dem Wert 0.75 festgelegte Signifikanzniveau6.

1 from scipy.stats import shapiro 2 3 data_unweighted=[1.4, 2.0, 2.4, 2.7, 2.8, 2.8, 3.0, 3.0, 3.0, 3.3, 4 3.6, 3.6, 3.8, 3.7, 4.0, 3.9, 4.2, 4.2, 4.2, 4.4, 5 4.4, 4.4, 4.6, 4.8, 4.9, 4.8, 5.2, 5.6] 6 data_weighted=[1.50, 1.91, 2.27, 2.50, 2.77, 2.86, 2.89, 2.90, 2.96, 3.33, 7 3.35, 3.37, 3.63, 3.63, 3.67, 3.96, 4.11, 4.13, 4.19, 4.35, 8 4.49, 4.50, 4.64, 4.76, 4.81, 4.84, 5.15, 5.40] 9 10 # Shapiro-Wilk Test 11 print(shapiro(data_unweighted)) # Output 1 12 print(shapiro(data_weighted)) # Output 2

Code 5.1 Python Skript fur¨ Shapiro-Wilk-Test

Ergebnis von Zeile 11 in Code 5.1, dem Test des ungewichteten Notensatzes, ist ein p-Wert von 0.8798781037330627. Die folgende Codezeile verwendet den gewichteten Notensatz und gibt 0.7656466364860535 als Ergebnis fur¨ den p-Wert aus.

6Das Signifikanzniveau wird auch als Irrtumswahrscheinlichkeit bezeichnet. Es gibt die Wahr- scheinlichkeit an, dass eine zutreffende Nullhypothese irrtumlich¨ verworfen werden k¨onnte.

47 Kapitel 5. Bewertung der vorausgew¨ahlten Tools

Da beide p-Werte gr¨oßer als das gew¨ahlte Signifikanzniveau sind, k¨onnen beide Notenverteilungen als normalverteilt angesehen werden.

5.6.2 Vergleich der Tools

Fur¨ einen besseren Uberblick¨ werden in Tabelle 5.5 die Noten 1 und 6 in den Farben grun¨ und rot eingef¨arbt.

utzung¨ utzung¨

# Tool DatenextraktionsmechanismenDatenbankanbindungDatenexportJavascriptAnwendung UnterstRequest desintegrierte Header REPSkalierbarkeit Anpassung Crawling-RichtlinienProxyserverunterstGesamtnoteGesamtnote ungewichtetDifferenz gewichtet 1 Scrapy 1 1 1 3 2 1 1 1 2 1,44 1,50 -0,06 2 Apache Nutch 1 1 4 3 1 4 1 1 2 2,00 1,91 0,09 3 StormCrawler 1 6 4 3 1 1 3 1 2 2,44 2,27 0,17 4 OpenSearchServer 1 5 3 3 2 4 3 1 2 2,67 2,50 0,17 5 Frontera 1 1 3 6 5 4 2 1 2 2,78 2,77 0,01 6 Supercrawler 1 4 2 6 2 1 4 3 2 2,78 2,86 -0,08 7 Norconex HTTP Collector 1 3 4 3 1 4 2 3 6 3,00 2,89 0,11 8 BUbiNG 1 5 4 6 2 2 4 1 2 3,00 2,90 0,10 9 yacy 1 4 4 6 4 4 1 1 2 3,00 2,96 0,04 10 Heritrix 1 5 3 6 2 4 4 3 2 3,33 3,33 0,00 11 Colly 1 2 6 6 4 3 6 2 2 3,56 3,35 0,21 12 Spatie / Crawler 1 6 6 2 3 1 5 6 2 3,56 3,37 0,19 13 Crawler4j 1 4 4 6 6 4 5 2 2 3,78 3,63 0,15 14 Kimurai 5 1 4 3 6 4 5 3 2 3,67 3,63 0,04 15 Webster 5 6 6 1 6 4 5 1 2 4,00 3,67 0,33 16 ACHE Crawler 4 5 2 6 6 4 4 2 2 3,89 3,96 -0,07 17 AbotX 5 6 6 3 1 5 3 3 6 4,22 4,11 0,11 18 X-ray 5 6 6 3 6 1 2 3 6 4,22 4,13 0,09 19 Simplecrawler 4 6 6 6 4 3 4 3 2 4,22 4,19 0,03 20 Node-osmosis 2 6 6 6 6 1 6 5 2 4,44 4,35 0,09 21 Jaunt 5 6 6 6 6 1 4 4 2 4,44 4,49 -0,05 22 GNU WGET 6 6 6 6 3 1 6 4 2 4,44 4,50 -0,06 23 Grab 4 6 3 6 6 3 6 5 2 4,56 4,64 -0,08 24 Icrawler 5 6 4 6 6 6 6 3 1 4,78 4,76 0,02 25 Php-spider 3 6 3 6 6 6 5 3 6 4,89 4,81 0,08 26 Abot 5 6 6 6 1 4 4 5 6 4,78 4,84 -0,06 27 Rvest 5 6 6 6 6 6 6 4 2 5,22 5,15 0,07 28 Dom-crawler 4 6 6 6 6 6 6 4 6 5,56 5,40 0,16

Durchschnitt 2,9 4,7 4,4 4,8 3,9 3,3 4,0 2,8 2,8 3,74 3,67 0,06

Tabelle 5.5 Tools der engeren Auswahl mit eingef¨arbten Noten 1 (grun)¨ und 6 (rot)

Hierbei f¨allt auf, dass auf den letzten funf¨ R¨angen die Note 6 vorherrscht. Dies

48 Kapitel 5. Bewertung der vorausgew¨ahlten Tools h¨angt meist mit einer sehr kurz gehaltenen Dokumentation zusammen.[60][61] Im Falle von Abot [62] liegt es jedoch an der Einschr¨ankung von Funktionen, um die kostenpflichtige Version AbotX [63] zu bewerben.

5.6.3 Spezialf¨alle in der Auswahl

Außerdem wird in der eingef¨arbten Tabelle 5.5 sofort ersichtlich, dass es in den Spalten Datenexport, JavaScript-Unterstutzung¨ und Proxyserverunterstutzung¨ je- weils nur einmal die Note 1 vergeben wurde.

Beim Bewertungskriterium Datenexport ist das Scrapy, bei JavaScript-Unterstutzung¨ ist es Webster und bei Proxyserverunterstutzung¨ Icrawler.

Scrapy besticht durch seine einzigartige Datenexportfunktion (vgl. Kapitel 5.5.1).

Webster integriert einen headless Chrome Browser, der mit spiderType: ’browser’ fur¨ eine Crawl-Aufgabe aktiviert werden kann.[64] Das Vorhandensein des headless Chrome Browsers scheint zun¨achst herausragend, jedoch ist der headless Browser Selenium, wie er bei vielen anderen Tools eingesetzt wird, deutlich besser dokumen- tiert und flexibler.

Icrawler stellt die Klasse ProxyPool zur Verfugung,¨ mit der zun¨achst nach Proxy- servern gesucht wird und die gefundenen Server anschließend zyklisch wechselnde bei Abfragen verwendet werden k¨onnen.[65]

49 Kapitel 6. Funktionsweisen der drei bestbewerteten Werkzeuge

6 Funktionsweisen der drei bestbewerteten Werkzeuge

In diesem Kapitel werden die Funktionsweisen und Abl¨aufe der drei Crawling- Werkzeuge mit der besten Benotung aus Tabelle 5.4 kurz beschrieben. Diese drei Werkzeuge sind Scrapy, Apache Nutch und Stormcrawler.

6.1 Scrapy

Scrapy besteht aus mehreren Komponenten [28], die spezifische Aufgaben inne ha- ben:

• Die Engine ist fur¨ die Steuerung des Datenflusses zwischen allen Kompo- nenten des Systems verantwortlich und l¨ost Ereignisse aus, wenn bestimmte Aktionen auftreten.

• Der Scheduler empf¨angt Anfragen von der Engine und stellt sie in die War- teschlange, um sie sp¨ater an die Engine zu liefern, wenn sie ben¨otigt werden.

• Der Downloader ist fur¨ das Abrufen von Webseiten und deren Weiterleitung an die Engine zust¨andig, die sie wiederum an die Spider weiterleitet.

• Die Spider sind benutzerdefinierte Klassen, die von Scrapy-Nutzern geschrie- ben wurden, um Antworten zu analysieren und anschließend Elemente zu ex- trahieren.

• Die Item-Pipeline ist fur¨ die Verarbeitung der Items verantwortlich, nachdem sie von den Spidern extrahiert wurden. Typische Aufgaben sind die Bereini- gung, Validierung und Persistenz (z. B. das Speichern in eine Datenbank).

50 Kapitel 6. Funktionsweisen der drei bestbewerteten Werkzeuge

• Die Downloader-Middlewares sind spezielle Hooks, die zwischen der Engine und dem Downloader sitzen. Sie verarbeiten Anfragen, die von der Engine an den Downloader gerichtet sind, sowie Antworten, die vom Downloader an die Engine gehen.

• Die Spider-Middlewares sind spezifische Hooks, die zwischen der Engine und den Spidern sitzen und in der Lage sind Spider-Eingaben und -Ausgaben zu verarbeiten.

Der Datenfluss in Scrapy wird von der Ausfuhrungs-Engine¨ gesteuert [28] und verl¨auft wie in Bild 6.1 gezeigt:

1. Die Engine erh¨alt die ersten Requests zum Crawlen vom Spider (Seed-URLs).

2. Die Engine plant die Requests im Scheduler ein und fragt nach den n¨achsten zu crawlenden Requests.

3. Der Scheduler sendet die n¨achsten Requests an die Engine zuruck.¨

4. Die Engine sendet die Requests an den Downloader und durchl¨auft dabei die Downloader-Middlewares.

5. Sobald das Herunterladen der Seite beendet ist, erzeugt der Downloader eine Antwort (mit der Webseite) und sendet sie an die Engine, wobei die Antwort die Downloader-Middlewares durchl¨auft .

6. Die Engine empf¨angt die Antwort vom Downloader und sendet sie zur Verar- beitung an den Spider, wobei sie die Spider-Middleware durchl¨auft.

7. Der Spider verarbeitet die Antwort und sendet per Spider-Middleware die gescrapten Elemente und neuen Requests (weitere gefundene URLs) an die Engine zuruck.¨

8. Die Engine sendet verarbeitete Elemente an die Item Pipelines, gibt verar- beitete Requests an den Scheduler zuruck¨ und fragt im gleichen Zuge nach m¨oglichen n¨achsten Requests.

9. Der Prozess wiederholt sich (ab Schritt 3), bis es keine weiteren Anfragen vom Scheduler gibt.

51 Kapitel 6. Funktionsweisen der drei bestbewerteten Werkzeuge

Bild 6.1 Architektur von Scrapy [28]

6.2 Apache Nutch

Apache Nutch besitzt drei grundlegende Datenstrukturen, die als Verzeichnisse an- gelegt werden [66]:

1. Die Segmente speichern alle Daten, die mit dem Abfragen und Parsen eines einzelnen Stapels von URLs zusammenh¨angen.

2. Die CrawlDb ist eine Datenbank, die alle Informationen der URL oder des Dokuments zur Ausfuhrung¨ und Planung des Crawlings speichert. Diese In- formationen sind:

• Aktueller Status (injiziert, verlinkt, abgerufen, nicht mehr verfugbar)¨

• Score

• N¨achster Abrufzeitpunkt

• Letzter Anderungszeitpunkt¨

• Signatur (fur¨ Deduplizierung)

• Metadaten (Container fur¨ beliebige Daten)

3. Die Datenbank LinkDb speichert eingehende Links (URLs und Ankertexte).

52 Kapitel 6. Funktionsweisen der drei bestbewerteten Werkzeuge

Bild 6.2 Architektur von Apache Nutch [66]

Der Ablauf eines Crawls ist in Bild 6.2 dargestellt und geschieht in folgender Rei- henfolge:

1. Die CrawlDb wird initialisiert und Seed-URLs in diese injiziert.

2. Es wird eine Fetch-Liste fur¨ Segment erzeugt, fur¨ die URLs aus der CrawlDb ausw¨ahlt werden.

3. Die URLs werden aus Fetch-Liste abrufen.

4. Der erhaltenen HTML-Code (content) werden verarbeitet: Inhalt, Metadaten und Links werden extrahiert.

5. Der CrawlDb-Status, der Score und die Signatur werden aktualisiert und neue URLs werden in die CrawlDb einfugt.¨

6. Links werden invertiert“ (Ankertexte7 werden den Dokumenten zugeordnet, ” auf welche die Links zeigen) und in der LinkDb ablegt.

7Der Ankertext, auch Linktext genannt, ist der klickbare Text eines Hyperlinks. Im Fließtext wird meist nur der Ankertext angezeigt, um den Lesefluss nicht zu beintr¨achtigen.

53 Kapitel 6. Funktionsweisen der drei bestbewerteten Werkzeuge

7. Die HTML-Dokumente mussen¨ anhand ihrer Signatur vergleichen werden, um Duplikate zu entfernen.

8. Der HTML-Code, die Metadaten und Ankertexte werden abschließend zum Beispiel per Apache Solr indexiert.

6.3 StormCrawler

StormCrawler ist ein SDK basierend auf Apache Storm, welches einen rohen Strom von Echtzeitdaten einliest, diesen durch eine Abfolge von kleinen Verarbeitungsein- heiten (Bolts) leitet und zum Ende die verarbeiteten Informationen ausgibt.

Ein Tupel ist die Hauptdatenstruktur in Storm. Es ist eine Liste von geordneten Elementen. Standardm¨aßig unterstutzt¨ ein Tuple alle Datentypen. Im Allgemeinen wird es als eine Menge von durch Kommata getrennten Werten modelliert und an ein Storm-Cluster ubergeben.¨

Ein Stream ist die ungeordnete Folge von Tupeln.

Ein Spout ist die Quelle eines Streams. Im Allgemeinen akzeptiert Storm Eingabe- daten aus Rohdatenquellen.

Die Bolts sind logische Verarbeitungseinheiten. Spouts ubergeben¨ Daten an Bolts und Bolts verarbeiten diese und erzeugen einen neuen Ausgabestrom. Bolts k¨onnen Operationen wie Datenfilterung, Erstellen von Daten, Daten miteinander verknupfen¨ und Interaktionen mit Datenquellen und Datenbanken durchfuhren.¨ Ein Bolt empf¨angt Daten und gibt sie an einen oder mehrere Bolts weiter.

Das SDK von StormCrawler beinhaltet diverse vorgefertigte Bolts [67] fur:¨

• Aufteilung von URLs (Partitioning)

• Abrufen von Webseiten (Fetching)

• Parsing

• Filterung von Inhalten

• Indizierung

54 Kapitel 6. Funktionsweisen der drei bestbewerteten Werkzeuge

In Kombination bilden sie den Workflow in Bild 6.3. Der Spout gibt anfangs die Seed-URLs als Stream an einen URL-Partitioner-Bolt aus. Dieser verarbeitet den eingehenden Stream und gibt an alle Fetcher-Bolts eine URL weiter. Nachdem ein Fetcher-Bolt die Webseite mit der ubergebenen¨ URL heruntergeladen hat, wird der HTML-Code an einen Parser-Bolt weitergeleitet. Dieser extrahiert alle zu indexie- renden Inhalte und reicht sie an den Indexer-Bolt weiter, welcher anschließend die erhaltenen Daten in eine Datenbank schreibt. Die Datenbank ¨offnet abschließend einen neuen Spout mit den gefundenen URLs, sodass das System nicht austrock- ” net“.

Bild 6.3 Workflow von StormCrawler [67]

55 Kapitel 7. Werkzeugtest

7 Werkzeugtest

In diesem Kapitel werden zun¨achst Vorgaben fur¨ den Crawler Test definiert, anschlie- ßend werden zu treffende Vorkehrungen fur¨ die Tests beschrieben. Danach werden die erstellten Crawlprogramme und Definitionsdateien erkl¨art und die Crawling Er- gebnisse gegenuber¨ gestellt.

7.1 Vorgaben fur¨ Crawler im Test

Fur¨ den Test der verschiedenen Crawling Werkzeuge wurden die von den Entwicklern bereitgestellten Minimalbeispiele genutzt.

Fur¨ Scrapy und Apache Nutch wurde zun¨achst jeweils ein simpler Crawler entworfen, der sich an keine Regeln h¨alt, keine Proxyserver nutzt, JavaScript nicht ausfuhrt¨ und alle ¨offentlichen Dateien, die auf einer Domain zu finden sind (focused Crawl), erfasst.

Ausgehend von diesem wurden verschiedene Erweiterungen getestet:

1. Nutzung eines User-Agent-Pools

2. Nutzung eines Proxyserver-Pools

3. Achtung des REP

4. Anwendung eines headless Browsers

5. Anwendung einer eigenen H¨oflichkeitsrichtlinie

Anschließend wurden die oben genannten Punkte in einem optimierten Crawler zu- sammengefasst. Dessen Ergbnis wurde im Anschluss ebenfalls mit denen der Erwei- terungen gegenubergestellt.¨

56 Kapitel 7. Werkzeugtest

Da StormCrawler bereits hochspezialisiert und fur¨ den Dauerbetrieb mit Elastic- Search konzipiert ist, wurde der zugeh¨orige Test nur mit einer fur¨ den Langzeitbe- trieb optimierten Konfiguration durchgefuhrt.¨

7.2 Testvorkehrungen

7.2.1 Proxy-Pool

Als HTTP-Loadbalancer fand ein Scylla-Forward-Proxy-Server [68] Verwendung. Dieser sammelte zun¨achst verfugbare¨ Proxyserveradressen in einer Datenbank, aus der dann, immer wenn ein HTTP-Request gestellt wurde, ein Proxy nach dem Zu- fallsprinzip ausgew¨ahlt wurde.

Um den Scylla-Server ohne die Sammelfunktion zu starten und so einen gleich- bleibend Proxy-Pool fur¨ die Tests zu gew¨ahrleisten, wurde der Scylla-Server nach einer Sammelphase ausschließlich mit dem Befehl scylla --skip-scheduler ge- startet.

7.2.2 User-Agent-Pool

Als User-Agent-Pool wurde ein Datenbank-Dump von whatismybrowser.com mit 10000 User-Agent-Strings verwendet.[69] Dieser bildet einen guten Querschnitt ab, da in ihm viele verschiedene User-Agent-Strings von diversen Endger¨aten und Brow- sern enthalten sind.

7.2.3 Seed-URLs

Fur¨ alle Test wurde zun¨achst die URL https://www.hs-wismar.de genutzt. Fur¨ einen zweiten Durchlauf wurde diese um die Subdomains der Fakult¨aten (fiw. hs-wismar.de, fww.hs-wismar.de, fg.hs-wismar.de) erweitert.

57 Kapitel 7. Werkzeugtest

7.3 Test von Scrapy

7.3.1 Konfigurationen von Scrapy Crawler

Jede Klasse beinhaltet die Variable name , das Set custom settings und die Listen allowed domains , start urls und rules . Sie werden von Scrapy ben¨otigt um Eigenschaften des Spiders und Regeln fur¨ den von ihm durchzufuhrenden¨ Crawl festzulegen.

Zun¨achst wurde eine Klasse MyBaseSpider (vgl. Code B.1) geschrieben, welche eine Kind-Klasse von Scrapys CrawlSpider ist und sich weder an das REPh ¨alt, noch h¨oflich ist und JavaScript nicht ausfuhrt.¨

Die Klasse MyUserAgentSpider (vgl. Code B.2) nutzt das durch pip installierte Paket scrapy-user-agents , welches eine zus¨atzliche Middleware mit dem Namen RandomUserAgentMiddleware verfugbar¨ macht. Diese macht sich ebenfalls die von https://developers.whatismybrowser.com/ frei zur Verfugung¨ gestellten User- Agent-Strings zu Nutzen.[70]

Ein Proxyserver-Pool wurde in der Klasse MyProxySpider (vgl. Code B.3) reali- siert. Hierfur¨ muss das pip Paket scrapy-rotating-proxies installiert sein.[71] Als Downloader Middlewares werden die durch das Paket hinzugefugten¨ Middle- wares RotatingProxyMiddleware und BanDetectionMiddleware genutzt. Als Quelle der Proxyserveradressen wurde dieIP-Adresse des Scylla-Server in der Liste ROTATING PROXY LIST angegeben.

Scrapy unterwirft sich automatisch dem REP, außer ROBOTSTXT OBEY ist auf False gesetzt. Diese Einstellung ist im Set custom settings zu setzten. Eine Klasse, die sich an das REPh ¨alt ist MyRobotsSpider (vgl. Code B.4).

Um Selenium und somit einen headless Browser in Scrapy zu integrieren, sind meh- rere Anpassungen von N¨oten. So muss zun¨achst das pip Paket scrapy-selenium [72] installiert sein und in diesem Fall der Browser Firefox von Mozilla. Fur¨ diesen wurden die Einstellungen SELENIUM DRIVER NAME , SELENIUM DRIVER ARGUMENTS und SELENIUM DRIVER EXECUTABLE PATH der Klasse MyHeadlessBrowserSpider (vgl. Code B.5) angepasst und die Downloader Middleware fur¨ Selenium eingefugt.¨ Mit der Methode start requests() werden alle URLs aus der Liste start urls per SeleniumRequest() abgefragt. Als Callback dient auch hier die Funktion parse() . Da in dieser Klasse jedoch keine Regeln ( rules ) festgelegt werden

58 Kapitel 7. Werkzeugtest k¨onnen, musste eine eigene Funktion check domains() geschrieben werden, welche die ubergebenen¨ URLs auf die Zugeh¨origkeit zu einer in der Liste allowed domains genannten Domains pruft.¨

Die Klasse MyPolitenessSpider (vgl. Code B.6) realisiert einen Crawler mit einer H¨oflichkeitsrichtlinie. So werden insgesamt maximal 16 Requests gleichzeitig und maximal acht gleichzeitige Requests auf eine Domain ausgefuhrt.¨ Als Verz¨ogerung sind eine bis drei Sekunden eingestellt. Statt der manuell eingestellten Verz¨ogerung kann auch die Autothrottle Erweiterung von Scrapy genutzt werden.

Angewendung fanden all diese Erweiterungen in der in Code B.8 dargestellt Klasse MyCustomHeadlessSpider .

7.3.2 Auswertung von Scrapy

In Tabelle 7.1 ist das erwartete Verhalten der einzelnen Scrapy-Spider erkennbar:

• Basis-Spider, User-Agent-Spider und Proxy-Spider finden die gleiche Seiten- anzahl, wobei sie hierfur¨ ¨ahnlich viel Zeit ben¨otigen.

• Sobald das REP geachtet wird, f¨allt die Seitenanzahl geringfugig¨ (vgl. MyRo- botsSpider).

• Wenn der Spider h¨oflich arbeit, steigt die ben¨otigte Zeit deutlich (vgl. MyPo- litenessSpider und MyCustomHeadlessSpider).

• Unter Verwendung eines Headless Browsers (MyHeadlessSpider, MyCustom- HeadlessSpider) werden deutlich mehr Seiten gefunden.

Typ URLs verstrichene Zeit MyBaseSpider 157 12.4 sec MyUserAgentSpider 157 8.9 sec MyProxySpider 157 7.9 sec MyRobotsSpider 154 8.3 sec MyPolitenessSpider 157 19 min MyHeadlessBrowserSpider 15910 12 min (Abbruch durch IP-Bann) MyCustomHeadlessSpider 5375 3.3 h (abgebrochen)

Tabelle 7.1 Ergebnisse der Scrapy Spider mit einer Seed-URL

59 Kapitel 7. Werkzeugtest

In einem zweiten Durchlauf wurden zus¨atzlich die Seiten fiw.hs-wismar.de, fww. hs-wismar.de und fg.hs-wismar.de als Start-URLs ubergeben.¨ Dies fuhrte¨ zu einer h¨oheren Anzahl an gefundenen Seiten (vgl. Tabelle 7.2).

Typ URLs verstrichene Zeit MyBaseSpider 374 39.1 sec MyUserAgentSpider 374 41.2 sec MyProxySpider 374 43.2sec MyRobotsSpider 370 39.2 sec MyPolitenessSpider 374 8.5 min MyHeadlessBrowserSpider 17534 13.5 min (Abbruch durch IP-Bann) MyCustomHeadlessSpider 4856 2.8 h (abgebrochen)

Tabelle 7.2 Ergebnisse der Scrapy Spider mit erweiterten Seed-URLs

In beiden Testl¨aufen wurde der HeadlessBrowserSpider nach ungef¨ahr 12 Minuten von der Webseite gebannt. Dies ¨außerte sich in einem HTTP-Error Code 404 (Not Found) bei jedem Versuch die Webseite der Hochschule abzufragen.

7.4 Test von Apache Nutch

7.4.1 Konfigurationsdateien fur¨ Apache Nutch Crawler

Das Crawling Verhalten von Apache Nutch wird durch zwei Extensible Markup Lan- guage (XML) Dateien definiert. Dies ist zum einen nutch-default.xml , welches eine Grundkonfiguration beinhaltet und zum anderen nutch-site.xml welche alle in ihr erneut definierten Eigenschaften zum Uberschreiben¨ der jeweiligen Grundein- stellungen aus nutch-default.xml nutzt.

In der Datei nutch-default.xml mussten grundlegende Einstellungen getroffen werden, die alle zu erstellenden Crawler betreffen: Das Feld http.agent.email wurde mit der Studierenden-Email-Adresse [email protected] ver- sehen. Im Feld http.agent.rotate.file wurde ein Dateipfad, der auf eine Text- Datei mit einer Auflistung von User-Agent Strings zeigt, hinterlegt. Außerdem wur- de das Feld http.robot.rules.whitelist mit der URL der Hochschule (https:

60 Kapitel 7. Werkzeugtest

//hs-wismar.de) belegt, da sich alle Crawler auf diese Seite fokusieren sollen. Ebenfalls aus diesem Grund mussten die Felder db.ignore.external.links und fetcher.follow.outlinks.ignore.external auf true gesetzt werden. Außer- dem wurde global die Anzahl der fetcher.threads.fetch von 10 auf 16 erh¨oht. Auf Basis dieser Standardkonfiguration wurden die Folgenden Crawler-Konfigurationen erstellt.

Die in Code C.1 gezeigte Konfiguration bildet einen Crawler, der die Webseite der Hochschule ohne Verz¨ogerung und ohne Javascript zu rendern durchl¨auft.

Durch das Einschalten der Eigenschaft http.agent.rotate wird in Code C.2 der User-Agent zuf¨allig aus der in der Standardkonfigurationsdatei unter dem Punkt http.agent.rotate.file angegebenen Datei ausgew¨ahlt und in den Request- Header eingesetzt. Auch dieser Crawler durchl¨auft die Webseite der Hochschule ohne Verz¨ogerung und ohne Javascript zu rendern.

Um einen Crawler mit rotierendem Proxyserver-Pool zu realisieren, wurde in Code C.3 in den Einstellungspunkten http.proxy.host und http.proxy.port dieIP- Adresse und der Port des bereitgestellten Scylla Servers angegeben. Wie bei den vorangegangenen Konfigurationsdateien, wurde auch hier eine Verz¨ogerung von null Sekunden angegeben und Javascriptrendering abgeschaltet.

Auch der die in Code C.4 dargestelle Konfigurationsdatei crawlt die Webseite der Hochschule ohne Verz¨agerung und ohne Javascript zu rendern. Diesmal jedoch un- terwirft sich der definierte Crawler dem REP vollends.

Ein headless Browser wird mit Code C.5 durch die Aktivierung des Einstellungs- punktes selenium.enable.headless gestartet. Außerdem wird hier Javascript gerendert, da der zugeh¨orige Punkt in nutch-default.xml standardm¨aßig aktiv ist.

Durch das Setzen von Verz¨ogerungswerten wird mit Code C.6 ein in den Grundzugen¨ h¨oflicher Crawler definiert, der sich jedoch nicht dem REP unterwirft.

Mit dem in Code C.7 beschriebenen Crawler, wird ein headless Browser gestartet, der einen rotierenden User-Agent-String und wechselnde Proxyserveradressen nutzt. Er ist hierbei durch die gesetzten Verz¨ogerungen außerdem relativ h¨oflich. Deswegen wurde auf das Angeben einer Beschreibung und der E-Mail-Adresse verzichtet. Diese Konfigurationsdatei entspricht ann¨ahernd dem Idealbild eines Crawlers.

61 Kapitel 7. Werkzeugtest

7.4.2 Auswertung von Apache Nutch

Der auf Apache Nutch basierende Crawler wird aus dem Wurzelverzeichnis der Apa- che Nutch Installation heraus mit dem Befehl bin/crawl -s ./urls ./crawls 10 gestartet. Als Konfigurationsdatei werden die Dateien conf/nutch-default.xml und conf/nutch-site.xml verwendet. Die Option -s ./urls gibt den Pfad zur Datei mit den Seed-URLs an. Außerdem werden der Pfad, in dem alle dem Crawl zugeh¨origen Daten abgelegt werden sollen angegeben, sowie die Anzahl der Iteratio- nen, die dieser Crawl ausgefuhrt¨ werden soll. Standardm¨aßig wird ein Zeitlimit von 180 Minuten fur¨ den Crawl gesetzt.

Der Fortschritt und das Geschehen w¨ahrend des Crawls k¨onnen im Terminal verfolgt werden.

W¨ahrend der Ausfuhrung¨ und nach Beendung des Crawls kann die zugeh¨orige CrawlDb-Statistik mit bin/nutch readdb ./crawls/crawldb -stats abgefragt werden.

Tabelle 7.3 stellt die Ergebnisse der Crawls mit einer Seed-URL und verschiedenen Konfigurationsdateien dar. Wie zu erwarten lieferten die Default-, UserAgent- und Proxy-Konfiguration Seitenanzahlen in der gleichen Gr¨oßenordnung. Fur¨ die Konfi- guration mit Achtung des REP wurde eine deutlich niedrigere URL-Anzahl erwartet. Nach zehn Iterationen lag sie jedoch in der Gr¨oßenordnung wie die vorangegange- nen Konfigurationen. Fur¨ die Konfiguration mit einem Headless Browser wurde eine h¨ohere Anzahl an URLs als bei Basis-, User-Agent- und Proxy-Konfiguration er- wartet. Dies traf zu, wenn auch nur ungef¨ahr 200 URLs zus¨atzlich erfasst wurden. Wie zu erwarten fanden die h¨oflichen Konfigurationen ‘Polite Config’ und ‘Custom Config’ durch die eingestellte Verz¨ogerung deutlich weniger URLs als die anderen Konfigurationen.

62 Kapitel 7. Werkzeugtest

Typ nicht abgerufen abgerufen gesamt URLs Default Config 2049 9665 14129 UserAgent Config 2069 9531 14120 Proxy Config 2245 9489 14045 REP Config 2041 9688 14152 Polite Config 2174 2736 5349 Headless Config 2041 9688 14356 Custom Config 2371 2867 5336

Tabelle 7.3 Ergebnisse der Nutch Spider mit einer Seed-URL nach jeweils zehn Iterationen (Laufzeit ungef¨ahr 3h)

Als Erweiterung zum ersten Test aus Tabelle 7.3 wurden anschließend die Seiten fiw.hs-wismar.de, fww.hs-wismar.de und fg.hs-wismar.de zu den Seed-URLs hinzugefugt.¨ Dies fuhrte¨ generell zu einer h¨oheren Anzahl an gefundenen Seiten (vgl. Tabelle 7.4).

Typ nicht abgerufen abgerufen gesamt URLs Default Config 2113 10453 14970 UserAgent Config 2246 10256 15113 Proxy Config 2432 10133 15234 REP Config 2321 10275 15122 Polite Config 2271 2901 5721 Headless Config 2292 10753 15013 Custom Config 2574 2867 5744

Tabelle 7.4 Ergebnisse der Nutch Spider mit erweiterten Seed-URLs nach jeweils zehn Iterationen (Laufzeit ungef¨ahr 3h)

7.5 Test von StormCrawler

7.5.1 Vorausgesetzte Programme fur¨ Stromcrawler

Um StormCrawler testen zu k¨onnen mussen¨ einige Programme auf einem Server (im Folgenden auf localhost ) installiert, konfiguriert und aktiviert werden.

63 Kapitel 7. Werkzeugtest

Apache Zookeeper wird von Apache Storm ben¨otigt. In seinem Wurzelordner sollte zun¨achst ein Ordner data angelegt werden. Dieser wird sp¨ater mit allen von Zookeeper generierten Daten gefullt.¨ Außerdem muss eine Datei conf/zoo.cfg erstellt werden (vgl. Code 7.1). Sie dient als Konfigurationsdatei.

1 tickTime=2000 2 initLimit=10 3 syncLimit=5 4 dataDir=/path/to/apache-zookeeper/data 5 clientPort=2181 6 admin.enableServer = false

Code 7.1 Apache Zookeeper Konfigurationsdatei

Ausgefuhrt¨ wird Apache Zookeeper mit dem Befehl bin/zkServer.sh start aus seinem Wurzelordner heraus.

Apache Storm stellt das Grundgerust¨ fur¨ StormCrawler. In seinem Wurzelordner wird zun¨achst ebenfalls der Ordner data angelegt. Dieser wird sp¨ater mit allen von Storm generierten Daten gefult.¨ Unter conf/storm.yaml werden alle Einstellungen fur¨ Apache Storm beschrieben (vgl. Code 7.2).

1 storm.zookeeper.servers: 2 - "localhost" 3 storm.local.dir: "/path/to/apache-storm/data" 4 supervisor.slots.ports: 5 - 6700 6 - 6701 7 - 6702 8 - 6703

Code 7.2 Apache Storm Konfigurationsdatei

Gestartet wird Apache Storm aus seinem Wurzelordner heraus mit den Befehlen bin/storm nimbus , bin/storm supervisor und bin/storm ui .

ElasticSearch bildet die Grundlage fur¨ Kibana, ben¨otigt keine weitere Konfigura- tion und kann direkt aus seinem Wurzelordner mit dem Befehl bin/elasticsearch gestartet werden.

64 Kapitel 7. Werkzeugtest

Kibana stellt das Auswertungstool fur¨ StormCrawler in ElasticSearch bereit. Es wird in Kibanas Unterordner config mit der Datei kibana.yaml konfiguriert (vgl. Code 7.3).

1 server.port: 5601 2 server.host: "localhost" 3 elasticsearch.hosts:["http://localhost:9200"]

Code 7.3 Kibana Konfigurationsdatei

Gestartet wird Kibana ebenfalls aus seinem Wurzelordner heraus mit dem Befehl bin/kibana .

StormCrawler selbst bietet einen Maven-Archetyp8 fur¨ die Nutzung mit Ela- stic Search. Dieser wurde fur¨ die Projektgenerierung genutzt. Nach der Generie- rung wurde in das entstandene Verzeichnis gewechselt und eine ausfuhrbare¨ Da- tei mit dem Befehl mvn clean package erstellt. Nachfolgend mussen¨ zwei Scripte ausgefuhrt¨ werden, welche auf den laufenden ElasticSearch- und Kibana-Instanzen StormCrawler-spezifische Felder zur Auswertung erstellen. Diese Dateien sind im Projektordner als ES IndexInit.sh und kibana/importKibana.sh zu finden.

7.5.2 Konfigurationsdatei fur¨ StromCrawler

Als Basis der Konfigurationsdatei wird das Beispiel in Code D.1 verwendet. Hier kann uber¨ die Punkte topology.workers , topology.max.spout.pending und fetcher.threads.number eine Skalierung in Apache Storm vorgenommen werden. Als http.agent.email wurde die Studierenden-Email-Adresse gesetzt.

Anders als bei Scrapy und Apache Nutch kann fur¨ einen rotierenden User-Agent- String keine Datei angegeben werden. Stattdessen muss ein kommagetrennter String von User-Agents ubergegeben¨ werden (vgl. Code D.2). Intern wird dieser im Pro- grammablauf an jedem Komma getrennt und die entstandenen Substrings anschlie- ßend in ein Array geschrieben, welches dann im Round-Robin-Verfahren fur¨ Web- seitenanfragen genutzt wird.

8 mvn archetype:generate -DarchetypeGroupId=com.digitalpebble. -DarchetypeArtifactId=storm-crawler-elasticsearch-archetype -DarchetypeVersion=LATEST

65 Kapitel 7. Werkzeugtest

Ein verwendbarer Proxy-Server wird uber¨ die Einstellungspunkte http.proxy.host und http.proxy.port definiert. In Code D.3 beziehen sich die Angaben auf den zu verwendenden Scylla-Server.

StormCrawler achtet standardm¨aßig das REP. Um dieses Verhalten zu umgehen, mussen,¨ wie in Code D.4 gezeigt, die Einstellungsfelder http.robots.file.skip , http.robots.headers.skip und http.robots.meta.skip auf true gesetzt wer- den.

Die H¨oflichkeit von StormCrawler wird prim¨ar uber¨ zwei Felder eingestellt.

• fetcher.server.min.delay definiert die Verz¨ogerung zwischen Seitenabfra- gen in der gleichen Warteschlange, wenn die Warteschlange von mehr als einen Thread genutzt wird.

• fetcher.server.delay definiert die Verz¨ogerung zwischen Seitenabfragen in der gleichen Warteschlange, wenn die Warteschlange von einem Thread genutzt wird.

Wenn das REP Anwendung findet, kann in robots.txt ein Crawl-Delay festgelegt sein. Sollte dieses gr¨oßer als der in fetcher.max.crawl.delay angegebenene Wert sein, wird die zugeh¨orige Seite ubersprungen.¨ Eine beispielhafte Definition ist in Code D.5 gegeben.

7.5.3 Auswertung von StormCrawler

Zum Testen wurde die in Code D.6 abgebildete Konfigurationsdatei verwendet. Apa- che Zookeeper, Apache Storm, ElasticSearch und Kibana wurden fur¨ diesen Test, wie in Kapitel 7.5.1 beschrieben, auf dem localhost ausgefuhrt.¨ Ein verteiltes Ab- arbeiten der Bolts fand also nicht statt. Außerdem sollten vor dem Ausfuhren¨ die Ressourcen des Rechners, auf dem getestet wird, bedacht werden. Das gleichzeitige Ausfuhren¨ von Zookeeper, Storm, ElasticSearch und Kibana nimmt diese deutlich ein.

In Tabelle 7.5 sind die Crawl-Statistiken nach dem Ablauf von einer und drei Stun- den dargestellt. Nach einer Stunde waren 23841 Seiten gefunden und 6355 Seiten abgerufen worden. Drei Stunden nach dem Start waren diese Zahlen bereits mehr als verdoppelt.

66 Kapitel 7. Werkzeugtest

nach 1h nach 3h Entdeckt 23841 57274 Abgerufen 6355 14609 Umgeleitet 927 2524 Fehler 392 1552 Abruf Fehler 339 541

Tabelle 7.5 Ergebnisse von StormCrawler

7.6 Vergleich der Ergebnisse

Ein Vergleich der Ergebnisse gestaltet sich schwierig, da die drei Werkzeuge unter- schiedliche Ans¨atze haben, was ihre Laufzeit angeht.

Scrapy durchl¨auft alle gefundenen URLs, egal wie lang dies dauert. Apache Nutch legt zwar ein standardm¨aßiges Zeitlimit von 180 Minuten fest, die eigentliche Dauer wird jedoch uber¨ die Anzahl der Iterationen beim Crawler-Start festgelegt. Wie lan- ge eine Iteration dauert ist jedoch von Seite zu Seite unterschiedlich. StormCrawler hingegen besitzt zwei Modi: storm local und storm jar . Ersterer ist fur¨ Test- zwecke auf einem lokalen Cluster gedacht und kann mit der Option --local-ttl n auf einen Laufzeit von n Sekunden begrenzt werden. Die zweite Option ist fur¨ den Dauerbetrieb einer Topologie bestimmt.

Um vergleichbare Werte zu erhalten, wurden alle drei Crawler nach rund drei Stun- den abgebrochen, falls sie selbst den Crawl nicht bereits fertiggestellt hatten.

Typ abgerufen gefundene URLs Scrapy – MyHeadlessBrowserSpider - 15910 Scrapy – MyCustomHeadlessBrowserSpider - 5375 Apache Nutch – Headless Config 9688 14356 Apache Nutch – Custom Config 2867 5336 StormCrawler – Custom Config 14608 57274

Tabelle 7.6 Gegenuberstellung¨ der Crawl-Ergebnisse verschiedener Werkzeuge (Laufzeit jeweils ungef¨ahr 3h

In Tabelle 7.6 sind die Ergebnisse der verschiedenen Spider mit einem headless Browser dargestellt. Wie zu erwarten halten sich die Ergebnisse von Scrapy und Apache Nutch bei gleicher Konfiguration in einem ¨ahnlichen Rahmen. Das Ergebniss

67 Kapitel 7. Werkzeugtest von StormCrawler sticht besonders heraus, da die Anzahl der gefundenen URLs fast viermal so groß ist, als bei den anderen beiden Crawlern.

Dieser Unterschied entsteht durch die verschiedenen Abarbeitungsweisen (vgl. Kapi- tel6). StormCrawler ist hierbei mit Spouts und Bolts deutlich effektiver als Apache Nutch mit den Segmenten oder Scrapy mit der zentralen Engine.

68 Kapitel 8. Tool fur¨ das Praktikum

8 Tool fur¨ das Praktikum

Ziel der Thesis war neben dem Vergleich der auf dem Markt befindlichen Crawling- werkzeuge auch das Entwickeln eines Programms, welches die in Kapitel7 behan- delten Tools einfacher zug¨anglich und frei im Laborpraktikum einsetzbar macht.

8.1 Anforderungen an das Tool

Zun¨achst wurden einige Anforderungen an dieses Werkzeug gesammelt:

1. GUIf ur¨ Nutzerfreundlichkeit

2. Zeitgem¨aßes Design der GUI

3. Erzeugung und Ausgabe von Skripten bzw. Konfigurationsdateien

4. Crawler-Einstellungen (vgl. Kapitel 7.1) uber¨ GUI treffbar

5. Englische Sprache, um Zugang auch fur¨ Erasmus-Studierende sicher zu stellen

6. Tool m¨oglichst auf allen Betriebssystemen lauff¨ahig

8.2 Grafische Benutzeroberfl¨ache des Tools

Die GUI des Tools wurde mit dem Anvil-Framework gebaut. Dies erlaubt es Full- ” Stack-Webanwendungen mit nichts als Python“ [73] zu entwickeln. Die grafische Oberfl¨ache wird hierbei durch eine YAML-Datei definiert. Der im Hintergrund lau- fende Quellcode zur Verarbeitung der Eingaben ist in Python Version 3.8 realisiert.

In Bild 8.1 ist die Ober߬ache der Webanwendung dargestellt.

Im obersten Abschnitt muss zun¨achst per Radiobutton eines der Werkzeuge aus- gew¨ahlt werden. Fur¨ dieses werden nachfolgend Einstellungen getroffen. Obligato- risch ist die Angabe von Seed-URLs, die kommasepariert im zweiten Eingabebereich

69 Kapitel 8. Tool fur¨ das Praktikum in ein Textfeld eingetragen werden. Anschließend kann die Art des Crawlings gew¨ahlt werden. Zur Auswahl stehen hierbei entweder ein fokusierter Crawl, der sich auf die durch die Seed-URLs gegebenen Domains begrenzt, oder ein breit angelegter Crawl, der alle gefundenen Webseiten verarbeitet. Der darauf folgende Auswahlbereich be- fasst sich mit tiefer gehenden Einstellungen fur¨ den ausgew¨ahlten Crawler. So kann hier uber¨ Auswahlfelder entschieden werden, ob ein Forward Proxy (zum Beispiel ein Loadbalancer) genutzt werden soll, ob und wenn ja wie lang die Verz¨ogerung beim Crawlen sei und wie viele Abfragen maximal gleichzeitig an eine Webseite ge- stellt werden durfen.¨ Abschließend wird uber¨ Radiobuttons abgefragt, ob das REP geachtet, rotierende User-Agent-Strings verwendet und ob ein Headless Browser ge- nutzt werden soll. Durch Drucken¨ des rechts unten verorteten Knopfes wird die Generierung der fur¨ den ausgew¨ahlten Crawler n¨otigen Dateien angestoßen.

Bild 8.1 Grafische Benutzeroberfl¨ache des Test Tools

70 Kapitel 8. Tool fur¨ das Praktikum

8.3 Verarbeitung der Formulareingaben

8.3.1 Auswahl des Crawlers

Nach dem Anklicken des Buttons wird gepruft,¨ ob in allen (ausgew¨ahlten) Einga- befeldern Inhalte angegeben sind. Die Sinnhaftigkeit wird in diesem Schritt nicht uberpr¨ uft.¨ Jedoch sind die Felder fur¨ Seed-URLs undIP-Adresse als Textfelder und die Eingabefelder fur¨ Port, Crawl-Verz¨ogerung und Anzahl gleichzeitiger Anfragen als Zahlenfelder definiert. Danach wird abgefragt, welcher Radiobutton in der Craw- lerauswahl aktiv ist und dementsprechend die Dateigenerierung gestartet.

8.3.2 Generierung von Skripten fur¨ Scrapy

Bei Auswahl von ‘Scrapy Spider’ wird die Methode generateScrapySettings() aufgerufen. Sie fullt¨ Datenstrukturen, die fur¨ die eigentliche Skriptgenerierung ben¨o- tigt werden, mit den zur Auswahl und Eingabe im Formular passenden Inhalten. Die Datenstrukturen sind fur¨ ein besseres Verst¨andnis nach denen im Scrapy-Skript benannt. Intern werden weitere Methoden aufgerufen, denen diese Datenstrukturen ubergeben¨ werden und welche sie nach Prufung¨ von Formularparametern erweitern (vgl. Code 8.1). Abschließend werden sie vond er Methode zuruckgegeben.¨

Beispielhaft fur¨ eine der durch generateScrapySettings() umfassten Methoden sei hierbei scrapy setDelay(self, custom settings) (dargestellt in Code 8.2) genannt. Hier wird zun¨achst gepruft,¨ ob das Kontrollk¨astchen fur¨ die Crawling- Verz¨ogerung ausgew¨ahlt wurde. Trifft dies zu, wird ein Tupel mit dem Einstel- lungsnamen ( DOWNLOAD DELAY ) und der Eingabe aus dem zugeh¨origen Eingabefeld ( tb delay.text ) erstellt und in die Datenstruktur geschrieben.

71 Kapitel 8. Tool fur¨ das Praktikum

283 def generateScrapySettings(self): 284 """ 285 Generates Scrapy Settings in dicts and lists\n 286 :return: start_urls[], allowed_domains[], custom_settings{}, ,→ proxy[], downloader_middlewares{} 287 """ 288 custom_settings={} 289 proxy=[] 290 downloader_middlewares={} 291 allowed_domains= self.get_domains_from_seeds() 292 start_urls= self.get_seeds_from_textarea() 293 294 # update settings dict with defaults 295 custom_settings.update({'BOT_NAME': 'scrapyBot'}) 296 custom_settings.update({ 297 'USER_AGENT': "Mozilla/5.0 (Windows NT 6.1; WOW64) ,→ AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.131 ,→ Safari/537.36"}) 298 custom_settings.update({'HTTPPROXY_ENABLED': False}) 299 custom_settings.update({'COOKIES_ENABLED': True}) 300 # update settings dict with form inputs 301 self.scrapy_setIP(proxy, downloader_middlewares) 302 self.scrapy_setDelay(custom_settings) 303 self.scrapy_setThreads(custom_settings) 304 self.scrapy_setREP(custom_settings) 305 self.scrapy_setRUA(downloader_middlewares) 306 self.scrapy_setHB(custom_settings, downloader_middlewares) 307 308 return start_urls, allowed_domains, custom_settings, proxy, ,→ downloader_middlewares

Code 8.1 Methode generateScrapySettings(self)

Die gefullten¨ Datenstrukturen werden dann der Methode generateScrapyScript() ubergeben.¨ Sie bildet eine Liste von formatierten Strings. Jeder String entspricht dabei einer Zeile Skriptcode. Zuruckgegeben¨ wird ein String, welcher durch das Zu- sammenfugen¨ der Listenelemente gebildet wird.

Abschließend wird dieser String in ein Textfeld ( ta output ) geschrieben und dieses Textfeld anschließend sichtbar gemacht.

8.3.3 Generierung von Dateien fur¨ Apache Nutch

Analog zur Generierung der Scrapy-Skripte wird bei der Generierung der Dateien fur¨ einen Crawl mit Apache Nutch vorgegangen.

72 Kapitel 8. Tool fur¨ das Praktikum

321 def scrapy_setDelay(self, custom_settings): 322 """ 323 Sets String of Download-Delay into given Dict\n 324 :param custom_settings: Dict to append String of Download-Delay ,→ Setting to 325 """ 326 if self.cb_delay_checked(): 327 custom_settings.update({'DOWNLOAD_DELAY': self.tb_delay.text})

Code 8.2 Methode scrapy setDelay(self, custom settings)

Zun¨achst wird eine leere Liste fur¨ die zu treffenden Einstellungen erstellt und eine Liste von erlaubten Domains aus dem Formular heraus erstellt. Mit der Metho- de nutch setProperties(properties list, domains) wird die Einstellungsliste gefullt.¨ Jeder Listeneintrag entspricht dabei einem String, welcher einen Einstel- lungspunkt mit Namen und Wert beschreibt.

Anschließend wird die so generierte Liste mit Einstellungen an die Klassenmethode nutch listToPrettyPropertiesXML() ubergeben.¨ Diese verbindet alle Elemente der Liste zu einem String und ubergibt¨ ihn der Serverfunktion prettifyXML() , welche den String zun¨achst in ein formatiertes Document -Objekt wandelt und an- schließend wieder als String zuruckgibt.¨ Dieser wird dann im Textfeld ( ta output ) ausgegeben.

Da Apache Nutch eine eigene Datei fur¨ die Seed-URLs ben¨otigt, werden die im Formular angegebenen Seed-URLs abschließend mit der Methode seedsToCard() in ein separates Textfeld geschrieben.

8.3.4 Generierung von Stormcrawler-Dateien

Der Ablauf der Dateigenerierung fur¨ Stormcrawler l¨auft ¨ahnlich ab wie bei Apache Nutch. Da es sich bei der Konfigurationsdatei jedoch um eine YAML-Datei handelt, wird eine Datenstruktur vom Typ Dictionary ben¨otigt. Diese wird durch die Metho- de storm setProperties() und der wiederum in ihr aufgerufenen Methoden, mit den zutreffenden Einstellungen gefullt.¨

Als Beispiel, welche Methoden durch die Methode storm setProperties() auf- gerufen werden, ist storm setDelay() in Code 8.3 dargestellt. Wie bei allen Set- Methoden im Quellcode wird zun¨achst abgefragt, ob der die Einstellung betreffen- de Punkt (Ankreuzfeld oder Radiobutton) ausgew¨ahlt wurde. Anschließend werden

73 Kapitel 8. Tool fur¨ das Praktikum

ben¨otigte Werte und die Nutzereingabe aus dem Formular an einem definierten Punkt in die Datenstruktur eingetragen.

611 def storm_setDelay(self, config_dict): 612 """ 613 If Delay-Checkbox is checked add Delay-Settings to given Dict.\n 614 :param config_dict: Dict of configuration 615 """ 616 if self.cb_delay_checked(): 617 config_dict['config']['fetcher.max.crawl.delay']= 30 618 config_dict['config']['fetcher.server.delay']= ,→ float(self.tb_delay.text) 619 config_dict['config']['fetcher.server.min.delay']= 0.0

Code 8.3 Methode storm setDelay(self, config dict)

Die so gefullte¨ Datenstruktur wird dann an die Serverfunktion yamlDump() uber-¨ geben, welche aus ihr einen formatierten String erzeugt und diesen zuruckgibt.¨ An- schließend wird er ins Textfeld ( ta output ) geschrieben.

Wie Apache Nutch ben¨otigt Stormcrawler eine eigene Datei fur¨ die Seed-URLs. Sie wird ebenfalls mit der Methode seedsToCard() in einem separaten Textfeld ausgegeben.

Außerdem ist durch die Einstellung eines fokussierten Crawlers eine Modifikation der Datei urlfilters.json n¨otig. Diese Anderungen¨ werden durch die Methode storm setFocus() vorgenommen. Das von ihr zuruckgegbene¨ JavaScript Object Notation (JSON) Objekt wird anschließend als Eingabeparamter an die Serverfunk- tion jsonDump() gegeben, welche es als formatierten String zuruck¨ gibt, der ab- schließend in einem zus¨atzlichen Textfeld ausgegeben wird (vgl. Bild 8.2).

8.4 Zu bedenkende Punkte bei Generierung von Konfigurationsdateien

Bei dem Setzen der Einstellungen sollte bedacht werden, dass ein gutes Gleichge- wicht zwischen H¨oflichkeit und Effizienz gew¨ahlt wird. Außerdem muss besonders bei einem fokusierten Crawl darauf geachtet werden, eine Crawl-Verz¨ogerung ein- zustellen und rotierende User-Agent-Strings sowie Proxyserver zu verwenden, um einemIP-Bann vorzubeugen.

74 Kapitel 8. Tool fur¨ das Praktikum

Außerdem kann es durchaus Sinn ergeben, vor einem Crawl die robots.txt Datei der zu crawlenden Webseite zu ¨offnen und zu analysieren. So kann zum Beispiel aus der robots.txt der Webseite https://www.hs-wismar.de/ herausgelesen werden, dass sogenannte ‘non-realurls’ (vgl. Zeile 21 f. Code 8.4) exstieren, die keinen eigenen Inhalt besitzen. Diese werden zwar bei Achtung des REP automatisch ignoriert, jedoch verlangsamen sie – bei Nichtbeachtung des REP – durch ihre schiere Menge den Crawler betr¨achtlich. Begrundet¨ liegt dies darin, dass er sie zwar besucht, aber keinen neuen oder uberhaupt¨ keinen Inhalt findet.

1 # robots.txt for HS Wismar 2 3 User-agent: AhrefsBot 4 Disallow: / 5 6 User-agent: * 7 # Disallow crawling at all ... 8 #Disallow: / 9 10 # Disallow folders 11 Disallow: /bin/ 12 Disallow: /fileadmin/ 13 Disallow: /storages/protected/ 14 Disallow: /Packages/ 15 Disallow: /typo3/ 16 Disallow: /typo3conf/ 17 Disallow: /typo3_src/ 18 Disallow: /uploads/ 19 20 # Disallow for non-realurl URLs 21 Disallow: /*?id=* 22 Disallow: /*&id=* 23 24 # Allow specific folders 25 Allow: /typo3conf/ext/ 26 Allow: /fileadmin/_processed_/ 27 Allow: /storages/hs-wismar/

Code 8.4 Inhalt von https://www.hs-wismar.de/robots.txt

75 Kapitel 8. Tool fur¨ das Praktikum

Bild 8.2 Ausgabe des Pratikumstools

76 Kapitel 9. Fazit

9 Fazit

Wie gezeigt werden konnte ist die Auswahl an Crawling-Werkzeugen zwar sehr groß, jedoch sind nur wenige im Bezug auf Funktionalit¨at und Nutzbarkeit in der Pra- xis geeignet. Vorallem die Werkzeuge, welche auf Produkten der Apache Software Foundation aufbauen oder gar schon seit Langem durch diese entwickelt werden, erwiesen sich in den Bewertungen und Tests als gut und einfach nutzbar.

Mit Ruckblick¨ auf Tabelle 5.5 best¨atigte sich eine erste Annahme, welche bei der Entwicklung der Bewertungskriterien aufkam: Je umfachreicher und detaillierte die Dokumentation eines Werkzeugs, desto besser die Gesamtnote. Eine ausfuhrliche¨ Dokumentation und Funktionsbeschreibung kann also ein erstes Indiz dafur¨ sein, dass das ausgew¨ahlte Crawling-Werkzeug anpassbar, erweiterbar und flexibel im Bezug auf das Einsatzfeld ist.

Im Allgemeinen scheint das Bewertungschema sinnig, da sowohl bei einer unge- wichteten, als auch bei einer gewichteten Bewertung eine Normalverteilung der Ge- samtnoten zu erkennen war. Hier w¨are es durchaus interessant weitere Crawling- Werkzeuge anhand des Schemas zu bewerten und diese in die Verteilung aufzuneh- men.

Besonders uberraschend¨ war das Testergebnis von StormCrawler, welches durch be- sonders hohe Zahlen an gefundenen und abgerufenen Seiten auffiel. Dass die zugrun- de liegende Softwarearchitektur eine so bedeutenden Rolle spielt, war anfangs nicht abzusehen.

Ausgehend von den in dieser Thesis behandelten und entwickelten Punkten finden sich eine Vielzahl weitere Ideen und Ans¨atze, die im Folgenden kurz angesprochen seien.

Die in dieser Thesis betrachteten Crawling-Werkzeuge sind fur¨ das Crawlen von Surface- und Deep-Web gut geeignet und entwicklet worden. Interessant w¨are es nun das Hidden-Web, welches meist mit dem Tor-Projekt und seinen so genannten Onion- Services gleichgestellt wird, mit einem eigens entwickelten Crawler zu indexieren.

77 Kapitel 9. Fazit

Neben den OpenSource Crawlern bieten verschiedenste Plattformen Oberfl¨achen fur¨ Craweling und Scraping an.[74][75][76][77] Diese sind jedoch meist an ein Bezahl- modell gebunden und wurden deshalb in dieser Thesis nicht behandelt. Ein Vergleich dieser Plattformen w¨are erstrebenswert.

Außerdem kann das erarbeitete Praxistool weiter optimiert werden, um zus¨atzliche Crawling Werkzeuge mit einzubinden. Im Rahmen eines gr¨oßeren Projekts k¨onnte das Praxistool zu einem Meta-Crawler ausgebaut werden, der verschiedene Werk- zeuge kombiniert.

Interessant w¨are außerdem die genaue Analyse einer Webseite mit einem ausgew¨ahlten Crawling-Werkzeug. Hierbei k¨onnte neben der Analyse der Suchmaschinenoptimie- rung außerdem eine Analyse auf Sicherheitslucken¨ im Fokus stehen. Ein Beispiel: Bei dem Test der Crawling Tools in Kapitel7 sprang die Subdomain bilddb. hs-wismar.de ins Auge, auf der man sich mit der pers¨onlichen Hochschulken- nung anmelden konnte und anschließend Zugriff auf das gesamte Bildmaterial der Offentlichkeitsarbeit¨ hatte. Da hier nicht nur Bilder von ¨offentlichen Personen (Rek- tor etc.), sondern auch von zahlreichen Studierenden, Schulern¨ und auch Kindern zug¨anglich waren, wurde dies dem Rechenzentrum gemeldet. Nicht zuletzt, weil Teile der Datenbank sogar mit einen Sperrvermerk versehen waren. Nach Rucksprache¨ mit dem Datenschutzbeauftragten der Hochschule und der Offentlichkeitsarbeit,¨ sollte der Zugang durch den zust¨andigen Mitarbeiter einschr¨ankt werden.

78 Literatur

Literatur

[1] Refsnes Data. CSS Selector Reference. Hrsg. von W3Schools. 2021. url: h ttps://www.w3schools.com/cssref/css_selectors.asp (besucht am 09. 02. 2021).

[2] Refsnes Data. XPath Syntax. Hrsg. von W3Schools. 2021. url: https://www. w3schools.com/xml/xpath_syntax.asp (besucht am 09. 02. 2021).

[3] Dave Raggett, Arnaud Le Hors und Ian Jacob. HTML 4.01 Specification. W3C Recommendation 24 December 1999 superseded 27 March 2018. 24. Dez. 1999. Kap. Appendix B: Performance, Implementation, and Design Notes. url: htt ps://www.w3.org/TR/html401/appendix/notes.html#h-B.4.1.2 (besucht am 03. 11. 2020).

[4] robotstxt.org. About /robots.txt. 2007. url: https://www.robotstxt.org/ robotstxt.html (besucht am 03. 11. 2020).

[5] robotstxt.org. About the Robots META tag. 2007. url: https://www.robots txt.org/meta.html (besucht am 03. 11. 2020).

[6] Martijn Koster. A Method for Web Robots Control. 4. Dez. 1996. url: https: //www.robotstxt.org/norobots-rfc.txt (besucht am 03. 11. 2020).

[7] support.google.com. About robots.txt. Create a robots.txt file. Hrsg. von Help Center. 2020. url: https://support.google.com/webmasters/answer/ 6062596?hl=en (besucht am 05. 11. 2020).

[8] developers.google.com. Robots.txt Specifications. URL matching based on path values. 27. Aug. 2020. url: https://developers.google.com/search/ reference/robots_txt (besucht am 05. 11. 2020).

79 Literatur

[9] WorldWideWebSize.com. The size of the World Wide Web (The Internet). 24. Nov. 2020. url: https : / / www . worldwidewebsize . com (besucht am 24. 11. 2020).

[10] FTTH Council Europe. Panorama. Markets at September 2019. Techn. Ber. IDATE DigiWorld, 23. Apr. 2020, S. 17. url: https://www.ftthcouncil. eu/documents/FTTH%20Council%20Europe%20-%20Panorama%20at%20Septe mber%202019%20-%20Webinar%20Version4.pdf (besucht am 24. 11. 2020).

[11] Jenny Edwards, Kevin Mccurley und John Tomlin. “An Adaptive Model for Optimizing Performance of an Incremental ”. In: Proceedings of the 10th International Conference on World Wide Web. WWW ’01. Hong Kong, Hong Kong: Association for Computing Machinery, Apr. 2001. isbn: 1581133480. doi: 10.1145/371920.371960. url: https://web.maths.unsw. edu.au/˜lafaye/www.searchlores.org/library/An%20Adaptive%20Model %20for%20Optimizing%20Performance%20of%20an%20Incremental%20Web% 20Crawler..htm (besucht am 24. 11. 2020).

[12] Carlos Castillo. “Effective Web Crawling”. Diss. University of Chile, Nov. 2004.

[13] Junghoo Cho, Hector Garcia-Molina und Lawrence Page. “Efficient craw- ling through URL ordering”. In: Computer Networks and ISDN Systems 30.1 (1998). Proceedings of the Seventh International World Wide Web Confe- rence, S. 161–172. issn: 0169-7552. doi: https://doi.org/10.1016/S0169- 7552(98)00108- 1. url: http://oak.cs.ucla.edu/˜cho/papers/cho- order.pdf.

[14] Junghoo Cho und Hector Garcia-Molina. “Effective Page Refresh Policies for Web Crawlers”. In: ACM Trans. Database Syst. 28.4 (Dez. 2003), S. 390– 426. issn: 0362-5915. doi: 10.1145/958942.958945. url: http://ilpubs. stanford.edu:8090/604/1/2003-44.pdf.

[15] Junghoo Cho und Hector Garcia-Molina. “Synchronizing a Database to Im- prove Freshness”. In: SIGMOD Rec. 29.2 (Mai 2000), S. 117–128. issn: 0163- 5808. doi: 10.1145/335191.335391. url: http://oak.cs.ucla.edu/˜cho/ papers/cho-synch.pdf.

80 Literatur

[16] Martijn Koster. Robots in the Web: threat or treat? Hrsg. von robotstxt.org. Reprinted with permission from ConneXions, Volume 9, No. 4, April 1995. 4. Mai 1995. url: https://www.robotstxt.org/threat-or-treat.html (besucht am 01. 12. 2020).

[17] Martijn Koster, Jonathon Fletcher, Lee McLoughlin u. a. Guidelines for Ro- bot Writers. 1993. url: https://www.robotstxt.org/guidelines.html (besucht am 01. 12. 2020).

[18] Junghoo Cho und Hector Garcia-Molina. “Parallel Crawlers”. In: Proceedings of the 11th International Conference on World Wide Web. WWW ’02. Hono- lulu, Hawaii, USA: Association for Computing Machinery, 2002, S. 124–135. isbn: 1581134495. doi: 10.1145/511446.511464. url: http://oak.cs. ucla.edu/˜cho/papers/cho-parallel.pdf.

[19] R. Fielding und J. Reschke. Hypertext Transfer Protocol (HTTP/1.1): Seman- tics and Content. Techn. Ber. Internet Engineering Task Force (IETF), Juni 2014. doi: 10 . 17487 / rfc7231. url: https : / / tools . ietf . org / html / rfc7231 (besucht am 11. 12. 2020).

[20] developer.chrome.com. User Agent Strings. 28. Feb. 2014. url: https : / / developer . chrome . com / docs / multidevice / user - agent/ (besucht am 12. 12. 2020).

[21] Nick Schonning u. a. Microsoft Edge User Agent String (Desktop). 16. Dez. 2019. url: https://docs.microsoft.com/en-us/microsoft-edge/web- platform/user-agent-string (besucht am 12. 12. 2020).

[22] developer.mozilla.org. Firefox user agent string reference. 25. Nov. 2019. url: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/User- Agent/Firefox (besucht am 12. 12. 2020).

[23] Carnegie Mellon University. The Official CAPTCHA Site. CAPTCHA: Telling Humans and Computers Apart Automatically. 2010. url: http://www.captc ha.net (besucht am 03. 12. 2020).

[24] developers.google.com. reCAPTCHA v3. 20. Juli 2020. url: https://devel opers.google.com/recaptcha/docs/v3 (besucht am 12. 12. 2020).

81 Literatur

[25] JonasCz u. a. A guide to preventing Webscraping. (Or at least making it har- der). 29. Nov. 2019. url: https://github.com/JonasCz/How-To-Prevent- Scraping (besucht am 02. 12. 2020).

[26] Shengye Wan, Yue Li und Kun Sun. “PathMarker: protecting web contents against inside crawlers”. In: Cybersecurity 2 (Dez. 2019). doi: 10.1186/s 42400-019-0023-1.

[27] Tthe Internet Archive. About the Internet Archive. 2021. url: https://arch ive.org/about/ (besucht am 31. 03. 2021).

[28] Scrapy developers. Scrapy Documentation. v2.4. 3. Feb. 2021.

[29] ASF Infrabot und Lewis John McGibbney. NutchTutorial. Crawl your first website. url: https : / / cwiki . apache . org / confluence / display / NUTC H / NutchTutorial # NutchTutorial - Crawlyourfirstwebsite (besucht am 08. 02. 2021).

[30] ASF Infrabot und Lewis John McGibbney. Home. Welcome to the Apache Nutch Wiki. 22. Dez. 2020. url: https://cwiki.apache.org/confluence/ display/NUTCH/ (besucht am 05. 02. 2021).

[31] The Apache Software Foundation. Welcome to the Apache Gora project! url: https://gora.apache.org (besucht am 06. 02. 2021).

[32] Mo Omer. AJAX/JavaScript Enabled Parsing with Apache Nutch and Seleni- um. 2014. url: https://www.soryy.com/blog/2014/ajax-javascript- enabled-parsing-apache-nutch-selenium/ (besucht am 06. 02. 2021).

[33] Mo Omer und Chris Mattmann. nutch-selenium. url: https://github.com/ momer/nutch-selenium (besucht am 05. 02. 2021).

[34] Mo Omer und Michael Joyce. nutch-selenium-grid-plugin. url: https://git hub.com/momer/nutch-selenium-grid-plugin (besucht am 06. 02. 2021).

[35] ASF Infrabot. WhiteListRobots. url: https://cwiki.apache.org/conflue nce/display/NUTCH/WhiteListRobots (besucht am 05. 02. 2021).

82 Literatur

[36] The Apache Software Foundation. Class HTMLMetaTags. 2019. url: https: //nutch.apache.org/apidocs/apidocs-1.16/org/apache/nutch/parse/ HTMLMetaTags.html (besucht am 08. 02. 2021).

[37] ASF Infrabot. FetchOptions. url: https://cwiki.apache.org/confluence/ display/NUTCH/FetchOptions (besucht am 05. 02. 2021).

[38] Pascal Dimassimo. How to re-crawl with Nutch. url: https://www.pascald imassimo.com/2010/06/11/how-to-re-crawl-with-nutch/ (besucht am 05. 02. 2021).

[39] ASF Infrabot. CountLinks. url: https://cwiki.apache.org/confluence/ display/NUTCH/CountLinks (besucht am 05. 02. 2021).

[40] Jorge Luis Betancourt. links-extractor. 22. Okt. 2015. url: https://github. com/jorgelbg/indexer-links (besucht am 05. 02. 2021).

[41] ASF Infrabot. SimilarityScoringFilter. url: https : / / cwiki . apache . or g / confluence / display / NUTCH / SimilarityScoringFilter (besucht am 05. 02. 2021).

[42] ASF Infrabot. NaiveBayesParseFilter. 18. Mai 2019. url: https://cwiki.a pache.org/confluence/display/NUTCH/NaiveBayesParseFilter (besucht am 05. 02. 2021).

[43] ASF Infrabot. Anthelion. 18. Mai 2019. url: https://cwiki.apache.org/ confluence/display/NUTCH/Anthelion (besucht am 05. 02. 2021).

[44] The Apache Software Foundation. Hadoop Cluster Setup. 26. Jan. 2016. url: https : / / hadoop . apache . org / docs / r2 . 7 . 2 / hadoop - project - dist / hadoop-common/ClusterSetup.html (besucht am 06. 02. 2021).

[45] ASF Infrabot. SetupProxyForNutch. 18. Mai 2019. url: https : / / cwiki . apache.org/confluence/display/NUTCH/SetupProxyForNutch (besucht am 05. 02. 2021).

[46] Julien Nioche. StormCrawler. JSoupParserBolt. url: https://github.co m / DigitalPebble / storm - crawler / wiki / JSoupParserBolt (besucht am 08. 02. 2021).

83 Literatur

[47] Jonathan Hedley. jsoup: Java HTML Parser. 2021. url: https://jsoup.org (besucht am 08. 02. 2021).

[48] Julien Nioche. StormCrawler. IndexingBolts. url: https://github.com/Digi talPebble/storm-crawler/wiki/IndexingBolts (besucht am 08. 02. 2021).

[49] DigitalPebble Ltd. Class SeleniumProtocol. 2020. url: https://stormcrawle r.net/docs/api/com/digitalpebble/stormcrawler/protocol/selenium/ SeleniumProtocol.html (besucht am 08. 02. 2021).

[50] DigitalPebble Ltd. Class RobotsFilter. 2020. url: https://stormcrawler. net/docs/api/com/digitalpebble/stormcrawler/filtering/robots/ RobotsFilter.html (besucht am 08. 02. 2021).

[51] DigitalPebble Ltd. Class RobotsTags. 2020. url: https://stormcrawler. net/docs/api/com/digitalpebble/stormcrawler/util/RobotsTags.html (besucht am 08. 02. 2021).

[52] Sebastian Nagel. StormCrawler. Configuration. url: https://github.com/ DigitalPebble/storm-crawler/wiki/Configuration.

[53] DigitalPebble Ltd. Interface HttpHeaders. 2020. url: https://stormcrawle r.net/docs/api/com/digitalpebble/stormcrawler/protocol/HttpHeade rs.html (besucht am 08. 02. 2021).

[54] DigitalPebble Ltd. Class AdaptiveScheduler. 2020. url: https://stormcra wler.net/docs/api/com/digitalpebble/stormcrawler/persistence/ AdaptiveScheduler.html (besucht am 15. 02. 2021).

[55] DigitalPebble Ltd. Class URLPartitioner. 2020. url: https://stormcrawle r.net/docs/api/com/digitalpebble/stormcrawler/util/URLPartitione r.html (besucht am 15. 02. 2021).

[56] DigitalPebble Ltd. Class RobotRules. 2020. url: https://stormcrawler. net/docs/api/com/digitalpebble/stormcrawler/protocol/RobotRules. html (besucht am 15. 02. 2021).

84 Literatur

[57] DigitalPebble Ltd. A collection of resources for building low-latency, scalable web crawlers on Apache Storm. 2021. url: https : / / stormcrawler . net (besucht am 08. 02. 2021).

[58] Sebastian Nagel. StormCrawler. Protocols. url: https://github.com/Digit alPebble/storm-crawler/wiki/Protocols.

[59] SciPy-Community. SciPy Reference Guide. Release 1.6.1. 31. Dez. 2020, S. 2985. url: https://docs.scipy.org/doc/scipy-1.6.0/scipy-ref-1.6.0.pdf (besucht am 03. 02. 2021).

[60] tidyverse u. a. rvest. url: https://github.com/tidyverse/rvest (besucht am 11. 02. 2021).

[61] Matthijs van den Bos u. a. php-spider. 26. Okt. 2020. url: https://github. com/mvdbos/php-spider.

[62] Steven (sjdirect) u. a. Abot. url: https://github.com/sjdirect/abot/ (besucht am 11. 02. 2021).

[63] Steven (sjdirect). AbotX. url: https://github.com/sjdirect/abotx/ (be- sucht am 11. 02. 2021).

[64] Yingda Zhu. Webster Documentation. Task. url: http://webster.zhuying da.com/api/task.html (besucht am 10. 02. 2021).

[65] Kai Chen. How to use proxies. 2017. url: https://icrawler.readthedocs. io/en/latest/proxy.html (besucht am 10. 02. 2021).

[66] Sebastian Nagel. “Web Crawling with Apache Nutch”. In: ApacheCon EU 2014. 18. Nov. 2014. url: https://www.slideshare.net/sebastian_nagel/ aceu2014-snagelwebcrawlingnutch (besucht am 14. 02. 2021).

[67] Jake Dodd. “Storm Crawler”. In: ApacheCon North America 2015. 2015. url: https://www.slideshare.net/ontopic/storm-crawler-apacheconna2015 (besucht am 14. 02. 2021).

[68] Daohan Chong u. a. Scylla. url: https://github.com/imWildCat/scylla (besucht am 22. 03. 2021).

85 Literatur

[69] WhatIsMyBrowser Developers. User Agents Database. 2021. url: https:// developers.whatismybrowser.com/useragents/database/ (besucht am 22. 03. 2021).

[70] rejoiceinhope. scrapy-user-agents. 24. Okt. 2018. url: https://github.com/ rejoiceinhope/crawler- demo/tree/master/crawling- basic/scrapy_ user_agents (besucht am 22. 03. 2021).

[71] Mikhail Korobov u. a. scrapy-rotating-proxies. url: https://github.com/ TeamHG-Memex/scrapy-rotating-proxies (besucht am 22. 03. 2021).

[72] Clement Denoix u. a. Scrapy with selenium. url: https : / / github . com / clemfromspace/scrapy-selenium (besucht am 22. 03. 2021).

[73] The Tuesday Project Ltd. Build Web Apps with Nothing but Python. 2021. url: https://anvil.works (besucht am 30. 03. 2021).

[74] Apify. Make the webwork for you. 2021. url: https://apify.com (besucht am 31. 03. 2021).

[75] Screaming Frog Ltd. SEO, Search Engine Marketing and Optimisation Agency. 2021. url: https://www.screamingfrog.co.uk (besucht am 31. 03. 2021).

[76] oxylabs.io. Real-Time Crawler: Achieve 100 Percent Data Delivery. 2021. url: https://oxylabs.io/products/real-time-crawler (besucht am 31. 03. 2021).

[77] DeepCrawl. Grow fearlessly with the number 1 technical SEO platform. 2021. url: https://www.deepcrawl.com (besucht am 31. 03. 2021).

86 Bildverzeichnis

Bildverzeichnis

2.1 Aufbau eines modernen Crawlers...... 12

2.2 Beispielhafter zeitlicher Verlauf von F (ei; t) und A(ei; t)...... 22

5.1 Notenverteilung der ungewichteten Bewertung...... 39 5.2 Notenverteilung der gewichteten Bewertung...... 40

6.1 Architektur von Scrapy [28]...... 52 6.2 Architektur von Apache Nutch [66]...... 53 6.3 Workflow von StormCrawler [67]...... 55

8.1 Grafische Benutzeroberfl¨ache des Test Tools...... 70 8.2 Ausgabe des Pratikumstools...... 76

87 Tabellenverzeichnis

Tabellenverzeichnis

4.1 Bewertung der Datenextraktionsmechanismen...... 31 4.2 Bewertung der Datenbankanbindung...... 32 4.3 Bewertung der JavaScript Unterstutzung¨ ...... 32 4.4 Bewertung der Exportfunktion...... 33 4.5 Bewertung der Nutzung des REP...... 33 4.6 Bewertung der Request Header Anpassung...... 34 4.7 Bewertung der integrierten Crawling-Richtlinien...... 34 4.8 Bewertung des verteilten bzw. parallelen Crawlings...... 35 4.9 Bewertung der Proxyserverunterstutzung¨ ...... 35

5.1 Tools der engeren Auswahl...... 37 5.2 Tools der engeren Auswahl sortiert nach ungewichteter Gesamtnote. 38 5.3 Gewichtung der Bewertungskriterien...... 40 5.4 Tools der engeren Auswahl sortiert nach gewichteter Gesamtnote... 41 5.5 Tools der engeren Auswahl mit eingef¨arbten Noten 1 (grun)¨ und 6 (rot) 48

7.1 Ergebnisse der Scrapy Spider mit einer Seed-URL...... 59 7.2 Ergebnisse der Scrapy Spider mit erweiterten Seed-URLs...... 60 7.3 Ergebnisse der Nutch Spider mit einer Seed-URL nach jeweils zehn Iterationen (Laufzeit ungef¨ahr 3h)...... 63 7.4 Ergebnisse der Nutch Spider mit erweiterten Seed-URLs nach jeweils zehn Iterationen (Laufzeit ungef¨ahr 3h)...... 63 7.5 Ergebnisse von StormCrawler...... 67 7.6 Gegenuberstellung¨ der Crawl-Ergebnisse verschiedener Werkzeuge (Lauf- zeit jeweils ungef¨ahr 3h...... 67

A.1 Liste von h¨andisch gesammelten Crawling-Werkzeugen...... 96

88 Codeverzeichnis

Codeverzeichnis

2.1 Beispiel einer robots.txt...... 15 2.2 M¨ogliche Robots-META-Tags...... 16

5.1 Python Skript fur¨ Shapiro-Wilk-Test...... 47

7.1 Apache Zookeeper Konfigurationsdatei...... 64 7.2 Apache Storm Konfigurationsdatei...... 64 7.3 Kibana Konfigurationsdatei...... 65

8.1 Methode generateScrapySettings(self)...... 72 8.2 Methode scrapy setDelay(self, custom settings)...... 73 8.3 Methode storm setDelay(self, config dict)...... 74 8.4 Inhalt von https://www.hs-wismar.de/robots.txt ...... 75

B.1 Scrapy Skript fur¨ den Basis Spider...... 98 B.2 Scrapy Skript fur¨ den Spider mit rotierendem User-Agent...... 99 B.3 Scrapy Skript fur¨ den Spider mit rotierenden Proxyservern...... 100 B.4 Scrapy Skript fur¨ den REP achtenden Spider...... 101 B.5 Scrapy Skript fur¨ den Spider mit headless Browser...... 102 B.6 Scrapy Skript fur¨ den h¨oflichen Spider...... 103 B.7 Scrapy Skript fur¨ den optimierten Spider...... 104 B.8 Scrapy Skript fur¨ den optimierten headless Browser Spider...... 105

C.1 nutch-site.xml fur¨ den Basis Spider...... 107 C.2 nutch-site.xml fur¨ den Spider mit rotierendem User-Agent...... 108 C.3 nutch-site.xml fur¨ den Spider mit rotierenden Proxyservern...... 109 C.4 nutch-site.xml fur¨ den REP achtenden Spider...... 110 C.5 nutch-site.xml fur¨ den Spider mit headless Browser Selenium..... 111 C.6 nutch-site.xml fur¨ den h¨oflichen Spider...... 112 C.7 nutch-site.xml fur¨ den optimierten Spider...... 113

D.1 Stormcrawler Basis-Konfiguration...... 115

89 Codeverzeichnis

D.2 Erweiterung der Stormcrawler Basis-Konfiguration fur¨ einen Spider mit rotierendem User-Agent...... 116 D.3 Erweiterung der Stormcrawler Basis-Konfiguration fur¨ einen Spider mit rotierenden Proxyservern...... 116 D.4 Erweiterung der Stormcrawler Basis-Konfiguration fur¨ einen REP missachtenden Spider...... 116 D.5 Erweiterung der Stormcrawler Basis-Konfiguration fur¨ einen h¨oflichen Spider...... 116 D.6 Stormcrawler Testkonfiguration...... 117

90 Abkurzungen¨

Abkurzungen¨

API Anwendungsschnittstelle, 43, 46

CSS Cascading Style Sheet, 12, 25, 28

DDoS Distributed Denial of Service, 22

DoS Denial of Service, 16, 22, 29

GUI grafischen Benutzeroberfl¨ache,4, 28, 69

HTML Hypertext Markup Language, 11–14, 25, 26, 28, 31, 32, 42, 45, 53, 54

HTTP Hypertext Transfer Protocol, 16, 24, 33, 45, 57, 60

HTTPS HTTP Secure, 45

IDF inversen Dokumenth¨aufigkeit, 17

IP Internetprotokoll, 24, 25, 29, 35, 43, 44, 46, 58, 61, 70, 74, 94

JSON JavaScript Object Notation, 74

MIME-Type Internet Media Type, 19

PCIe Peripheral Component Interconnect Express, 17

REP Robots Exclusion Protocol,4,5, 11–15, 23, 29, 33, 43, 44, 46, 56, 58, 59, 61, 62, 66, 69, 74, 89, 90

SDK Software Development Kit, 46, 54

SSD Solid State Drive, 17

TF relative Vorkommensh¨aufigkeit, 17

TFIDF TF-IDF-Maß, 17, 18

TLD Top-Level-Domain, 19

91 Abkurzungen¨

URL Uniform Resource Locator, 11–15, 19, 23, 24, 26, 28, 29, 31, 43, 44, 46, 51–54, 57–63, 67, 69, 70, 73, 74, 94

XML Extensible Markup Language, 60

YAML YAML Ain’t Markup Language, 69, 73

92 Selbstst¨andigkeitserkl¨arung

Selbstst¨andigkeitserkl¨arung

Hiermit erkl¨are ich, dass ich die vorliegende Arbeit selbst¨andig verfasst und keine anderen als die angegebenen Hilfsmittel benutzt habe.

Die Stellen der Arbeit, die anderen Quellen im Wortlaut oder dem Sinn nach ent- nommen wurden, sind durch Angaben der Herkunft kenntlich gemacht. Dies gilt auch fur¨ Zeichnungen, Skizzen, bildliche Darstellungen sowie fur¨ Quellen aus dem Internet.

Ich erkl¨are ferner, dass ich die vorliegende Arbeit in keinem anderen Prufungsverfahren¨ als Prufungsarbeit¨ eingereicht habe oder einreichen werde.

Die eingereichte schriftliche Fassung entspricht der auf dem Medium gespeicherten Fassung.

Ort, Datum Unterschrift

93 Thesen

Thesen

1. Um die Ausfuhrung¨ eines Crawlers auf einer Webseite zu verschleiern, reicht ein rotierender User-Agent-String nicht aus.

2. Die Einspeisung von mehreren Seed-URLs der gleichen Domain fuhrt¨ mittel- fristig zu mehr Ergebnissen.

3. Je umfangreicher die Dokumentation eines Crawling-Werkzeugs, desto besser wird es im Bewertungsschema abschneiden.

4. Die hinter dem Crawler stehende Softwarearchitekture beeinflusst die Anzahl der Ergebnisse pro Zeiteinheit.

5. Mit Nutzung eines headless Browsers werden mehr Verlinkungen und somit mehr Webseiten und Daten gefunden, als wenn keiner genutzt wird.

6. Die Verwendung eines headless Browsers ist n¨otig, um aussagekr¨aftige Ergeb- nisse durch einen Crawl zu erhalten.

7. Eine wechselndeIP-Adresse aus einem Pool von Proxyservern verhindert re- lativ zuverl¨assig ein Einschr¨ankung des Crawlers durch Webseitenadministra- toren.

94 Anhang A. Liste von h¨andisch gesammelten Crawling-Werkzeugen

A Liste von h¨andisch gesammelten Crawling-Werkzeugen

95 Anhang A. Liste von h¨andisch gesammelten Crawling-Werkzeugen

1 Abot 57 MechanicalSoup 2 AbotX 58 Mechanize 3 ACHE Crawler 59 Metis 4 Andjing Web Crawler 0.01 60 Mnogosearch 5 Apache Nutch 61 Mozenda 6 Aperture Framework 62 Node-Crawler 7 Apify 63 Node-osmosis 8 Arachnid 64 Norconex 9 Arachnode.net 65 Octoparse 10 Arale 66 Oncrawl 11 Aspseek 67 Open Source Large-Scale Website Crawwwler 12 BeautifulSoup 68 Open Web Spider 13 Bitacuity Spider 69 OpenSearchServer 14 Bixo Web Mining Toolkit 70 Opese Opense 15 BUbiNG 71 Parsehub 16 Ccrawler Web Crawler Engine 72 Pavuk 17 Cloud Crawler Version 0.1 73 Pholcus 18 Cola 74 Php-spider 19 Colly 75 Portia 20 Crawler4j 76 ProWebScraper 21 Crawley 77 Pspider 22 Dataparksearch Engine 78 Psycreep 23 Deepcrawl 79 PySpider 24 Dexi.io 80 Rvest 25 DiffBot 81 ScrapeBox 26 Distributed Website Crawler 82 ScrapingBee 27 Dom-crawler 83 ScrapingHub 28 DotnetSpider 84 Scrapy 29 Dynomapper 85 ScreapingFrog 30 FMiner 86 Simplecrawler 31 Frontera 87 SimpleScraper.io 32 Gecco 88 SkyScraper 33 GNU WGET 89 Sparkler 34 Gopa 90 Spatie / Crawler 35 Goutte 91 Sphider Php Search Engine 36 Grab 92 Spiderman 37 Grub Next Generation 93 Spidy Web Crawler 38 Hawk 94 StormCrawler 39 Headless chrome crawler 95 Supercrawler 40 Heritrix 96 Ubicrawler 41 Hounder 97 Uwe Hunfeld?s Php Crawler 42 Ht://Dig 98 Web Crawler By Diffbot 43 Httrack 99 Web Harvest Project 44 Hyper Estraier 100 Web-scraper 45 Hyperspider 101 WebCollector 46 I[web]crawler 102 Webeater 47 Import.io 103 WebHarvy 48 Jaunt 104 Weblech 49 Jauntium 105 Webmagic 50 JoBo 106 Webscraper.io 51 Js-crawler 107 WebSPHINX 52 Jspider 108 Webster 53 Kimurai 109 X-ray 54 Lucene Advanced Retrieval Machine (Larm) 110 Xapian Project 55 Marple 111 yacy 56 Matteo Radaelli’s Ebot

Tabelle A.1 Liste von h¨andisch gesammelten Crawling-Werkzeugen

96 Anhang B. Code Anhang: Scrapy

B Code Anhang: Scrapy

97 Anhang B. Code Anhang: Scrapy

1 from scrapy.spiders import CrawlSpider, Rule 2 from scrapy.linkextractors import LinkExtractor 3 import validators 4

5 6 class MyBaseSpider(CrawlSpider): 7 name= "werner_scrapyBot_0" 8 9 custom_settings={ 10 'BOT_NAME': 'werner_scrapyBot_0', 11 'USER_AGENT': "Mozilla/5.0 (Windows NT 6.1; WOW64) ,→ AppleWebKit/537.36 (KHTML, like Gecko) " 12 "Chrome/34.0.1847.131 Safari/537.36", 13 'HTTPPROXY_ENABLED': False, 14 'ROBOTSTXT_OBEY': False, 15 'RANDOMIZE_DOWNLOAD_DELAY': False, 16 'COOKIES_ENABLED': False, 17 } 18 19 allowed_domains=[ 'hs-wismar.de'] 20 start_urls=[ 'https://www.hs-wismar.de/'] 21 22 rules=[ 23 Rule( 24 LinkExtractor(unique=True), 25 callback='parse', 26 ), 27 ] 28 29 def __init__(self,*args,**kwargs): 30 super(MyBaseSpider, self).__init__(*args,**kwargs) 31 32 def parse(self, response,**kwargs): 33 # increment value of pages_crawled 34 self.crawler.stats.inc_value('custom_pages_crawled') 35 # parse given url for all -tags and put their href value into a ,→ list 36 next_pages= response.css( 'a::attr(href)').extract() 37 # check for valid url-links in list 38 next_pages= self.check_urls(next_pages) 39 # follow all valid links 40 if next_pages is not None: 41 response.follow_all(next_pages, callback=self.parse) 42 43 # method doing validity checking of given urls 44 @staticmethod 45 def check_urls(urls): 46 valid_urls=[] 47 for url in urls: 48 if validators.url(url): 49 valid_urls.append(url) 50 return valid_urls

Code B.1 Scrapy Skript fur¨ den Basis Spider

98 Anhang B. Code Anhang: Scrapy

1 from scrapy.spiders import CrawlSpider, Rule 2 from scrapy.linkextractors import LinkExtractor 3 import validators 4 5 6 class MyUserAgentSpider(CrawlSpider): 7 name= "werner_scrapyBot_1" 8 9 custom_settings={ 10 'BOT_NAME': 'werner_scrapyBot_1', 11 'HTTPPROXY_ENABLED': False, 12 'ROBOTSTXT_OBEY': False, 13 'RANDOMIZE_DOWNLOAD_DELAY': False, 14 'COOKIES_ENABLED': False, 15 } 16 17 DOWNLOADER_MIDDLEWARES={ 18 'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None, 19 'scrapy_user_agents.middlewares.RandomUserAgentMiddleware': 400, 20 } 21 22 allowed_domains=[ 'hs-wismar.de'] 23 start_urls=[ 'https://www.hs-wismar.de'] 24 25 rules=[ 26 Rule( 27 LinkExtractor(unique=True), 28 callback='parse', 29 ), 30 ] 31 32 def __init__(self,*args,**kwargs): 33 super(MyUserAgentSpider, self).__init__(*args,**kwargs) 34 35 def parse(self, response,**kwargs): 36 self.crawler.stats.inc_value('custom_pages_crawled') 37 next_pages= response.css( 'a::attr(href)').extract() 38 next_pages= self.check_urls(next_pages) 39 if next_pages is not None: 40 response.follow_all(next_pages, callback=self.parse) 41 42 @staticmethod 43 def check_urls(urls): 44 valid_urls=[] 45 for url in urls: 46 if validators.url(url): 47 valid_urls.append(url) 48 return valid_urls

Code B.2 Scrapy Skript fur¨ den Spider mit rotierendem User-Agent

99 Anhang B. Code Anhang: Scrapy

1 from scrapy.spiders import CrawlSpider, Rule 2 from scrapy.linkextractors import LinkExtractor 3 import validators 4

5 6 class MyProxySpider(CrawlSpider): 7 name= "werner_scrapyBot_2" 8 9 custom_settings={ 10 'BOT_NAME': 'werner_scrapyBot_2', 11 'HTTPPROXY_ENABLED': False, 12 'ROBOTSTXT_OBEY': False, 13 'RANDOMIZE_DOWNLOAD_DELAY': False, 14 'COOKIES_ENABLED': False, 15 } 16 17 ROTATING_PROXY_LIST=[ 18 '127.0.0.1:8081', #Scylla-Server 19 ] 20 21 DOWNLOADER_MIDDLEWARES={ 22 'rotating_proxies.middlewares.RotatingProxyMiddleware': 800, 23 'rotating_proxies.middlewares.BanDetectionMiddleware': 800, 24 } 25 26 allowed_domains=[ 'hs-wismar.de'] 27 start_urls=[ 'https://www.hs-wismar.de'] 28 29 rules=[ 30 Rule( 31 LinkExtractor(unique=True), 32 callback='parse', 33 ), 34 ] 35 36 def __init__(self,*args,**kwargs): 37 super(MyProxySpider, self).__init__(*args,**kwargs) 38 39 def parse(self, response,**kwargs): 40 self.crawler.stats.inc_value('custom_pages_crawled') 41 next_pages= response.css( 'a::attr(href)').extract() 42 next_pages= self.check_urls(next_pages) 43 if next_pages is not None: 44 response.follow_all(next_pages, callback=self.parse) 45 46 @staticmethod 47 def check_urls(urls): 48 valid_urls=[] 49 for url in urls: 50 if validators.url(url): 51 valid_urls.append(url) 52 return valid_urls

Code B.3 Scrapy Skript fur¨ den Spider mit rotierenden Proxyservern

100 Anhang B. Code Anhang: Scrapy

1 from scrapy.spiders import CrawlSpider, Rule 2 from scrapy.linkextractors import LinkExtractor 3 import validators 4 5 6 class MyRobotsSpider(CrawlSpider): 7 name= "werner_scrapyBot_3" 8 9 custom_settings={ 10 'BOT_NAME': 'werner_scrapyBot_3', 11 'USER_AGENT': "Mozilla/5.0 (Windows NT 6.1; WOW64) ,→ AppleWebKit/537.36 (KHTML, like Gecko) " 12 "Chrome/34.0.1847.131 Safari/537.36", 13 'HTTPPROXY_ENABLED': False, 14 'ROBOTSTXT_OBEY': True, 15 'RANDOMIZE_DOWNLOAD_DELAY': False, 16 'COOKIES_ENABLED': False, 17 } 18 19 allowed_domains=[ 'hs-wismar.de'] 20 start_urls=[ 'https://www.hs-wismar.de'] 21 22 rules=[ 23 Rule( 24 LinkExtractor(unique=True), 25 callback='parse', 26 ), 27 ] 28 29 def __init__(self,*args,**kwargs): 30 super(MyRobotsSpider, self).__init__(*args,**kwargs) 31 32 def parse(self, response,**kwargs): 33 self.crawler.stats.inc_value('custom_pages_crawled') 34 next_pages= response.css( 'a::attr(href)').extract() 35 next_pages= self.check_urls(next_pages) 36 if next_pages is not None: 37 response.follow_all(next_pages, callback=self.parse) 38 39 @staticmethod 40 def check_urls(urls): 41 valid_urls=[] 42 for url in urls: 43 if validators.url(url): 44 valid_urls.append(url) 45 return valid_urls

Code B.4 Scrapy Skript fur¨ den REP achtenden Spider

101 Anhang B. Code Anhang: Scrapy

1 from scrapy.spiders import CrawlSpider 2 import validators 3 from shutil import which 4 from scrapy_selenium import SeleniumRequest 5 6 7 class MyHeadlessBrowserSpider(CrawlSpider): 8 name= "werner_scrapyBot_4" 9 10 custom_settings={ 11 'BOT_NAME': 'werner_scrapyBot_4', 12 'USER_AGENT': "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like ,→ Gecko) " 13 "Chrome/34.0.1847.131 Safari/537.36", 14 'HTTPPROXY_ENABLED': False, 15 'ROBOTSTXT_OBEY': False, 16 'RANDOMIZE_DOWNLOAD_DELAY': False, 17 'COOKIES_ENABLED': False, 18 'SELENIUM_DRIVER_NAME': 'firefox', 19 'SELENIUM_DRIVER_EXECUTABLE_PATH': which('geckodriver'), 20 'SELENIUM_DRIVER_ARGUMENTS':['-headless'], 21 } 22 23 DOWNLOADER_MIDDLEWARES={ 'scrapy_selenium.SeleniumMiddleware': 800} 24 25 allowed_domains=[ 'hs-wismar.de'] 26 start_urls=[ 'https://www.hs-wismar.de/'] 27 28 def start_requests(self): 29 for url in self.start_urls: 30 yield SeleniumRequest(url=url, wait_time=0, screenshot=False, callback=self.parse, ,→ dont_filter=True) 31 32 def parse(self, response,**kwargs): 33 self.crawler.stats.inc_value('custom_pages_crawled') 34 next_pages= response.css( 'a::attr(href)').extract() 35 next_pages= self.check_urls(next_pages) 36 next_pages= self.check_domains(self.allowed_domains, next_pages) 37 for url in next_pages: 38 yield SeleniumRequest(url=url, wait_time=0, screenshot=False, callback=self.parse, ,→ dont_filter=True) 39 40 @staticmethod 41 def check_urls(urls): 42 valid_urls=[] 43 for url in urls: 44 if validators.url(url): 45 valid_urls.append(url) 46 return valid_urls 47 48 @staticmethod 49 def check_domains(domains, urls): 50 valid_urls=[] 51 for url in urls: 52 for domain in domains: 53 if domain in url: 54 valid_urls.append(url) 55 return valid_urls

Code B.5 Scrapy Skript fur¨ den Spider mit headless Browser

102 Anhang B. Code Anhang: Scrapy

1 from scrapy.spiders import CrawlSpider, Rule 2 from scrapy.linkextractors import LinkExtractor 3 import validators 4

5 6 class MyPolitenessSpider(CrawlSpider): 7 name= "werner_scrapyBot_5" 8 9 custom_settings={ 10 'BOT_NAME': 'werner_scrapyBot_5', 11 'CONCURRENT_REQUESTS': 16, 12 'CONCURRENT_REQUESTS_PER_DOMAIN':8, 13 'DOWNLOAD_DELAY':2, 14 'RANDOMIZE_DOWNLOAD_DELAY': True, # 0.5 to 1.5 times ,→ DOWNLOAD_DELAY 15 #'AUTOTHROTTLE_ENABLED': True, 16 #'AUTOTHROTTLE_START_DELAY': 2.0, 17 #'AUTOTHROTTLE_MAX_DELAY': 4.0, 18 #'AUTOTHROTTLE_DEBUG': True, 19 'USER_AGENT': "Mozilla/5.0 (Windows NT 6.1; WOW64) ,→ AppleWebKit/537.36 (KHTML, like Gecko) " 20 "Chrome/34.0.1847.131 Safari/537.36", 21 'HTTPPROXY_ENABLED': False, 22 'ROBOTSTXT_OBEY': False, 23 'COOKIES_ENABLED': False, 24 } 25 26 allowed_domains=[ 'hs-wismar.de'] 27 start_urls=[ 'https://www.hs-wismar.de/'] 28 29 rules=[ 30 Rule( 31 LinkExtractor(unique=True), 32 callback='parse', 33 ), 34 ] 35 36 def __init__(self,*args,**kwargs): 37 super(MyPolitenessSpider, self).__init__(*args,**kwargs) 38 39 def parse(self, response,**kwargs): 40 self.crawler.stats.inc_value('custom_pages_crawled') 41 next_pages= response.css( 'a::attr(href)').extract() 42 next_pages= self.check_urls(next_pages) 43 if next_pages is not None: 44 response.follow_all(next_pages, callback=self.parse) 45 46 @staticmethod 47 def check_urls(urls): 48 valid_urls=[] 49 for url in urls: 50 if validators.url(url): 51 valid_urls.append(url) 52 return valid_urls

Code B.6 Scrapy Skript fur¨ den h¨oflichen Spider 103 Anhang B. Code Anhang: Scrapy

1 from scrapy.spiders import CrawlSpider 2 import validators 3 4 5 class MyCustomSpider(CrawlSpider): 6 name= "werner_scrapyBot_6" 7 8 custom_settings={ 9 'BOT_NAME': 'werner_scrapyBot_6', 10 'CONCURRENT_REQUESTS': 16, 11 'CONCURRENT_REQUESTS_PER_DOMAIN':8, 12 'DOWNLOAD_DELAY':2, 13 'RANDOMIZE_DOWNLOAD_DELAY': True, 14 'HTTPPROXY_ENABLED': False, 15 'ROBOTSTXT_OBEY': True, 16 'COOKIES_ENABLED': True, 17 } 18 19 ROTATING_PROXY_LIST=[ 20 '127.0.0.1:8081', #Scylla-Server 21 ] 22 23 DOWNLOADER_MIDDLEWARES={ 24 'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None, 25 'scrapy_user_agents.middlewares.RandomUserAgentMiddleware': 400, 26 'rotating_proxies.middlewares.RotatingProxyMiddleware': 800, 27 'rotating_proxies.middlewares.BanDetectionMiddleware': 800, 28 } 29 30 allowed_domains=[ 'hs-wismar.de'] 31 start_urls=[ 'https://www.hs-wismar.de'] 32 33 def parse(self, response,**kwargs): 34 self.crawler.stats.inc_value('custom_pages_crawled') 35 next_pages= response.css( 'a::attr(href)').extract() 36 next_pages= self.check_urls(next_pages) 37 if next_pages is not None: 38 response.follow_all(next_pages, callback=self.parse) 39 40 @staticmethod 41 def check_urls(urls): 42 valid_urls=[] 43 for url in urls: 44 if validators.url(url): 45 valid_urls.append(url) 46 return valid_urls

Code B.7 Scrapy Skript fur¨ den optimierten Spider

104 Anhang B. Code Anhang: Scrapy

1 from scrapy.spiders import CrawlSpider 2 import validators 3 from shutil import which 4 from scrapy_selenium import SeleniumRequest 5 6 7 class MyCustomHeadlessSpider(CrawlSpider): 8 name= "werner_scrapyBot_6" 9 10 custom_settings={ 11 'BOT_NAME': 'werner_scrapyBot_6', 12 'CONCURRENT_REQUESTS': 16, 13 'CONCURRENT_REQUESTS_PER_DOMAIN':8, 14 'DOWNLOAD_DELAY':2, 15 'HTTPPROXY_ENABLED': False, 16 'ROBOTSTXT_OBEY': True, 17 'COOKIES_ENABLED': True, 18 'SELENIUM_DRIVER_NAME': 'firefox', 19 'SELENIUM_DRIVER_EXECUTABLE_PATH': which('geckodriver'), 20 'SELENIUM_DRIVER_ARGUMENTS':['-headless'], 21 } 22 23 #ROTATING_PROXY_LIST = ['127.0.0.1:8081'] 24 25 DOWNLOADER_MIDDLEWARES={ 26 'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None, 27 'scrapy_user_agents.middlewares.RandomUserAgentMiddleware': 400, 28 #'rotating_proxies.middlewares.RotatingProxyMiddleware': 800, 29 #'rotating_proxies.middlewares.BanDetectionMiddleware': 800, 30 'scrapy_selenium.SeleniumMiddleware': 800 31 } 32 33 allowed_domains=[ 'hs-wismar.de'] 34 start_urls=[ 'https://www.hs-wismar.de'] 35 36 def start_requests(self): 37 for url in self.start_urls: 38 yield SeleniumRequest(url=url, wait_time=0, screenshot=False, callback=self.parse, ,→ dont_filter=True) 39 40 def parse(self, response,**kwargs): 41 self.crawler.stats.inc_value('custom_pages_crawled') 42 next_pages= response.css( 'a::attr(href)').extract() 43 next_pages= self.check_urls(next_pages) 44 next_pages= self.check_domains(self.allowed_domains, next_pages) 45 for url in next_pages: 46 yield SeleniumRequest(url=url, wait_time=0, screenshot=False, callback=self.parse, ,→ dont_filter=True) 47 48 @staticmethod 49 def check_urls(urls): 50 valid_urls=[] 51 for url in urls: 52 if validators.url(url): 53 valid_urls.append(url) 54 return valid_urls 55 56 @staticmethod 57 def check_domains(domains, urls): 58 valid_urls=[] 59 for url in urls: 60 for domain in domains: 61 if domain in url: 62 valid_urls.append(url) 63 return valid_urls

Code B.8 Scrapy Skript fur¨ den optimierten headless Browser Spider

105 Anhang C. Code Anhang: Apache Nutch

C Code Anhang: Apache Nutch

106 Anhang C. Code Anhang: Apache Nutch

1 2 3 4 5 6 7 http.agent.name 8 werner_nutchspider_0 9 10 11 12 http.agent.description 13 nutch spider with no limitation 14 15 16 17 fetcher.server.delay 18 0.0 19 20 21 22 htmlunit.enable.javascript 23 false 24 25 26

Code C.1 nutch-site.xml fur¨ den Basis Spider

107 Anhang C. Code Anhang: Apache Nutch

1 2 3 4 5 6 7 http.agent.name 8 werner_nutchspider_1 9 10 11 12 http.agent.description 13 nutch spider with rotating user-agents 14 15 16 17 http.agent.rotate 18 true 19 20 21 22 fetcher.server.delay 23 0.0 24 25 26 27 htmlunit.enable.javascript 28 false 29 30 31

Code C.2 nutch-site.xml fur¨ den Spider mit rotierendem User-Agent

108 Anhang C. Code Anhang: Apache Nutch

1 2 3 4 5 6 7 http.agent.name 8 werner_nutchspider_2 9 10 11 12 http.agent.description 13 nutch spider with rotating proxies 14 15 16 17 http.proxy.host 18 127.0.0.1 19 20 21 22 http.proxy.port 23 8081 24 25 26 27 fetcher.server.delay 28 0.0 29 30 31 32 htmlunit.enable.javascript 33 false 34 35 36

Code C.3 nutch-site.xml fur¨ den Spider mit rotierenden Proxyservern

109 Anhang C. Code Anhang: Apache Nutch

1 2 3 4 5 6 7 http.agent.name 8 werner_nutchspider_3 9 10 11 12 http.agent.description 13 nutch spider which obeys to REP 14 15 16 17 http.robot.rules.whitelist 18 19 20 21 22 fetcher.server.delay 23 0.0 24 25 26 27 indexer.delete.robots.noindex 28 true 29 30 31 32 htmlunit.enable.javascript 33 false 34 35 36

Code C.4 nutch-site.xml fur¨ den REP achtenden Spider

110 Anhang C. Code Anhang: Apache Nutch

1 2 3 4 5 6 7 http.agent.name 8 werner_nutchspider_4 9 10 11 12 http.agent.description 13 nutch spider with headless browser 14 15 16 17 fetcher.server.delay 18 0.0 19 20 21 22 selenium.enable.headless 23 true 24 25 26 27 plugin.excludes 28 29 30 31 32 selenium.driver 33 chrome 34 35 36 37 selenium.grid.driver 38 chrome 39 40 41 42 selenium.grid.binary 43 /usr/bin/chromedriver 44 45 46 47 page.load.delay 48 3 49 50 51

Code C.5 nutch-site.xml fur¨ den Spider mit headless Browser Selenium

111 Anhang C. Code Anhang: Apache Nutch

1 2 3 4 5 6 7 http.agent.name 8 werner_nutchspider_5 9 10 11 12 http.agent.description 13 nutch spider which disobey REP but is polite 14 15 16 17 fetcher.server.delay 18 5.0 19 20 21 22 fetcher.server.min.delay 23 30.0 24 25 26 27 htmlunit.enable.javascript 28 false 29 30 31

Code C.6 nutch-site.xml fur¨ den h¨oflichen Spider

112 Anhang C. Code Anhang: Apache Nutch

1 2 3 4 5 6 7 http.agent.name 8 werner_nutchspider_6 9 10 11 12 http.agent.email 13 14 15 16 17 http.agent.rotate 18 true 19 20 21 22 http.proxy.host 23 127.0.0.1 24 25 26 27 http.proxy.port 28 8081 29 30 31 32 selenium.enable.headless 33 true 34 35 36 37 plugin.excludes 38 39 40 41 42 selenium.driver 43 chrome 44 45 46 47 selenium.grid.driver 48 chrome 49 50 51 52 selenium.grid.binary 53 /usr/bin/chromedriver 54 55 56 57 fetcher.server.delay 58 4 59 60 61

Code C.7 nutch-site.xml fur¨ den optimierten Spider

113 Anhang D. Code Anhang: Stromcrawler

D Code Anhang: Stromcrawler

114 Anhang D. Code Anhang: Stromcrawler

1 config: 2 topology.workers: 1 3 topology.message.timeout.secs: 300 4 topology.max.spout.pending: 100 5 topology.debug: false 6 7 topology.worker.childopts: "-Xmx2g -Djava.net.preferIPv4Stack=true" 8 9 topology.kryo.register: 10 - com.digitalpebble.stormcrawler.Metadata 11 12 metadata.persist: 13 - _redirTo 14 - error.cause 15 - error.source 16 - isSitemap 17 - isFeed 18 19 parsefilters.config.file: "parsefilters.json" 20 urlfilters.config.file: "urlfilters.json" 21 22 fetchInterval.default: 1440 23 fetchInterval.fetch.error: 120 24 fetchInterval.error: -1 25 fetcher.threads.number: 50 26 27 textextractor.exclude.tags: 28 - STYLE 29 - SCRIPT 30 31 indexer.url.fieldname: "url" 32 indexer.text.fieldname: "content" 33 indexer.canonical.name: "canonical" 34 indexer.md.mapping: 35 - parse.title=title 36 - parse.keywords=keywords 37 - parse.description=description 38 - domain=domain 39 40 topology.metrics.consumer.register: 41 - class: "org.apache.storm.metric.LoggingMetricsConsumer" 42 parallelism.hint: 1 43 44 http.agent.version: "1.0" 45 http.agent.description: "built with StormCrawler Archetype 1.17" 46 http.content.limit: 65536 47 http.agent.email: "[email protected]"

Code D.1 Stormcrawler Basis-Konfiguration

115 Anhang D. Code Anhang: Stromcrawler

1 http.robots.agents: 'UserAgent1,UserAgent2,UserAgent3'

Code D.2 Erweiterung der Stormcrawler Basis-Konfiguration fur¨ einen Spider mit rotierendem User-Agent

1 http.proxy.host: 127.0.0.1 2 http.proxy.port: 8081

Code D.3 Erweiterung der Stormcrawler Basis-Konfiguration fur¨ einen Spider mit rotierenden Proxyservern

1 http.robots.file.skip: true 2 http.robots.headers.skip: true 3 http.robots.meta.skip: true

Code D.4 Erweiterung der Stormcrawler Basis-Konfiguration fur¨ einen REP missachtenden Spider

1 fetcher.max.crawl.delay: 30 2 fetcher.server.delay: 2.0 3 fetcher.server.min.delay: 2.0

Code D.5 Erweiterung der Stormcrawler Basis-Konfiguration fur¨ einen h¨oflichen Spider

116 Anhang D. Code Anhang: Stromcrawler

1 config: 2 topology.workers: 2 3 topology.message.timeout.secs: 300 4 topology.max.spout.pending: 100 5 topology.debug: false 6 7 topology.worker.childopts: "-Xmx2g -Djava.net.preferIPv4Stack=true" 8 9 topology.kryo.register: 10 - com.digitalpebble.stormcrawler.Metadata 11 12 metadata.persist: 13 - _redirTo 14 - error.cause 15 - error.source 16 - isSitemap 17 - isFeed 18 19 parsefilters.config.file: "parsefilters.json" 20 urlfilters.config.file: "urlfilters.json" 21 22 fetchInterval.default: 1440 23 fetchInterval.fetch.error: 120 24 fetchInterval.error: -1 25 fetcher.threads.number: 16 26 fetcher.threads.per.queue: 1 27 28 textextractor.exclude.tags: 29 - STYLE 30 - SCRIPT 31 32 indexer.url.fieldname: "url" 33 indexer.text.fieldname: "content" 34 indexer.canonical.name: "canonical" 35 indexer.md.mapping: 36 - parse.title=title 37 - parse.keywords=keywords 38 - parse.description=description 39 - domain=domain 40 41 topology.metrics.consumer.register: 42 - class: "org.apache.storm.metric.LoggingMetricsConsumer" 43 parallelism.hint: 1 44 45 http.agent.version: "1.0" 46 http.agent.description: "focused yet polite Stormcrawler" 47 http.agent.name: "Focused Stormcrawler" 48 http.agent.email: "[email protected]" 49 http.content.limit: 65536 50 51 http.robots.file.skip: true 52 http.robots.headers.skip: true 53 http.robots.meta.skip: true 54 55 fetcher.max.crawl.delay: 30 56 fetcher.server.delay: 2.0 57 fetcher.server.min.delay: 2.0

Code D.6 Stormcrawler Testkonfiguration

117 Daten-CD

Daten-CD

118