Aus gegebenen Anlass hab ich mich mit ein paar Website Spiders bzw Crawler auseinander gesetzt und teile mal meine Erfahrung. 🙂
Ausgiebig gestest habe ich hauptsächlich Sphider-plus, Screaming Frog und Scrapy.
Fangen wir mit Sphider-Plus an.
Sphider-Plus basiert auf PHP und ist relativ leicht zu verstehen und schnell einsetzbar.
Sphider-Plus bietet neben dem Admin Panel auch eine User Frontpage, womit man gleich eine Suchseite für die gesammelten Daten hat.
Im Admin Panel kann man sehr viel einstellen und grundsätzlich ist es so, das PHP beim crawlen schon nicht die performanteste Variante ist, aber je mehr man anhakt und sammelt, desto langsamer wird das crawlen.
Dennoch verwende ich Sphider-Plus für manche Webseite ganz gerne. Vorallem für Webseiten die eine sitemap.xml zur Verfügung stellen.
Sphider Plus lässt sich auch sehr gut über die Commandline ausführen, womit man Skipte per Crontab einplanen kann.
Screaming Frog ist ein auf Java basiertes GUI Tool.
Extrem schnell, aber extrem Speicherhungrig.
Webseiten mit mehreren hunderttausend Unterseiten (zb. Videoportale etc) schaffte ich nicht mal mit 64 GB RAM vollständig zu crawlen.
Zu Beginn lief das crawlen bei mir mit etwa 200 Seiten pro Sekunde an. Wenn mal ca 500.000 Seiten im Speicher sind, fällt auch auch die Geschwindigkeit mal auch 20 Seiten pro Sekunde runter und wenn das OS mal zu swappen beginnt, ist es soweiso gleich mal ziemlich lahm. Selbst das pausieren kann ein Geduldspiel werden und man denkt, das Programm reagiert nicht mehr. 😉
Aber auch hier hat man sehr viele Einstell- und Filtermöglichkeiten. Auch über Commandline soll man Screaming Frog ausführen können, habe ich aber nicht getestet, weil man hier so gut wie keine Optionen mitgeben kann.
Scrapy ist das schnellte, sicherlich sehr mächtige, aber für mein Empfinden, komplizierteste Spider Tool.
Wenn man aber mal die Doku zumindest so halbwegs verstanden hat, etwas Programmierlogik versteht und alles im Web raus gegoogelt hat, was einem weiterhilft, dann ist Scrapy für mich der Sieger dieser drei Tools.
Nicht nur das Scrapy permanent sehr schnell ist, bietet Scrapy auch die Möglichkeit, die Daten in einem JOBDIR zu verarbeiten, anstelle im Hauptspeicher.
Damit braucht man auch keine PC oder Server mit sehr viel Memory und dennoch kann man Millionen Webseiten innerhalb 24 Stunden damit abklappern.
Und weil Scrapy Beispiele recht rar sind, schreibe ich hier mal ein Beispiel wie ich es verwende.
Ich möchte dabei die URL, Webseiten Titel und die META Description auslesen und das nur von bestimmen „Ordnern“ (zb: www.example.com/folder).
Wie man scrapy bedient und ein Projekt anlegt lasse ich hier aus. Dazu findest man genug im WWW.
example.py:
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors.lxmlhtml import LxmlLinkExtractor
from scrapy.selector import Selector
from scrapy.item import Item, Field
from scrapy.exporters import CsvItemExporter
class myItem(Item):
title = Field()
url = Field()
meta = Field()
class MySpider(CrawlSpider):
name = „example“
allowed_domains = [„www.example.com“]
start_urls = [„https://www.example.com“]
rules = (Rule(LxmlLinkExtractor(allow=(‚https://www.example.com/folder/‘)), callback=’parse_obj‘, follow=True),)
def parse_obj(self,response):
item = myItem()
item[‚url‘] = []
item[‚title‘] = []
for link in LxmlLinkExtractor(allow=(),deny = self.allowed_domains).extract_links(response):
item[‚url‘].append(link.url)
hxs = Selector(response)
item[‚title‘] = hxs.xpath(‚//title/text()‘).extract()
item[‚url‘] = response.url
item[‚meta‘] = hxs.xpath(‚//meta[@name=\’description\‘]/@content‘).extract()
return item
Ggf. noch ein JOBDIR Verzeichnis anlegen (zB: mkdir /tmp/example_jobdir)
Und schon könnte man mit zb: folgenden Befehlsaufruf loslegen:
scrapy crawl example -o example.csv -s JOBDIR=/tmp/example_jobdir
Statt .csv könnte man auch .json angeben.
In der CSV Datei werden URL, DESCRIPTION und TITEL mit einem Komma (,) separiert.
In der JSON Datei sie das dann so aus:
{„url“: „https://www.example.com/folder/example.html“, „meta“: [„Hier steht die Meta Description.“], „title“: [„Hier steht der Titel der Webseite“]}
Wie man die Daten aus dem CSV oder JSON File dann weiterverarbeiten möchte, kann sich dann jeder überlegen.
Ich mache daraus SQL Statements und schreibe sie ein eine Tabelle in einer MySQL Datenbank.
Sphider-Plus verwendet ja schon eine MySQL DB. Hier kann man dann per SQL die Daten von Sphider-Plus weiterverarbeiten und ggf. in eigene Tabellen kopieren.
Mit Screaming Frog ist es ähnlich wie mit Scrapy. Hier kann man die Daten ebenfalls in eine CSV Datei exportieren und dann mit sed,awk,grep etc. so zusammenbauen, wie man es benötigt.