ローダーの理論

過去5年間、私は多くのローダーを書いてきました。 これらは、ソースサイトでOldを解析し、それをベースに保存する、いわゆるプログラムです。 多くの場合、これらは一連の正規表現であり、その助けを借りて必要なセルに値が見つかります。 ローダーはログインでき、プロキシ経由で接続でき、保護イメージを認識することさえあります。 これはポイントではありません。



理論的な問題は、完全に自動化されたローダーを書くことができないことです。 任意の情報をプラグインできますが、ローダーがソースサイトの分類を失うと、ベースはダンプに変わります。 そして、分類の保存を開始すると、問題が発生します。







例を考えてみましょう。 他の何百ものリソースから自動車を販売するための広告がロードされる自動車サイトがあるとします。 ローダーの解析を宣言し、配列を発行します。



{:"ford", :"focus", :"1.6 Ti-VCT 5d", : ...}.







自動ローダーは次のように動作することがよくあります。ブランドのテーブルを名前で検索し、フォードがある場合はブランドのIDを取得し、そうでない場合はブランドに「フォード」を追加してそのIDを取得します。 モデルおよび修正についても同様です。 次に、受信したid-shnikiを含む広告を追加します。 このようなシステムは、「FORD」または「VAZ」ではなく「VAZ」または「AvtoVAZ」または「サンクトペテルブルク」ではなく「サンクトペテルブルク」がブランドの代わりになるというアナウンスが必ずあるという点で悪いです。サンクトペテルブルク、サンクトペテルブルク。 Smart Googleはこれらが同義語であることを理解しますが、愚かなローダーは名前を文字ごとにチェックします。 その結果、分類されたテーブルが混乱します。



Mongol /モデレーターの手作業を最小限に抑えようとして、私はそのようなアルゴリズムを思いつきました。



まず、ローダーは2つの部分で構成されています。



最初はloader_pagesです。

このスクリプトは、 http: //cars.auto.ru/cars/used/ford/focus/のような広告のリストを含むページをスキャンし、個々の広告へのリンクを愚かに収集します。 +ページ遷移へのリンクを見つけ、それらを再帰します。 私はそれを宣言するリンクを見つけました-データベースにそれを追加するか、既に追加されている場合は、「最後に見つかった日付」を現在の日付に更新しました。 これは、(ローダーが1時間ごとに動作する)リンクの場所の日付が非常に古いオブジェクトを削除するために必要です(これは、リンクが見つからなかったこと、つまりオブジェクトがソースから削除されたことを意味します)。



2番目はloader_offerです。

まだ処理されていないリンクをデータベースから取得し、htmlを読み込み、解析します。 型の配列を取得します



{:"ford", :"focus", :"1.6 Ti-VCT 5d", : ...}







比較プレートをロードします。 モデレーターによって手動で処理される比較が含まれています。 プレートは次のフィールドで構成されています。



{,, ,id }.







私たちの場合、



{:"auto.ru",:"",:"ford",:"..."}.







対応する比較が既に行われている場合、歓声が勝ち、id-shnikを取得します。 そうでない場合は、新しい比較を追加して比較しますが、オブジェクトは追加しません。



モデレーターは、下に置かれていない比較を調べ、対応する「良い」テーブルの値を車のブランド、モデル、都市などと比較します。



両親。

テーブルが小さい間、すべてがうまく機能します。 たとえば、自動車ブランド-それらは100のみです。 私のデータベースには7000のモデルがあり、20.000の修正があります。 私が「1.6 Ti-VCT」と呼んでいる修正「1.6 Ti-VCT 5d」の比較を選択した場合、2万人の中から想像してください。 モデレーターは死にかけています。 または、適切な検索が必要です。



しかし、あなたはそれを簡単にすることができます。 広告を読み込む場合、変更後、最初にブランド、次にモデルの順に比較を処理します。 ブランドを比較してみましょう。



{:"auto.ru",:"",:"ford",:"..."},







それを見つけるか、それを追加します-ポイントではありません。 この比較のid-shnikを取得して、追加フィールドの親に書き込み、モデルを比較します。



{:"auto.ru",:"",:"focus",:"...",parent:"id "}.







修正でも同じことを行い、その親でモデル比較IDを記述します。



モデレーターは順番に機能します。 最初に彼はブランドの比較を取り、それらをすべて書き留めます。 次に、モデルの比較を行います。 同時に、比較にはブランドの親比較があり、これはすでに添付されているため、比較のオプションとして、すべての可能なモデルではなく、ブランドがこの親比較の値に対応するモデルのみを表示する必要があります。 まあ、つまり、フォードが置かれた、そしてフォーカスは7000モデルからではなく、何百ものフォードモデルから選択されます。



この投稿の本質は、まったく新しいものを思いついたということではありません。 これらのプログラムの説明はどこにも見ていません。 原則として、各オブジェクトはいくつかのツリーの頂点のサブセットであり、パーサーはページのhtmlコード要素をこれらの頂点にマッピングすることは明らかであるため、過度の実用性が本当に好きです。 パーサーを記述するための言語など、理論を持ち込むことも可能です。一方、私にとっての平均的なphpローダーコードは2ページかかります。 そして、理論を使ってスチームバスを浴びる価値があるかどうかは明らかではありません。抽象コードを使用しても、このコードをさらに削減して単純化する方法がわかりません。



All Articles