2011-01-11 17 views
0

Ich habe mir selbst einen Web-Crawler mit simplehtmldom geschrieben und habe den Crawl-Prozess ziemlich gut funktioniert. Sie durchsucht die Startseite, fügt alle Links in eine Datenbanktabelle ein, legt einen Sitzungszeiger fest und Meta aktualisiert die Seite, um sie auf die nächste Seite zu übertragen. Das geht weiter, bis es keine Links mehr gibtSchreiben eines PHP-Web-Crawlers mit Cron

Das funktioniert gut, aber offensichtlich ist die Crawl-Zeit für größere Websites ziemlich langweilig. Ich wollte jedoch die Dinge etwas beschleunigen und möglicherweise einen Cron-Job machen.

Gibt es Ideen, wie Sie es so schnell und effizient wie möglich machen können, anstatt die Speichergrenze/Ausführungszeit höher einzustellen?

+1

Suche SO oder Google für einen PHP-Profiler. Sie können genau bestimmen, was alles verlangsamt. Von dort können Sie eine spezifischere Frage wie 'Wie beschleunige ich 'file_get_contents()'' stellen. –

+1

Ich werde dies auf Websites verwenden, die ich/mein Unternehmen erstellt, nur um nach Deadlinks zu suchen, und überprüfen alle Links haben einen anständigen Anker + Titel, stellen sicher, dass alle Seiten einen Titel/h1 Tag haben, usw. – Horse

Antwort

1

Speicher darf kein Problem für einen Crawler sein.

Sobald Sie mit einer Seite fertig sind und alle relevanten Daten in die Datenbank geschrieben haben, sollten Sie alle Variablen loswerden, die Sie für diesen Job erstellt haben.

Die Speicherbelegung nach 100 Seiten muss mit der nach 1 Seite übereinstimmen. Wenn dies nicht der Fall ist, finden Sie heraus warum.

Sie können die Arbeit zwischen verschiedenen Prozessen aufteilen: Normalerweise dauert das Analysieren einer Seite nicht so lange wie das Laden, also können Sie alle gefundenen Links in eine Datenbank schreiben und mehrere andere Prozesse haben, in die die Dokumente heruntergeladen werden ein temporäres Verzeichnis Wenn Sie dies tun, müssen Sie sicherstellen, dass

  1. kein Link von Arbeitnehmern heruntergeladen wird.
  2. Ihre Prozesse warten auf neue Verknüpfungen, wenn keine vorhanden sind.
  3. temporäre Dateien werden nach jedem Scan entfernt.
  4. Der Download-Prozess stoppt, wenn Sie keine Links mehr haben. Sie können dies archivieren, indem Sie ein "Kill-Flag" setzen. Dies kann eine Datei mit einem speziellen Namen oder ein Eintrag in der Datenbank sein.
+0

Ich denke, ich habe einen ziemlich engen Prozess geschrieben, obwohl ich mit der Datenbankinteraktion etwas Verbesserung erreichen könnte. Ich weiß nur nicht, wie man es zu einem Cron macht, ohne überlappende Cronjobs zu haben. Offensichtlich, je größer die Seite, desto mehr Verarbeitung muss passieren, so dass ich nicht sicher bin, wie ich eine bestimmte Anzahl von Instanzen des Prozesses in einen Job einfügen kann, ohne entweder Zeit verschwendet oder nicht verarbeitet zu haben, oder Zeiten, in denen es sich exponentiell überlappt – Horse

2

Sieht so aus, als würden Sie Ihr Skript in einem Webbrowser ausführen. Sie können es über die Befehlszeile ausführen. Sie können mehrere Skripts ausführen, um gleichzeitig auf verschiedenen Seiten zu crawlen. Das sollte die Dinge beschleunigen.

+0

Er sagt, er will es in machen ein Cronjob, also denke ich, dass er es bereits als Kommandozeilenskript geschrieben hat. –