Open Source im professionellen Einsatz
Linux-Magazin 07/2016
© Michal Bednarek, 123RF

© Michal Bednarek, 123RF

Crawler mit Python

Nützliches Wühltier

Mit dem Open-Source-Framework Scrapy lassen sich eigene Crawler unter Python mit minimalem Aufwand und auf professionellem Niveau bauen. Der vorliegende Artikel zeigt eine Beispielanwendung.

589

Ein Crawler demonstriert die Einsatztauglichkeit des Scrapy-Framework [1] in Version 1.0 unter Python 2.7 [2]. Er wühlt sich rekursiv durch die HTML-Dokumente einer Webseite und folgt allen vorgefundenen Verlinkungen.

Tabelle 1

Definition der gespeicherten Messgrößen

Messgröße

Bedeutung

»keywords«

Anzahl der Wörter im »<title>« -Tag

»words«

Anzahl aller Wörter außer »keywords«

»relevancy«

Häufigkeit aller Schlüsselwörter in der Menge der Wörter

»tags«

Anzahl aller Tags

»semantics«

Anzahl aller semantischen Tags

»links«

Anzahl aller »<a>« -Tags mit »<href>« -Attribut

»injections«

Anzahl fremder Ressourcen

Sinn der Übung: Im Geiste von HTML 5 das nicht-semantische Markup in Webseiten aufspüren. Dabei misst der Crawler die pro Seite verwendeten Wörter sowie den Umfang charakteristischer Tag-Gruppen (Tabelle 1). Die Ergebnisse speichert er zusammen mit der URL in einer Datenbank ab. Die Auswertung der Messergebnisse zeigt Abbildung 1.

Abbildung 1: Die Seitenfaktoren auf Basis der relativen Häufigkeiten der gemessenen endogenen Größen.

Zur Installation bindet unter Debian 8 der bordeigene Paketmanager Apt die benötigten Pakete ein:

apt-get install python-pip libxslt1-dev  python-dev python-lxml

Im Klartext zählen dazu Pythons Paketmanager Pip, die Bibliothek »libxslt« nebst Headerdateien, die Headerdateien von Python sowie die Python-Bindings der »libxml« und »libxslt« . Da Debian 8 Python 2.7 und die »libxml« bereits vorinstalliert, lässt sich Scrapy über

sudo pip install scrapy

einspielen. Anders als Apt installiert Pip die neueste Scrapy-Version für Python 2.7 aus dem Python Package Index [3].

Probelauf

Im ersten Schritt startet der Anwender eine interaktive Scrapy-Session in der Scrapy-Shell (Abbildung 2). Im zweiten animiert die Scrapy-Engine über das Kommando

fetch('http://www.linux-magazin.de')

den bordeigenen Downloader dazu, die Startseite des Linux-Magazins per HTTP-Anfrage zu lesen und in das Antwort-Objekt »response« zu überführen (Abbildung 3).

Abbildung 2: Mit der Scrapy-Shell lassen sich Befehle interaktiv testen.
Abbildung 3: Der bordeigene Downloader überführt die Startseite des Linux-Magazins in ein Antwortobjekt.

Wie die Komponenten im Detail zusammenarbeiten, demonstriert Abbildung 4. Sie verdeutlicht, dass die Engine den Downloader nicht direkt anspricht, sondern die HTTP-Anfrage zunächst an den Scheduler übergibt (Abbildung 4, oben). Eine Downloader-Middleware (Abbildung 4, Mitte rechts) modifiziert die HTTP-Anfrage vor ihrem Einsatz. Die standardmäßig aktivierte »CookiesMiddleware« speichert Cookies der abgefragten Domain, die »RobotsTxtMiddleware« unterdrückt die Abfrage von Dokumenten, welche die Datei »robots.txt« [4] auf dem Webserver für Crawler sperrt.

Abbildung 4: Die Scrapy-Engine delegiert Aufgaben an verschiedene Komponenten, etwa Spider, die Item-Pipelines und Middleware. Im Hintergrund werkelt Twisted, ein Event-getriebenes Netzwerk-Framework.

Fährtenleser

Die Dokument-Bestandteile wertet Scrapy aus, indem es sie über das Response-Objekt wie in Abbildung 3 interaktiv abfragt und betrachtet. Die Auswahl erfolgt wahlweise mit Hilfe von CSS-Selektoren [5] wie unter Jquery oder mit X-Path-Ausdrücken [6] wie unter XSLT. Exemplarisch zeigt sich das im Befehl

response.xpath('//title/text()').extract()

den der User als Nächstes eingibt (Abbildung 3). Er ruft die Methode »xpath()« auf. Der Teilausdruck »//title« wählt zunächst alle »title« -Tags aus dem HTML-Dokument aus, »/text()« den jeweils folgenden Textknoten. Die Methode »extract()« überführt die Ergebnismenge in die Python-Liste:

[u'Home \xbb Linux-Magazin']

Über den Ausdruck

len(response.xpath('//a/@href').extract())

extrahiert der Nutzer die Werte des »href« -Attributs aus allen »<a>« -Tags in eine Liste. Deren Länge findet die Python-Funktion »len()« heraus, es sind »215« (Abbildung 3).

Diesen Artikel als PDF kaufen

Express-Kauf als PDF

Umfang: 6 Heftseiten

Preis € 0,99
(inkl. 19% MwSt.)

Linux-Magazin kaufen

Einzelne Ausgabe
 
Abonnements
 
TABLET & SMARTPHONE APPS
Bald erhältlich
Get it on Google Play

Deutschland

Ähnliche Artikel

  • Portia

    Die Börsenkurse in maschinenlesbarer Form mal eben aus dem Internet holen? Kein Problem: Nach ein paar Mausklicks auf eine Börsen-Webseite webt Portia einen geeigneten Kommandozeilenbefehl und wickelt die gewünschten Daten in das passende Json-Format ein.

  • Muschelzucht im Ausland

    Microsoft veröffentlicht demnächst eine Admin-Shell für Windows, die diesen Namen auch verdient. Beim Pipelining verhält sich die Powershell unter Umständen sogar robuster als die Unix-Pendants, weil sie typisierte Objekte durchreicht.

  • E-Commerce-APIs

    Gutgehende Onlineshops sind selten und das Ergebnis langer Arbeit. Wer gerade erst beginnt Waren zu verticken, tut gut daran, bei einem großen Shoppingportal unterzuschlüpfen. Über APIs lassen sich eigene Warenwirtschafts- oder Buchhaltungsprogramme anbinden.

  • Appetithäppchen

    Newsticker, Web-Blogs und andere Informationssysteme verwenden gerne das RSS-Format, um kurze Nachrichten in standardisierter Form an die Interessenten zu verteilen. Diese News-Schnipsel lassen sich bestens mit Tcl und der objektorientierten Erweiterung CZRSS verarbeiten.

  • Tragendes Rahmenwerk

    Wer Web- oder SaaS-Anwendungen anbieten will, bekommt es mit Kodierungsrelikten der HTML- und Skriptsprachen-Frühzeit zu tun. Abhilfe schaffen moderne Frameworks wie Prado, die viele Elemente und Templates bereits als fertige Bausteine bereitstellen. Doch deren Struktur will zuerst verstanden sein.

comments powered by Disqus

Ausgabe 09/2017

Artikelserien und interessante Workshops aus dem Magazin können Sie hier als Bundle erwerben.