1

URL 文字列内で繰り返されるパターンを検出するための正規表現について誰か助けてくれませんか? 目的は明らかに、不正な奇妙な URL を検出することです。

たとえば、次の URL は問題ありません。

http://www.somewhere.com/help/content/21/23/en/
http://www.somewhere.com/help/content/21/24/en/
http://www.somewhere.com/help/content/21/64/en/
http://www.somewhere.com/help/content/21/65/en/
http://www.somewhere.com/help/content/21/67/en/

これは間違っていますが、タグ付けする必要があります:

http://www.somewhere.com/help/content/21/content/1/54/en/
http://www.somewhere.com/help/content/21/content/1/62/en/
http://www.somewhere.com/help/content/21/content/8/52/en/

内容が2回繰り返されるので。これまでのところ、parse_url と爆発を使用してこれを解決してきましたが、非常に効率が悪いようです!

同様に、パスに数字やその他の値を繰り返す URL が多数ある可能性があることも承知しているため、この問題を解決するための提案は大歓迎です。

どうもありがとう!

この問題をよりよく理解するには、次のリンクにアクセスして、[Administrador MySQL] をクリックしてください。

http://www.elserver.com/ayuda/content/21/65/es/

4

2 に答える 2

2

URL のリストを 1 行に 1 つずつ含むファイル ( testdata.txt) があると仮定すると、次のテスト済みスクリプトは、(少なくとも) 1 つの繰り返しパス セグメントを持つ URL を抽出します。

<?php // test.php Rev:20120924_0800
$re = '%
    ^                  # Anchor to start of line.
    (?:[^:/?#\s]+:)?   # URI scheme (optional).
    (?://[^/?#\s]*)?   # URI Authority (optional).
    (?:/[^/?#\s]*)*?   # URI path segments (before repeats).
    /([^/?#\s]+)       # $1: Repeated URI path segment.
    (?:/[^/?#\s]*)*?   # URI path segments (between repeats)
    /\1                # $1: Repeated URI path segment.
    (?:/[^/?#\s]*)*    # URI path segments (after repeats).
    (?:\?[^#\s]*)?     # URI query (optional).
    (?:\#\S*)?         # URI fragment (optional).
    $                  # Anchor to end of line.
    %mx';
$text = file_get_contents('testdata.txt');
if (preg_match_all($re, $text, $matches)) print_r($matches[0]);
else echo("no matches!");
?>
于 2012-09-24T14:54:10.883 に答える
1

正しい方向に導くためのいくつかの指針:

  • URI の形式が正しくありません。これらは構文的に正しいため、整形式です。
  • 問題を解決するには、最初からこれらの URI を生成しないでください。
  • スクレーパーを作成する場合は、相対 URI をドキュメントのベース URI に解決する方法の処理など、標準を遵守する必要があります: https://www.rfc-editor.org/rfc/rfc3986#section-4.2

しかし、コードを投稿しない限り、私たちが言えることはあまりありません。おそらく重複した質問は次のとおりです。


データセットの例は、データに問題があることを示しています。

Base URI: http://www.elserver.com/ayuda/content/21/65/es/
HREF    : content/1/62/es/%BFc%F3mo-ingreso-al-phpmyadmin.html
          (ISO/IEC 8859-1    %BF = ¿    %F3 = ó)

これは、次の絶対 URI に正しく解決されます。

http://www.elserver.com/ayuda/content/21/65/es/content/1/62/es/%BFc%F3mo-ingreso-al-phpmyadmin.html

これにより、重複したコンテンツが生成されます。明らかに、これは Web サイトで行われたエラーであり、テストによって簡単に確認できます。

http://www.elserver.com/ayuda/content/1/62/es/%BFc%F3mo-ingreso-al-phpmyadmin.html

2 つの URI を調べただけでは、それらが同じであることを確認できないため、問題にどのように対処するか (または複数の戦略) を策定する必要があります。

たとえば...

  • ... 自分で内容を比較して重複を探します。たとえば、内容の MD5 および SHA-1 チェックサムを作成し、リストを保持します。両方のチェックサムが同じであれば、内容も同じである可能性が高いです。
  • ... URI が長くなりすぎている場合は、URI が壊れていると判断します。
  • ... どの URL パターンが重複コンテンツを作成するかを学習する機械学習を確立します。
  • ... この種の問題を検出するために指定されたベース URI と相対 URI の間に重複がある場合は、「試すのに十分な」URI を作成します。これらの URI が機能するかどうかをテストします。

明らかに、異なる戦略では多かれ少なかれ作業を行う必要があり、クローラーで使用するデータ構造とデータベースにも影響を与えます。

ご覧のとおり、これは簡単なことではありません。一部の Web サイトでは、無限の URL ターピットを提供して、クローラーをあきらめさせます。したがって、クローラーをより堅牢にするために、とにかくここでより堅牢なものを用意する必要があります。

于 2012-09-24T12:33:13.123 に答える