Heim  >  Artikel  >  Backend-Entwicklung  >  PHP einfacher Crawler

PHP einfacher Crawler

大家讲道理
大家讲道理Original
2018-05-14 14:45:458792Durchsuche

Einfaches Crawler-Design

Einführung

Zu sagen, dass es sich um einen Crawler handelt, ist etwas übertrieben, aber der Name ist genau richtig, deshalb habe ich zur Verdeutlichung das Wort „einfach“ vorangestellt das
Dies ist ein kastrierter Krabbler, der einfach verwendet oder damit gespielt werden kann.
Das Unternehmen hat kürzlich ein neues Geschäft zur Erfassung der Daten von Konkurrenzprodukten gegründet. Nach dem Lesen des von einem früheren Klassenkameraden geschriebenen Erfassungssystems gibt es bestimmte Probleme, sei es in Bezug auf Skalierbarkeit oder Vielseitigkeit. Die Oberfläche ist etwas schwach. Das vorherige System musste eine Liste
erstellen und dann von dieser Liste aus kriechen. Es gab kein Konzept für die Tiefe, was für Crawler ein Fehler war. Deshalb habe ich beschlossen, einen
etwas allgemeineren Crawler zu erstellen, das Konzept der Tiefe hinzuzufügen und die Skalierbarkeit und Allgemeingültigkeit zu verbessern.

Design

Wir haben hier vereinbart, dass wir den zu verarbeitenden Inhalt (vielleicht URL, Benutzername usw.) als Entität bezeichnen.

Unter Berücksichtigung der Skalierbarkeit wird hier das Konzept der
Warteschlange übernommen. Bei jeder Verarbeitung wird eine Entität aus der Warteschlange entfernt Die Verarbeitung ist abgeschlossen. Speichern und speichern Sie die neu erfassten Entitäten in der Warteschlange. Natürlich müssen wir hier auch eine Speicherdeduplizierungsverarbeitung und eine Warteschlangendeduplizierungsverarbeitung durchführen, um zu verhindern, dass das Verarbeitungsprogramm nutzlose Arbeit leistet.

Wenn jede Entität in die Warteschlange eintritt,
  +--------+ +-----------+ +----------+
  | entity | |  enqueue  | |  result  |
  |  list  | | uniq list | | uniq list|
  |        | |           | |          |
  |        | |           | |          |
  |        | |           | |          |
  |        | |           | |          |
  +--------+ +-----------+ +----------+
setzt das Flag für die in die Warteschlange gestellte Entität und tritt dann nicht mehr in die Warteschlange ein. Wenn die Entität

verarbeitet wird, werden die Ergebnisdaten abgerufen Verarbeiten der Ergebnisdaten Markieren Sie die resultierenden Verse wie 入队排重队列, natürlich
, hier können Sie auch 结果数据排重list aktualisieren
verarbeiten, und der Code kann kompatibel sein.

                     +-------+                     |  开始 |                     +---+---+                         |                         v                     +-------+  enqueue deep为1的实体                     | init  |-------------------------------->                      +---+---+  set 已经入过队列 flag                         |                             v                        +---------+ empty queue  +------+            +------>| dequeue +------------->| 结束 |            |       +----+----+              +------+            |            |                                       |            |                                       |            |                                       |            v                                       |    +---------------+  enqueue deep为deep+1的实体                         |    | handle entity |------------------------------>             |    +-------+-------+  set 已经入过队列 flag                         |            |                                   |            |                                   |            v                                   |    +---------------+  set 已经处理过结果 flag            |    | handle result |-------------------------->             |    +-------+-------+                         |            |                                 +------------+


Crawling-Strategie (Anti-Cheating-Reaktion)

Um bestimmte Websites zu crawlen, besteht die größte Angst darin, IP-Adressen zu blockieren und zu blockieren Aber ohne einen Agenten kann ich es nur tun. Daher ist die Crawling-

-Strategie immer noch sehr wichtig.


Vor dem Crawlen können Sie im Internet nach relevanten Informationen über die zu crawlende Website suchen, sehen, ob jemand sie schon einmal gecrawlt hat, und seine

Erfahrungen sammeln. Dann muss ich die Website-Anfrage selbst sorgfältig analysieren, um zu sehen, ob ihre Website-Anfrage spezielle

Parameter mit sich bringt? Wird es entsprechende
Cookies
für den nicht angemeldeten Status geben? Als letztes habe ich versucht, die Aufnahmefrequenz so hoch wie möglich einzustellen. Wenn Sie sich zum Crawlen auf der Website anmelden müssen, können Sie einen Stapel von Konten registrieren, dann eine erfolgreiche Anmeldung simulieren und wiederum eine Anfrage stellen.
Es wird noch schwieriger, wenn eine Anmeldung erforderlich ist

Bestätigungscode

, Sie können versuchen, sich manuell anzumelden und dann das Cookie zu speichern (natürlich
, wenn Sie die Möglichkeit dazu haben, können Sie es mit der OCR-Erkennung versuchen). Natürlich müssen Sie auch nach dem Anmelden die im vorherigen Absatz erwähnten Probleme berücksichtigen. Das bedeutet nicht, dass nach dem Anmelden alles in Ordnung ist . Bei einigen Websites werden die Konten gesperrt, wenn sie nach dem Anmelden zu häufig gecrawlt werden In.
Versuchen Sie daher, eine Methode zu finden, die keine Anmeldung erfordert. Es ist mühsam, sich bei gesperrten Konten anzumelden, Konten zu beantragen und Konten zu ändern.

Crawling-Datenquelle und -tiefe

Die anfängliche Auswahl der Datenquelle ist ebenfalls wichtig. Ich möchte einmal am Tag crawlen und suche daher nach einem Ort, an dem die Crawling-Website täglich aktualisiert wird

, sodass die Initialisierungsaktion vollständig automatisch erfolgen kann und ich sie im Grunde nicht verwalten muss . Das Crawlen beginnt ab Tägliche

Aktualisierungen werden automatisch durchgeführt.


Die Crawling-Tiefe ist ebenfalls sehr wichtig. Diese sollte auf der Grundlage der spezifischen Website, der Bedürfnisse und des gecrawlten Inhalts bestimmt werden und
so viele Website-Daten wie möglich erfassen.

Optimierung

Nach der Ausführung in der Produktionsumgebung wurden mehrere Stellen geändert.

Die erste ist die Warteschlange, die in eine stapelartige Struktur geändert wurde. Denn in der vorherigen Warteschlange wurden Entitäten mit geringer Tiefe immer zuerst ausgeführt.

Dies würde dazu führen, dass sich immer mehr Inhalte in der Warteschlange befinden und viel Speicher beanspruchen. Jetzt wird auf eine Stapelstruktur und

Rekursion umgestellt

wird zuerst die gesamte Tiefe einer
-Entität verarbeiten und dann die nächste Entität verarbeiten. Beispielsweise beträgt die maximale Crawling-Tiefe für die ersten 10 Entitäten (deep=1) 3. Unter jeder Entität gibt es 10 Unterentitäten und die maximale Länge ihrer Warteschlangen beträgt:

oben Die beiden Methoden können den gleichen Effekt erzielen, aber Sie können sehen, dass die Länge der Warteschlange sehr unterschiedlich ist, daher haben wir zur zweiten Methode

gewechselt.
    队列(lpush,rpop)              => 1000个
    修改之后的队列(lpush,lpop)   => 28个

Die maximale Tiefenbeschränkung wird beim Beitritt zur Warteschlange verarbeitet. Wenn die maximale Tiefe überschritten wird, wird sie direkt verworfen. Darüber hinaus wurde auch die maximale Länge der Warteschlange
begrenzt, um unerwarteten Problemen vorzubeugen.

Code

Das Folgende ist ein langer und langweiliger Code, den ich ursprünglich auf

git

hub veröffentlichen wollte, aber ich dachte, das Projekt sei etwas klein, also habe ich Ich dachte, ich poste es direkt. Ich hoffe, dass meine Freunde über die schlechten Dinge sprechen, sei es Code oder Design.

Das obige ist der detaillierte Inhalt vonPHP einfacher Crawler. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn