Seite 1 von 1

Crawler-Skript

Verfasst: Donnerstag 2. Oktober 2008, 14:11
von nemomuk
Hallo,

nachdem ich mal wieder etwas Zeit zu programmieren hatte, habe ich mal meinen Webcrawler verbessert.

-crawlt bestimmte Anzahl an Domains gleichzeitig, um somit nicht zu viel traffic bei einer Domain zu verbrauchen und um nicht gesperrt zu werden. (immer abwechselnd eine bestimmte Anzahl an links und dann dei nächste Domain)
-wenn Domain fertig gecrawlt, wird sie aus dem Cache gelöscht und dann in eine DB gespeichert... anschließend eine neue Domain zur aktuellen CrawlListe hinzugefügt.


http://paste.pocoo.org/show/86822/

Nun wollte ich wissen, ob man noch etwas am a) System und b) Code verbessern könnte...

Danke!
MfG

Verfasst: Donnerstag 2. Oktober 2008, 14:31
von Y0Gi
Er sollte eine eventuelle `/robots.txt` berücksichtigen (s. Wikipedia).

Verfasst: Freitag 3. Oktober 2008, 16:39
von snafu
Das Modul mechanize kennt follow_link(). Vielleicht ist das etwas effektiver als sich eigene Regexes zusammenzubasteln.

Verfasst: Freitag 3. Oktober 2008, 20:37
von lunar
Der reguläre Ausdruck ist fehlerhaft. Zum einen matcht er mehrzeilige Tags nicht, zum anderen kann er bei mehreren a-Tags in einer Zeile versagen, da im Ausdruck zwei greedy-Bestandteile enthalten sind. Ich würde dir die Verwendung eines guten HTML-Parsers empfehlen. lxml.html beispielsweise ist resourcenschonend und schnell, und bietet zusätzlich noch komfortable Funktionen zum Auslesen aller Links einer Seite.

Ist es beabsichtigt, dass nur Domainnamen, die mit "www." anfangen, erfasst werden?

Die Namensgebung ist imho irreführend. Ich persönlich denke, Methoden sollten mit Verben benannt werden, da sie ja auch eine Aktion durchführen. Substantive würde ich eher mit Klassen assoziieren. Konkret interpretiere ich den Namen "downloader()" so, dass dort ein Downloader-Objekt zurückgegeben und eventuell auch erzeugt wird. Meiner Meinung nach passt "download()" besser. PEP 8 einzuhalten, ist sicherlich auch empfehlenswert.

Du liest das Ziel des Links am Stück in den Speicher. Angesichts der Tatsache, dass im Netz auch Dateiserver betrieben werden, ist das nicht zu empfehlen. Überleg mal, was passiert, wenn dein Skript dem Download-Link zum DVD-Image einer Linux-Distribution folgt. Das dürfte dein System effektiv lahmlegen, da es zum Swappen anfängt und irgendwann dein Skript tötet, weil es möglicherweise nicht genügend virtuellen Speicher reservieren kann. An dieser Stelle ist es imho besser, erst den Content-Type der Antwort zu prüfen, ob wirklich HTML zurückgegeben wird.

Das wäre auch ein prima Ansatz für einen modularen Crawler. So könntest du die Crawling Funktionalität (sprich, das Verfolgen von Links) vom Parsen trennen. Der Crawler würde dann je nach Mimetype des Responses einen entsprechenden Parser erzeugen und ausführen. Der Parser würde dann das Dokument in einer wie auch immer geartete Struktur überführen, welche den Inhalt und die verfügbaren Links beschreibt. Der Crawler würde den Inhalt dann abspeichern und die Links weiterverarbeiten. Nicht erkannte Mimetypes könntest du dann einfach verwerfen.

Die robots.txt würde ja schon erwähnt.

Zuguterletzt wäre twisted als eventgesteuertes Framework sicherlich einen Blick wert, wenn du den Crawler ausbauen möchtest. Twisted erlaubt es dann nämlich, die Hauptschleife des Crawlers z.B. auch in GUI-Programme zu integrieren.

Verfasst: Freitag 3. Oktober 2008, 22:39
von nemomuk
wunderbar!
Danke für dein ausführliches Feedback!

MfG