phpのシンプルなクローラー

大家讲道理
大家讲道理オリジナル
2018-05-14 14:45:458860ブラウズ

シンプルなクローラーのデザイン

はじめに

これがクローラーというと少し大げさですが、名前がちょうどいいので、それを示すために前に「シンプル」という単語を追加しました
これは去勢されたクローラーで、シンプルです使うか、まだ遊んでも大丈夫です。
その会社は最近、競合製品のデータをキャプチャする新しいビジネスを始めました。以前のクラスメートが作成したキャプチャ システムを読んだところ、いくつかの問題がありました。ルールが強すぎて、拡張性と汎用性が少し異なります。以前のシステムはリストを作成し、そのリストからクロールする必要があり、深さの概念がありませんでした。これがクローラーにとっての欠点でした。そこで、
もう少し一般的なクローラーを作成し、深さの概念を追加して、拡張性と汎用性を向上させることにしました。

デザイン

ここでは、処理されるコンテンツ (おそらく URL、ユーザー名など) をエンティティと呼ぶことに同意します。

スケーラビリティを考慮して、

キュー
の概念を採用しています。処理されるエンティティはすべてキューに格納され、処理のたびにエンティティをキューから取り出し、処理が完了したらそれを格納します。新しいエンティティはキューに保存されます。もちろん、ここではプロセッサが無駄な作業を行わないようにするために、ストレージの重複排除とエンキューの重複排除も必要です。

  +--------+ +-----------+ +----------+
  | entity | |  enqueue  | |  result  |
  |  list  | | uniq list | | uniq list|
  |        | |           | |          |
  |        | |           | |          |
  |        | |           | |          |
  |        | |           | |          |
  +--------+ +-----------+ +----------+

各エンティティがキューに入るとき、enqueue と requeue は enqueued エンティティ フラグを 1 に設定し、その後キューに参加しなくなります。
entity が処理されると、結果データが取得され、結果が返されます。データが処理され、結果の詩を 結果データの並べ替えリスト としてマークします。 もちろん、ここで

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 サイトに関する関連情報をインターネットで検索したり、以前にその Web サイトをクロールした人がいるかどうかを確認したり、

経験を吸収したりすることができます。次に、Web サイトのリクエストを自分で注意深く分析して、Web サイトのリクエストが特別なパラメーターをもたらすかどうかを確認する必要があります。ログインしていない

ステータス
に関連する

Cookie

はありますか?最後に、キャプチャ頻度をできるだけ高く設定してみました。

クロールする Web サイトにログインする必要がある場合は、アカウントを一括登録し、ログインの成功をシミュレートし、順番にリクエストすることができます。 ログインに 確認コード が必要な場合は、さらに面倒になります。手動でログインしてから Cookie を保存してください (もちろん、能力がある場合は、OCR 認識を試すこともできます)。もちろん、ログイン後も、前の段落で説明した問題を考慮する必要があります。ログイン後はすべてがうまくいくというわけではありません。一部の Web サイトでは、ログイン後に頻繁にクロールされると、アカウントがブロックされます。
そこで、ログインを必要としない方法を探してみましょう。ブロックされたアカウントにログインしたり、アカウントを申請したり、アカウントを変更したりするのは面倒です。

データ ソースのクロールと深度
最初のデータ ソースの選択も重要です。私がやりたいのは、1 日に 1 回クロールすることなので、初期化アクションが完全に自動化され、基本的にクロールを管理する必要がないように、クロール Web サイトが毎日更新される場所を探しています。毎日から始まります更新は自動的に行われます。

クロールの深さも非常に重要です。これは、特定の Web サイト、ニーズ、クロールされたコンテンツに基づいて決定する必要があり、Web サイトのデータを可能な限り完全にキャプチャする必要があります。

最適化

本番環境で実行した後、いくつかの場所が変更されました。

1 つ目はキューで、スタックのような構造に変更されました。以前のキューでは、常に深いエンティティが最初に実行されていたため、
これによりキュー内のコンテンツが増加し、メモリ フットプリントが大きくなり、
再帰

最初に 1 つのエンティティが処理されるようになりました。深さを確認してから、次のエンティティに進みます。たとえば、最初の 10 個のエンティティ (deep=1) の場合、最大クロールの深さ

は 3 で、各エンティティの下に 10 個のサブエンティティがあり、それらのキューの最大長は次のとおりです。

    队列(lpush,rpop)              => 1000个
    修改之后的队列(lpush,lpop)   => 28个
上記 2 つのメソッドは次のようになります。同じ効果が得られますが、キューの長さが大きく異なることがわかるため、2 番目の方法に変更しました。

最大深度制限はキューに参加するときに処理され、最大深度を超えた場合は直接破棄されます。さらに、予期せぬ問題を防ぐために、キューの最大長も制限されています。

コード


以下は長くて退屈なコードです。もともと github に投稿したいと思っていましたが、プロジェクトが少し小さいと思ったので、友達に直接投稿したいと思いました。コードでもデザインでも、悪い点について話すことができます。
りー

以上がphpのシンプルなクローラーの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。