0

さまざまなソースからURLをスクレイピングするスクリプトがあり、リストがかなり大きくなっています。現在、不要なサイトを除外するために使用しているifステートメントのコレクションがあります。これは明らかに保守できないので、URLマスクのブラックリストに対してフィルタリングするための高速で強力なソリューションを見つけようとしています。

私が思いつくことができる最善のことは、正規表現パターンの配列をループし、一致するものをすべてフィルタリングすることです。これは本当に私の最善の策ですか、それとも仕事をより良くする別の方法がありますか?

4

4 に答える 4

3

ドメイン名、または「可変部分」を持たないURLを除外する場合、解決策は、URLのみを含み、適切なインデックスを持つテーブルを備えたデータベースを使用し、クイックマッチを実行することです。

URLを処理してはならないかどうかを判断することは、問題であるか、そのDBに対して簡単なクエリを実行するだけです(これは通常、「URLが等しい」または「URLはで始まる」を意味します) -これはSQLiteと同じくらい簡単です。 DB。ファイルに収まり、追加のサーバーを必要としません。


PHP配列のアイデアには、1つの欠点があります。配列が大きくなると、それをメモリに格納するためだけに、ますます多くのメモリが必要になります。そして、いつの日か、メモリを使いすぎて、ヒットするでしょう。memory_limit; 数千を超えるURLがある場合、そのソリューションは最適なソリューションではない可能性があります。

それでも、URLまたはパターンが2つしかない場合は、PHP配列をループして、各値をstrpos ("contains"または"starts with"の場合)またはpreg_match (regexの場合)と比較すると問題ありません。 -そして、実装するのが最も簡単なものです。


複雑なマッチングルールを使用する場合は、ある種の正規表現を使用することがおそらく唯一の現実的な方法です... PHP側、with preg_match、またはSQLサーバー(たとえば、MySQLは正規表現をサポートしています。私の知る限り、パフォーマンスについてはわかりませんが、11.4.2を参照してください。詳細については正規表現

于 2009-09-18T21:10:15.290 に答える
1

サイトをハッシュに保持し、そのように検索する必要があります。シンプルでエレガントです。

    $excluded['www.google.com'] = true;
    $excluded['www.mapquest.com'] = true;
    $excluded['www.yahoo.com'] = true;

    $url = "http://www.google.com?q=barefoot+winery";

    $urlArray = parse_url($url)

    if (! isset($excluded[$urlArray['host']]))
    {
        scrape($url)
    }

パスカルがしばらくすると言ったように、あなたは記憶の問題に遭遇するでしょう。しかし、その時点でURLを維持することはより大きな問題になります。それが起こったらデータベースを探してください。

于 2009-09-18T21:55:37.713 に答える
0

パターンを指定できるようにする必要がある場合は、正規表現の配列をループすることでおそらく問題ありません。

完全一致のみを表示する必要があり、パターンを表示する必要がない場合は、strposなどを使用して、まっすぐな文字列一致を実行できます。これは、多少高速になるはずです。

于 2009-09-18T21:09:53.593 に答える
0

アイテムの長いリストを毎回メモリにロードしますか?egrepまたはgrepが最良の方法だと思います。Linuxでは、ファイルはファイルキャッシュに残り、結果は非常に高速になります。egrepはファイルを実行するため、すべてのapacheスレッドがリストのコピーをメモリに保持するわけではありません。

于 2009-09-18T21:12:28.593 に答える