ホームページ >バックエンド開発 >PHPチュートリアル >phpのシンプルなクローラー
これがクローラーというと少し大げさですが、名前がちょうどいいので、それを示すために前に「シンプル」という単語を追加しました
これは去勢されたクローラーで、シンプルです使うか、まだ遊んでも大丈夫です。
その会社は最近、競合製品のデータをキャプチャする新しいビジネスを始めました。以前のクラスメートが作成したキャプチャ システムを読んだところ、いくつかの問題がありました。ルールが強すぎて、拡張性と汎用性が少し異なります。以前のシステムはリストを作成し、そのリストからクロールする必要があり、深さの概念がありませんでした。これがクローラーにとっての欠点でした。そこで、
もう少し一般的なクローラーを作成し、深さの概念を追加して、拡張性と汎用性を向上させることにしました。
デザイン
キュー
の概念を採用しています。処理されるエンティティはすべてキューに格納され、処理のたびにエンティティをキューから取り出し、処理が完了したらそれを格納します。新しいエンティティはキューに保存されます。もちろん、ここではプロセッサが無駄な作業を行わないようにするために、ストレージの重複排除とエンキューの重複排除も必要です。
+--------+ +-----------+ +----------+ | entity | | enqueue | | result | | list | | uniq list | | uniq list| | | | | | | | | | | | | | | | | | | | | | | | | +--------+ +-----------+ +----------+
enqueue と requeue
は enqueued エンティティ フラグを 1 に設定し、その後キューに参加しなくなります。結果データの並べ替えリスト
としてマークします。 もちろん、ここで update 処理を行うこともでき、コードには互換性があります。 入队排重队列
设置入队实体标志为一后边不再入队,当处理完
实体,得到结果数据,处理完结果数据之后将结果诗句标志如结果数据排重list
+-------+ | 开始 | +---+---+ | 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 |--------------------------> | +-------+-------+ | | +------------+
特定のWebサイトをクロールするために最も恐れられるのは、IPがブロックされ、プロキシが存在しない場合は、ふふふするしかありません。したがって、クローリング戦略は依然として非常に重要です。
ステータス
に関連する
はありますか?最後に、キャプチャ頻度をできるだけ高く設定してみました。
クロールする Web サイトにログインする必要がある場合は、アカウントを一括登録し、ログインの成功をシミュレートし、順番にリクエストすることができます。 ログインに 確認コード が必要な場合は、さらに面倒になります。手動でログインしてから Cookie を保存してください (もちろん、能力がある場合は、OCR 認識を試すこともできます)。もちろん、ログイン後も、前の段落で説明した問題を考慮する必要があります。ログイン後はすべてがうまくいくというわけではありません。一部の Web サイトでは、ログイン後に頻繁にクロールされると、アカウントがブロックされます。
そこで、ログインを必要としない方法を探してみましょう。ブロックされたアカウントにログインしたり、アカウントを申請したり、アカウントを変更したりするのは面倒です。
データ ソースのクロールと深度
最初のデータ ソースの選択も重要です。私がやりたいのは、1 日に 1 回クロールすることなので、初期化アクションが完全に自動化され、基本的にクロールを管理する必要がないように、クロール Web サイトが毎日更新される場所を探しています。毎日から始まります更新は自動的に行われます。
クロールの深さも非常に重要です。これは、特定の Web サイト、ニーズ、クロールされたコンテンツに基づいて決定する必要があり、Web サイトのデータを可能な限り完全にキャプチャする必要があります。
最適化
1 つ目はキューで、スタックのような構造に変更されました。以前のキューでは、常に深いエンティティが最初に実行されていたため、
これによりキュー内のコンテンツが増加し、メモリ フットプリントが大きくなり、
再帰
は 3 で、各エンティティの下に 10 個のサブエンティティがあり、それらのキューの最大長は次のとおりです。
队列(lpush,rpop) => 1000个 修改之后的队列(lpush,lpop) => 28个上記 2 つのメソッドは次のようになります。同じ効果が得られますが、キューの長さが大きく異なることがわかるため、2 番目の方法に変更しました。 最大深度制限はキューに参加するときに処理され、最大深度を超えた場合は直接破棄されます。さらに、予期せぬ問題を防ぐために、キューの最大長も制限されています。 コード
以下は長くて退屈なコードです。もともと github に投稿したいと思っていましたが、プロジェクトが少し小さいと思ったので、友達に直接投稿したいと思いました。コードでもデザインでも、悪い点について話すことができます。
りー
以上がphpのシンプルなクローラーの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。