Crawler-Skript

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Crawler-Skript

Beitragvon nemomuk » Donnerstag 2. Oktober 2008, 14:11

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
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Beitragvon Y0Gi » Donnerstag 2. Oktober 2008, 14:31

Er sollte eine eventuelle `/robots.txt` berücksichtigen (s. Wikipedia).
Benutzeravatar
snafu
User
Beiträge: 5428
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Beitragvon snafu » Freitag 3. Oktober 2008, 16:39

Das Modul mechanize kennt follow_link(). Vielleicht ist das etwas effektiver als sich eigene Regexes zusammenzubasteln.
lunar

Beitragvon lunar » Freitag 3. Oktober 2008, 20:37

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.
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Beitragvon nemomuk » Freitag 3. Oktober 2008, 22:39

wunderbar!
Danke für dein ausführliches Feedback!

MfG

Wer ist online?

Mitglieder in diesem Forum: Google [Bot]