URL内的重复模式

时间:2012-09-24 11:50:39

标签: php regex string url duplicate-data

有人可以帮助我们使用正则表达式来检测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/

由于内容重复两次。到目前为止,我们一直在使用parse_url和explode解决这个问题,但看起来效率很低!

同样,我知道可能有很多网址会在路径中重复一个数字,或者其他一些值,所以任何解决此问题的建议都会受到欢迎。

非常感谢!

为了更好地理解该问题,您可以访问以下链接并单击“Administrador MySQL”:

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

2 个答案:

答案 0 :(得分:2)

假设您有一个文件(testdata.txt),其中包含一个URL列表,每行一个,以下测试过的脚本将提取具有(至少)一个重复路径段的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!");
?>

答案 1 :(得分:1)

只是为了让你朝着正确的方向发展:

  • URI不是格式错误。它们在语法上是正确的,因此很好。
  • 要解决您的问题,请不要首先生成这些URI。
  • 如果您创建了一个scraper,则需要遵守标准,包括如何解析文档基URI的相对URI的处理:http://tools.ietf.org/html/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

产生重复内容。显然这是在网站上做的错误,可以通过测试轻松验证:

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

因为你不能通过查看它们相同的两个URI来看到它,所以你需要制定一个策略(或多个策略)来处理问题。

你可以举例......

  • ...比较您自己的重复内容,例如:创建内容的MD5和SHA-1校验和并保留列表。如果两个校验和相同,则内容很可能也是相同的。
  • ...决定如果URI过长,它们就会被破坏。
  • ...建立机器学习以了解哪些URL模式会创建重复内容。
  • ...如果基URI和用于检测这类问题的相对URI之间存在一些重叠,则创建“足够好以尝试”URI。测试这些URI是否有效。

显然,不同的策略需要您做更多或更少的工作,并且还会影响您对爬虫的数据结构和数据库。

正如你所看到的,这不是微不足道的。有些网站甚至提供无限的URL tarpits来让爬虫放弃。因此,您已经拥有了一些更强大的功能,可以让您的抓取工具更加强大。