Open Source im professionellen Einsatz
Linux-Magazin 07/2016
760

Fleißige Spinne

Innerhalb von Scrapy-Anwendungen führen die erwähnten Spider (Abbildung 4, Mitte) Regie. Sie speichern den Teil des Anwendungscodes, der, ähnlich wie in der interaktiven Session aus Abbildung 3, die Funktion »fetch()« aufruft und das Antwortobjekte »response« auswertet. Listing 5 zeigt den Spider, der in der Anwendung unter »mirror/spiders/attr.py« wartet. Neben dem »CrawlSpider« bietet Scrapy die generischen Spider »XMLFeedSpider« und »CSVFeedSpider« .

Listing 5

mirror/spiders/attr.py

01 from scrapy.spiders import CrawlSpider, Rule
02 from scrapy.linkextractors import LinkExtractor
03 from scrapy.loader import ItemLoader
04 from mirror.items import Attributes
05 from mirror.utils import join
06
07 class Attr(CrawlSpider):
08   name = "attr"
09   rules = [Rule(LinkExtractor(), callback='parse_page')]
10   start_urls = ["http://localhost"]
11   allowed_domains = ["localhost"]
12
13   def parse_page(self, resp):
14     ldr = ItemLoader(item=Attributes(), response=resp)
15     ldr.add_value('url', resp.url)
16     ldr.add_xpath('keywords', 'string(//title)')
17     ldr.add_xpath('words', "string(//*[name()!='title'])")
18     ldr.add_xpath('links', '//a/@href')
19     ldr.add_xpath('tags', '//*')
20     ldr.add_xpath('medias', join(self.settings.get('MEDIA_TAGS')))
21     ldr.add_xpath('semantics', join(self.settings.get('SEMANTIC_TAGS')))
22     ldr.add_xpath('injections', join(self.settings.get('INJECT_TAGS')))
23     return ldr.load_item()

Die Zeilen 1 bis 5 importieren alle nötigen Klassen und Funktionen. Der Rest des Listings definiert die Spider-Klasse, die sich von »CrawlSpider« ableitet. Der Start des Crawlers mit »scrapy crawl attr« wählt, instanziert und ruft die Spider-Klasse anhand des Namens auf, der als Wert im Attribut »name« in Zeile 8 steckt. Mit der Angabe aus Zeile 9 marschiert das Objekt rekursiv weiter durch das Dokumenten-Gestrüpp. Das Attribut »rules« nimmt gewöhnlich Regeln analog zu einem Router auf. Diese URLs weist es dann verschiedenen Callback-Funktionen zu. Nach der Zuweisung folgt die Angabe:

Rule(LinkExtractor(), callback='parse_page')

Sie setzt im ersten Element der Liste die Defaultroute, indem sie dem Regelobjekt »Rule« ein »LinkExtractor()« -Objekt ohne Pfadangabe übergibt. Dann benennt »callback« die Funktion »parse_page()« (Zeile 13) als Callback-Funktion.

Bevor diese startet, fragen Objekte vom Typ »CrawlSpider« im Attribut »start_urls« nacheinander alle Seitenadressen aus der Liste ab. Sie übergeben die Antwortobjekte jeweils an Callback-Funktionen. Die Angabe »allowed_domains« aus Zeile 11 ist optional. Sie beschränkt die Abfragen auf die gelisteten Domains.

Gleich in Zeile 13 übernimmt »parse_page()« im zweiten Argument das »Response« -Objekt und packt es in die Variable »resp« . Die folgende Zeile instanziert mit der Variablen »ldr« ein Containerobjekt vom Typ »ItemLoader« . Dies ist in der Lage, andere Objekte aufzunehmen. Es kümmert sich zunächst darum, das übergebene »Item« -Objekt vom Typ »Attributes« aus Listing 4 zu initialisieren.

Copyshop

In den Zeilen 15 bis 22 kopiert Listing 5 die Werte aus dem »Response« - in die Attribute des »Item« -Objekts. Die URL des »Response« -Objekts weist Zeile 15 mit der Methode »add_value()« dem gleichnamigen Attribut innerhalb des »Item« -Objekts zu. Die Zeilen 16 bis 22 kopieren mittels »add_xpath()« Dokument-Bestandteile anhand übergebener X-Path-Ausdrücke in die aufgezählten Attribute.

Zeile 16 extrahiert mittels »//title« alle »<title>« -Tags, während die X-Path-Funktion »string()« deren jeweiligen Textwert holt. Auch die »add_« -Funktionen verwalten ihre Ergebnisse in Listenform. Zeile 17 holt auf ähnliche Art und Weise alle Wörter aus dem HTML-Dokument. Der Ausdruck »[name()!='title']« pickt aus der Auswahl aller Tags (»//*« ) nur jene, die nicht »<title>« heißen.

Die Zeilen 18 und 19 kopieren, wie es Abbildung 3 zeigt, sämtliche Verlinkungen und Tags in das »Item« -Objekt. Die drei folgenden Zeilen werten die Listen »MEDIA_TAGS« , »SEMANTIC_TAGS« und »INJECT_TAGS« aus Listing 3 aus. Dabei verwandelt die Hilfsfunktion »join()« aus der Datei »mirror/utils.py« sie in X-Path-Ausdrücke. Konkret formt »join()« die übergebene Liste von Tags »['a', 'b']« nach »//a | //b« um. Das Pipe-Symbol repräsentiert in X-Path den Oder-Operator. Die drei Listen findet der Spider über die Methode »get()« des Settings-Objekts im gleichnamigen Attribut.

Zeile 23 beendet die Initialisierung des »Item« -Objekts, indem es die Methode »load_item()« aufruft. Leere Attribute würden einen Fehler verursachen. Die »return« -Anweisung übergibt das »Item« -Objekt zuletzt in die Item-Pipeline.

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 07/2017

Digitale Ausgabe: Preis € 6,40
(inkl. 19% MwSt.)

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