Zur Navigation

Webcrawler

bauen und hosten

1 Ranma (Gast)

Als ich Wörterlisten für meine Wörterbuch-Datenbank suchte, bemerkte ich, daß im Wiktionary für viele Wörter die Übersetzungen in mehrere Sprachen angegeben werden. Es gibt sogar irgendwo bei den Wikibooks den Vorschlag solche schon vorhandenen Ressourcen für den Aufbau eines Wörterbuches zu benutzen. Schöne Idee, aber es sind natürlich viel zu viele Einträge, um alle per Hand sichten und eintragen zu wollen. Ein Skript könnte das tun. Das zählt man dann wohl zu den Webcrawlern.

Zum Teil ist mir klar wie das ginge. Jede Netzseite läßt sich wie eine Datei einlesen, zum Beispiel mit file() in PHP. Dann muß man darin nur noch die richtigen Stellen finden und sie an eine Datenbank schicken. Dann müssen noch die Verlinkungen ausgewertet werden, damit das Skript weiß, wo die Suche fortgesetzt werden kann.

Ein anderer Teil ist mir noch nicht klar. Ein Webcrawler hat keinen Benutzer und wendet sich nicht an einen Brauser als Client. Wie wird ein Webcrawler gestartet? Ist es sinnvoll, einen Crawler mit PHP zu bauen?

Ich mag PHP wegen der drei Vorteile:
1. Kein Gefrickel mit cgi.
2. Funktioniert bei so ziemlich jedem Hoster, was bei anderen für Internetseiten verwendeten Programmiersprachen nicht der Fall ist.
3. Für die Verbindung mit MySQL gibt es Standardfunktionen und MySQL gibt es wiederum bei den meisten Hostern.

Etwas mit PHP bauen zu können, ist wegen dieser Vorteile fast schon ein Grund, das dann zu tun. Aber die vielen Hoster, die PHP und MySQL bieten, verbieten in ihren Bedingungen oft Proxies und Crawler. Ein Crawler, der über das Wiktionary herziehen soll, muß natürlich irgendwo gehostet werden, von wo aus das möglich ist.

Wo kann ein Crawler gehostet werden?
Das Wiktionary darf ja jeder frei benutzen, aber bedarf es für einen Bot eine Erlaubnis? Letzteres wird wahrscheinlich über Robots.txt geregelt, aber die kann meinen Crawler noch nicht kennen, weil der erst eine Idee ist und noch nichtmal einen Namen hat...
Ranma

25.11.2015 09:02

2 Jörg Kruse

Hast du SSH-Zugriff auf den Webspace / Server? Am einfachsten wäre es dann wohl, die Seiten mit einem Linux-Tool wie wget zu crawlen. Die robots.txt von de.wiktionary.org gibt hierzu auch einen wichtigen Hinweis:

#
# Sorry, wget in its recursive mode is a frequent problem.
# Please read the man page and use it properly; there is a
# --wait option you can use to set the delay between hits,
# for instance.
#
User-agent: wget
Disallow: /

Mit der Verwendung der Option --wait könnte man nicht nur den Zielserver entlasten, sondern auch den Server, auf dem wget läuft.

Ohne SSH-Zugriff wird es etwas schwieriger, weil du dann wieder mit der Laufzeitbeschränkung von PHP zu kämpfen hast.

25.11.2015 16:24

3 Ranma (Gast)

Was macht wget? Startet das ein PHP-Skript? Oder holt es nur Dateien, die sich anschließend auf dem eigenen Computer durchsuchen lassen?

In der Robots.txt steht, laut dem Zitat, ein Disallow für alle Verzeichnisse bei der Verwendung von wget. Man kann zwar die Robots.txt ignorieren, aber viele Netzseiten ergreifen Maßnahmen dagegen. Verständlich, weil die meisten Bots, die Robots.txt ignorieren, böswillige sind. Also sollte man das nicht.

Die Laufzeitbeschränkung von PHP könnte ein Grund sein, doch eher auf eine andere Programmiersprache zurückzugreifen? Da müßte ich mich zwar erst wieder lange einlesen und üben, aber manche sind ähnlich PHP und Perl soll fast genauso einfach sein und mit Servern und MySQL zusammenarbeiten. Vielleicht wäre das besser?

Server / Webspace ist das größte Problem dabei. Alle Hoster, die ich mir in letzter Zeit angesehen habe, schließen das Hosten von Crawlern ausdrücklich aus. Darum die Frage nach möglichen Hostern. Sind welche bekannt dafür, daß dort Crawler gehostet werden?
Ranma

26.11.2015 07:56

4 Jörg Kruse

Was macht wget? Startet das ein PHP-Skript? Oder holt es nur Dateien, die sich anschließend auf dem eigenen Computer durchsuchen lassen?

Letzteres. wget ist ein Programm, was du auch lokal auf deiner Linux-Konsole laufen lassen kannst.

In der Robots.txt steht, laut dem Zitat, ein Disallow für alle Verzeichnisse bei der Verwendung von wget.

Ja, und wget hält sich sogar von selbst an die robots.txt. In dem Kommentar findet sich aber auch der Hinweis, wie man wget korrekt verwenden kann, die Option --wait ist dabei nur ein (allerdings wichtiger) Baustein. Der robots.txt Eintrag ist für die Leute, die sich nicht die Mühe machen, wget mit sinnvollen Optionen zu verwenden, und die werden durch den Eintrag auch effektiv gestoppt.

Wenn du viel Zeit über hast, kannst du natürlich auch ein eigenes Tool bauen - das Problem wäre hier aber das gleiche: den Zielserver nicht mit Anfragen zu bombardieren. Und als allererstes sollte dein Crawler die robots.txt lesen und beachten können. Ich würde da auf eine erprobte Library wie diese hier setzen:

http://phpcrawl.cuab.de/

Die Laufzeitbeschränkung von PHP könnte ein Grund sein, doch eher auf eine andere Programmiersprache zurückzugreifen?

Falls der Webhoster das anbietet (Zugriff über SSH oder über einen Cronjob), kannst du PHP auch über die Konsole verwenden, dann gibt es in der Regel keine Laufzeitbeschränkung.

Server / Webspace ist das größte Problem dabei. Alle Hoster, die ich mir in letzter Zeit angesehen habe, schließen das Hosten von Crawlern ausdrücklich aus.

Bei VServern von hetzner scheint das nicht explizit verboten zu sein:

https://www.hetzner.de/ch/hosting/legal/system-policies-vs

26.11.2015 17:35 | geändert: 26.11.2015 17:41

5 Ranma (Gast)

Von den Netzseiten von PHPCrawl:
<?php

// It may take a whils to crawl a site ...
set_time_limit(10000);

Das ist der Anfang von einem Beispiel. Die Lösungen sind dann wohl auch nicht eleganter oder professioneller als eigene Versuche. Es gibt dazu noch viel Diskussionsbedarf seitens Nutzern, bei denen PHPCrawl nicht das macht, was sie davon erwarteten. Zum Beispiel:


Hello,
I installed the crawler today. It stops always at different pages and never runs to the end (summary). I don't get any error code. My changes in example.php are:
$crawler->setTrafficLimit(2000000 * 1024);
$crawler->setStreamTimeout(5);
$crawler->setConnectionTimeout(10);
$crawler->setPageLimit(2000);

What can I do to find out, why it stops? TY

Genau solche Probleme will ich ja nicht haben. Um den Zielserver nicht zu bombardieren sollte es eigentlich reichen, sich an robots.txt und an die Meta-tags zu halten. Beim Wiktionary scheint aber charset das einzige Meta-tag zu sein. Revisit und Follow wären natürlich die relevanten für Bots. Man könnte das selbst ersetzen, indem die bereits besuchten Seiten in eine Datenbanktabelle eingetragen werden, zusammen mit einem Zeitstempel. Diese Seiten muß das Skript dann in Ruhe lassen. Pausen zwischen jeder Aktion des Skripts würden dem Zeitlimit zuwiderlaufen. Das werden also andere Crawler nicht machen. Bei meinem hinge das davon ab wie er gestartet wird, falls dann auf diese Weise der Server geschont würde. Das Einzige, das mir dann noch einfällt, was zusätzlichen Traffic verursachen könnte, wären mehrere Instanzen des Crawlers gleichzeitig laufen zu lassen. Das würde ich wahrscheinlich sowieso nicht hinbekommen. Dafür wäre die relevante Information leicht zu finden, sie ist als einzige mit der Farbe #33C066 versehen.

Bei hetzner steht:


Damit wir für unsere Kunden ein performantes und zuverlässiges Netzwerk betreiben können, sind folgende Aktionen untersagt:

- Der Betrieb von Filesharing-Tools wie z.B. eDonkey
- Das Scannen von fremden Netzen oder fremden IP-Adressen
- Das manuelle Ändern der Hardwareadresse (MAC)
- Die Verwendung von gefakten Source-IPs

Das zweite Verbot untersagt das Scannen von fremden Netzen. Ist das nicht genau das, was ein Crawler tut? Also ich verstehe das schon so, daß Crawler dort verboten sind.

Ansonsten enthalten die AGB dort kaum irgendwelche Gemeinheiten, aber das Finden eines passenden Hosters ist doch eher ein weiteres, großes und schwieriges Thema. Braucht ein Crawler 99 % Uptime? Ein Skript, von dem ich nichtmal weiß, ob es funktioniert, das ist zum ausprobieren bei einem Gratis-Hoster gut genug untergebracht. Vielleicht muß ich sogar wegen zu vieler Bedingungen mehr als einen Hoster finden. Es gibt einige, die keine mehrsprachigen Netzseiten zulassen. Solche Hoster taugen nicht für mein Wörterbuch. Aber der Crawler dazu könnte erlaubt sein.
Ranma

28.11.2015 01:58

6 Jörg Kruse

Um den Zielserver nicht zu bombardieren sollte es eigentlich reichen, sich an robots.txt und an die Meta-tags zu halten.

Mit Bombardieren meinte ich, dass Abfragen in sehr kurzen Zeitabständen erfolgen.

Pausen zwischen jeder Aktion des Skripts würden dem Zeitlimit zuwiderlaufen. Das werden also andere Crawler nicht machen.

Bots von größeren Suchmaschinen, wie z.B. der Googlebot, legen sehr wohl kleine Pausen zwischen einzelnen Abrufen ein.

Und der von mir zitierte Kommentar legt nahe, dass Wiktionary gerade darauf sehr viel Wert legt!

Das zweite Verbot untersagt das Scannen von fremden Netzen. Ist das nicht genau das, was ein Crawler tut?

Mit "Scannen von fremden Netzen oder fremden IP-Adressen" ist wohl eher der Gebrauch von Tools wie nmap gemeint.

Braucht ein Crawler 99 % Uptime?

Er muss halt so konstruiert werden, dass er von neuem gestartet wird, wenn er (z.B. durch einen Reboot oder Ausfall des Servers) beendet wurde, und dort weitermacht, wo er aufgehört hat. Wobei min. 99% eigentlich schon eine Selbstverständlichkeit sind - das sind ja bis zu dreieinhalb Tage Ausfall im Jahr.

28.11.2015 17:27 | geändert: 28.11.2015 17:34

7 Ranma (Gast)

Das läuft also alles darauf hinaus, daß ein Crawler immer wieder neu gestartet werden muß. Die Bots der Suchmaschinen laufen in mehreren Instanzen gleichzeitig. Das dürfte für einen Crawler, der auf eine Domain beschränkt ist, überflüssig sein. Das führt zu der Frage zurück, wie man einen Crawler am besten startet. Manche Hoster bieten Cronjobs. Die habe ich noch nie verwendet und kenne mich damit nicht aus. Wie funktioniert ein Cronjob? Wofür wird ein Cronjob üblicherweise verwendet? Falls das Starten eines Crawlers so üblich ist, dann könnte das Angebot von Cronjobs darauf hinweisen, daß bei den betreffenden Hostern Crawler erlaubt sind.
Ranma

29.11.2015 02:50

8 Ranma (Gast)

Kann ein Programm mitgeteilt bekommen (vielleicht aus Server-Variablen), ob eine Netzseite gerade stark oder schwach frequentiert wird?

Einerseits könnte so eine Information DDoS-Angriffe erleichtern, so daß man sie besser nicht herausrücken sollte, andererseits gibt es einige Analysewerkzeuge, die Statistiken über Netzseiten erstellen und ihre Informationen irgendwoher beziehen müssen. Ein Crawler könnte solche Informationen dann auch berücksichtigen.
Ranma

29.11.2015 03:42

9 Jörg Kruse

Wie funktioniert ein Cronjob? Wofür wird ein Cronjob üblicherweise verwendet?

Über einen Cronjob kann man ein Programm zeitabhängig starten. Da der Webserver hierbei nicht involviert ist, gibt es (in den meisten Fällen) keine Laufzeitbeschränkungen.

Man kann einen Cronjob z.B. jeden Samstag um 2:00 starten (z.B. für ein wöchentliches Backup) oder aber auch alle fünf Minuten

Eine Einführung findet sich z.B. hier:

https://www.howtoforge.de/anleitung/eine-kurze-einfuhrung-in-cron-jobs/

Kann ein Programm mitgeteilt bekommen (vielleicht aus Server-Variablen), ob eine Netzseite gerade stark oder schwach frequentiert wird?

Es gibt den HTTP-Status-Code 429 "Too Many Requests":

https://de.wikipedia.org/wiki/HTTP-Statuscode

Von dessen Fehlen sollte man aber nicht darauf schließen, dass der Server nicht überlastet wird.

Dann gibt es noch die robots.txt Anweisung "Crawl Delay", welche aber nur von einem Teil der Bots beachtet wird

In der robots.txt von Wictionary findet sich auch eine solche - auskommentierte - Anweisung

#
## *at least* 1 second please. preferably more :D
## we're disabling this experimentally 11-09-2006
#Crawl-delay: 1
#

30.11.2015 16:41

10 Ranma (Gast)

Ich befürchte bei „too many requests“ ist es bereits zu spät, um sein Verhalten daran anzupassen. Ein Crawl Delay klingt nach einer Pause.

Woher bezieht zum Beispiel

http://www.alexa.com/siteinfo/http%3A%2F%2Fforum.joergkrusesweb.de

die Informationen „Daily Pageviews per Visitor“ oder „Daily Time on Site“? Wenn man solche Informationen beziehen kann, dann müßte man sein Verhalten daran anpassen können.
Ranma

01.12.2015 04:19