Heim > Artikel > Backend-Entwicklung > PHP einfacher Crawler
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.
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.
+--------+ +-----------+ +----------+ | 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)
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
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
, 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.
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
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
队列(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 obige ist der detaillierte Inhalt vonPHP einfacher Crawler. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!