Zur Navigation

Webcrawler [2]

bauen und hosten

11 Jörg Kruse

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“?

Die werden von der Alexa Toolbar bezogen, und da diese nur von wenigen Leuten (vornehmlich SEOs) installiert wird, sind die so ermittelten Daten nur sehr bedingt aussagekräftig.

Ich würde für zwei Sekunden Crawl Delay zwischen zwei Aufrufen sorgen, es sei denn in der robots.txt sind höhere Werte vorgegeben.

01.12.2015 15:29 | geändert: 01.12.2015 15:31

12 Ranma (Gast)

Bei mir verbraucht ein Skript mit Datenbankverbindung erheblich mehr Zeit als eines ohne. Die ersten Skripte, mit denen ich Datensätze aus Dateien in die Datenbank schaufelte, hatten noch keine durch set_time_limit() verlängerte Laufzeit und brauchten trotzdem deutlich länger als dreißig Sekunden. Eher ein bis drei Stunden. Wenn mein Webcrawler also regelmäßig Daten zu einer Datenbank schickt, dann pausiert er also automatisch und oft aus der Sicht der abgegrasten Netzseite?

Damit würde sich das Problem auf der einen Seite von selbst erledigen, andererseits könnte das dem Webhoster sauer aufstoßen. In den Zwischenzeiten würde der Webcrawler ja dort Traffic erzeugen. Aber ich wüßte sowieso nicht, was er sonst mit den Daten machen sollte, wenn er sie nicht sogleich „nach Hause“ schickt. Wie kann ich verhindern, zu viel Traffic beim Webhoster zu generieren?
Ranma

08.12.2015 02:09

13 Jörg Kruse

Wenn mein Webcrawler also regelmäßig Daten zu einer Datenbank schickt, dann pausiert er also automatisch und oft aus der Sicht der abgegrasten Netzseite?

Der Insert eines einzelnen Datensatzes sollte nur den Bruchteil einer Sekunde ausmachen.

Damit würde sich das Problem auf der einen Seite von selbst erledigen, andererseits könnte das dem Webhoster sauer aufstoßen. In den Zwischenzeiten würde der Webcrawler ja dort Traffic erzeugen.

Du meinst den Traffic zwischen Webserver und Datenbankserver (falls Webserver und Datenbank überhaupt auf verschiedenen Servern liegen)?

Aber ich wüßte sowieso nicht, was er sonst mit den Daten machen sollte, wenn er sie nicht sogleich „nach Hause“ schickt.

Das (gängige) Bild, dass ein Crawler auf fremden Servern unterwegs ist, und von dort die gesammelten Inhalte an den Heimatserver sendet, ist technisch nicht ganz korrekt. Die Crawler-Anwendung läuft auf deinem Server und stellt Anfragen an die entfernten Webserver, und diese schicken ihr (oder auch nicht) die angeforderten Inhalte.

08.12.2015 16:58

14 Ranma (Gast)

Du meinst den Traffic zwischen Webserver und Datenbankserver (falls Webserver und Datenbank überhaupt auf verschiedenen Servern liegen)?

Bei mir zuhause liegt alles auf der selben Festplatte und innerhalb des selben xampp-Systems. Trotzdem verschlingt die Verbindung zwischen PHP und Datenbank viele Stunden zusätzliche Zeit. Ein PHP-Skript ist ja sonst auf dreißig Sekunden Laufzeit beschränkt. Was könnte also sonst so lange dauern??

Außerdem wird auch die CPU ziemlich beansprucht. Der Arbeitsspeicher füllt sich nur bei richtigen Dauerschleifen. Die Beanspruchung solcher Ressourcen muß man sicherlich auch minimieren. Was wiederum voraussetzt, die Auslastung feststellen zu können. Falls Datenbank und Webserver auf verschiedenen Servern liegen, dann dürfte zwischen den beiden auch noch Traffic entstehen, der dann noch zusätzlich zu minimieren ist.

Nur Sekundenbruchteile dauert das auf meinem xampp-System jedenfalls nicht. Obwohl der Systemmonitor in der CPU-Last mehrere Peaks pro Sekunde zeigt. Der Crawler würde natürlich nicht nur einen INSERT machen, sondern eine Datei einlesen und sie komplett auswerten, also URIs darin suchen und ebenso nach der relevanten Information, beides wird in die Datenbanktabellen eingetragen, dann sind noch die Regeln aus Meta-tags und robots.txt mit den möglichen nächsten URI abzugleichen, schließlich wird davon eine aus der Datenbank geholt und die damit angegebene Datei als nächste verarbeitet. So stelle ich mir das bisher zumindest vor.

Das (gängige) Bild, dass ein Crawler auf fremden Servern unterwegs ist, und von dort die gesammelten Inhalte an den Heimatserver sendet, ist technisch nicht ganz korrekt. Die Crawler-Anwendung läuft auf deinem Server und stellt Anfragen an die entfernten Webserver, und diese schicken ihr (oder auch nicht) die angeforderten Inhalte.

Es ist schon schwierig, sich das vorzustellen. Theoretisch ist es klar, daß das Skript beim Interpreter bleibt, damit es interpretiert werden kann. Andererseits folgt ein Crawler nicht nur absoluten, sondern auch relativen Pfadangaben, falls solche verlinkt sind, befolgt Anweisungen aus Robots.txt oder Meta-tags, kann „ausgesperrt“ oder in eine Teergrube gelockt werden und schließlich zeigen manche Netzseiten auch noch an, welche Bots (und auch andere Nutzer) sich gerade „dort“ befinden. Also muß ein Teil davon irgendwie auch auf dem anderen Server stattfinden, sonst hätte der keine Informationen darüber und auch keinen Grund, sich über den Verbrauch seiner Ressourcen zu beschweren....
Ranma

09.12.2015 03:32

15 Jörg Kruse

Bei mir zuhause liegt alles auf der selben Festplatte und innerhalb des selben xampp-Systems. Trotzdem verschlingt die Verbindung zwischen PHP und Datenbank viele Stunden zusätzliche Zeit. Ein PHP-Skript ist ja sonst auf dreißig Sekunden Laufzeit beschränkt. Was könnte also sonst so lange dauern??

Ich kenne das Script ja nicht. Da gibt es viele Möglichkeiten, von ungünstig aufgebauten Schleifen in PHP über nicht opimierte SQL-Abfragen bis zu fehlenden Indexen. Als erstes würde ich über die Ausgabe von top schauen, ob nun in erster Linie MySQL oder PHP bzw. der Webserver die Last erzeugen.

Andererseits folgt ein Crawler nicht nur absoluten, sondern auch relativen Pfadangaben, falls solche verlinkt sind, befolgt Anweisungen aus Robots.txt oder Meta-tags, kann „ausgesperrt“ oder in eine Teergrube gelockt werden und schließlich zeigen manche Netzseiten auch noch an, welche Bots (und auch andere Nutzer) sich gerade „dort“ befinden.

Ja, aber nur im bildlichen (metaphorischen) Sinne. Konkret stellen der Browser oder Bot Anfragen über HTTP an den Webserver und dieser beantwortet diese. Eine Überlastung des Webservers erfolgt dann wenn a) zuviele Anfragen in einem Zeitraum erfolgen und / oder b) die Bearbeitung dieser Anfragen zu aufwendig sind.

09.12.2015 15:43

16 Ranma (Gast)

MIr fiel gerade folgendes auf. Ruft man eine Netzseite aus dem Wiktionary oder der Wikipedia auf, dann wird in der URI als Dateiname der Seitentitel angezeigt, bei dem es sich meistens zugleich um den gesuchten Begriff handelt. Dieser Name hat keine Dateiendung. Speichert man so eine Seite jedoch lokal ab, dann wird automatisch die Endung .html vorgeschlagen. Bedeutet das, daß die Namen solcher Netzseiten durch Redirects in einer .htaccess zustandekommen?
Ranma

10.12.2015 04:05

17 Jörg Kruse

Ein Redirect ist da nicht im Spiel. Der Webserver übermittelt über einen HTTP-Header den Content-Type der Ressource. Im Falle von "text/html" wird der Browser vorschlagen, die Datei mit der Endung .html abzuspeichern.

10.12.2015 13:47

18 Ranma (Gast)

Normalerweise sieht man Dateiendungen in der URI-Zeile. Nun, der Brauser kann die Netzseite vom Wiktionary oder der Wikipedia abspeichern. Muß das automatisch bedeuten, daß sich die Netzseite unter dem in der URI angegebenen Namen von einem PHP-Skript auswerten läßt?

Der Content-Type ist ja klar, wenn es sich um eine Seite aus dem Wiktionary oder der Wikipedia handelt. Aber um sie in einem Skript auswerten zu können, muß das Skript den Pfad und Namen der Datei kennen. Oder nicht?
Ranma

11.12.2015 01:33

19 Jörg Kruse

Normalerweise sieht man Dateiendungen in der URI-Zeile. Nun, der Brauser kann die Netzseite vom Wiktionary oder der Wikipedia abspeichern. Muß das automatisch bedeuten, daß sich die Netzseite unter dem in der URI angegebenen Namen von einem PHP-Skript auswerten läßt?

Die URL ist nur für die Anforderung der Ressource vom entfernten Webserver von Belang. Sobald letztere übermittelt wurde, kann sie natürlich auch auf dem lokalen Webserver ausgewertet werden.

Der Content-Type ist ja klar, wenn es sich um eine Seite aus dem Wiktionary oder der Wikipedia handelt.

Es sind auch andere Content-Types denkbar - z.B. wenn ein PDF-File oder eine Bilddatei verlinkt wird.

Aber um sie in einem Skript auswerten zu können, muß das Skript den Pfad und Namen der Datei kennen. Oder nicht?

Nein, wie gesagt werkelt der Crawler nicht auf dem entfernten Server. Nur der dortige Webserver muss den Pfad kennen, um die Ressource ausliefern zu können.

11.12.2015 13:43

20 Ranma (Gast)

Nein, wie gesagt werkelt der Crawler nicht auf dem entfernten Server. Nur der dortige Webserver muss den Pfad kennen, um die Ressource ausliefern zu können.

Ich dachte, das hätte ich einigermaßen verstanden. Hatte ich aber nicht, sondern wollte mich bereits daran machen, einen Crawler zu bauen, der auf meiner eigenen Festplatte herumsucht, um das Prinzip auszuprobieren. Aber so ein Programm müßte natürlich völlig anders funktionieren... Trotzdem bedeutet das eigentlich, daß ein Crawler recht leicht zu bauen ist. Er muß immerzu nur anfordern, auswerten, anfordern, auswerten, anfordern, auswerten...
Ranma

14.12.2015 04:42