【问题标题】:Repeated pattern inside URL [closed]URL内的重复模式[关闭]
【发布时间】:2012-09-15 21:09:43
【问题描述】:

有人可以帮助我们使用正则表达式来检测 URL 字符串中的重复模式吗?目标显然是检测 malformed 奇怪的 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/

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

此外,我知道可能有许多 URL 在路径中重复数字或其他值,因此任何解决此问题的建议都将受到欢迎。

非常感谢!

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

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

【问题讨论】:

  • 在你的例子中,没有重复的“模式”——只有“内容”这个词。如果这就是您所担心的,您可以使用substr_count,如果“内容”出现多次,请标记它。否则,请发布可能重复的可能模式示例。
  • 似乎这些是您需要重新映射到新系统的旧 URL - 看起来它们在系统中生成不正确。因此,我会找到并解决实际问题,而不是通过解析然后更正已经不正确的 URL 来解决它。
  • newfurniturey,你说得对,但我当然不知道还能出现什么,因为这是爬虫的一部分,信息流实际上很大,而且有很多网站有开发错误可以使系统无限循环。
  • prodigitalson,我也是这么想的,直到我意识到在使用 chrome 和 firefox 浏览网站时也会发生同样的情况。这是某些 wiki 实现中的错误。
  • 您甚至无法开始尝试调试其他人的网站。一些网站合法地在其 URL 中有重复的模式。有些在语义上可能有多余的重复,但仍然需要使站点正常工作。如果您正在制作爬虫,您会因提供错误 URL 的人而受到惩罚,您不会尝试解决他们的问题,尤其是当您查看黑匣子时可能出现的问题范围是无限的。

标签: php regex string url duplicate-data


【解决方案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

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

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 tarpit 来让爬虫放弃。因此,无论如何,您应该已经在这里拥有更强大的东西,以使您的爬虫更加强大。

【讨论】:

  • 非常感谢 Hakra,这是一个很好的方法,我同意,这些 URL 根本没有格式错误。我应该编辑这个问题。关于第 2 点和第 3 点,问题不在于我们的代码,而在于一些 Web 应用程序。如果你想明白我的意思,你可以看看这里,然后点击“Administrador MySQL”:elserver.com/ayuda/content/21/65/es
  • 刚刚更新了问题,现在应该更容易理解问题了:)
  • @ChrisRusso:更新了答案,您提供的数据更好地解释了它。但是没有预制库可以为您解决它,至少我不知道。我想说你需要有一点创意来处理它。
  • 非常感谢您的帮助,我现在完全同意您的看法,我们目前正在尝试创建一些算法,以便我们检测系统何时循环,我们已经在比较源使用与您之前描述的 MD5 过程非常相似。但是,我相信当 parse_url 的结果开始在路径参数中重复信息时,可以预测出类似的情况。我想我们会以这种方式解决问题,然后将结果与类似地址进行比较。再次感谢。
  • 是的,预测与机器学习有点关系。您将创建一个算法可以做出决策的世界,并且基于重复的内容检查可以识别决策何时正确或错误。不过,您需要决定是否值得编写这样的系统。
【解决方案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!");
?>

【讨论】:

  • 太棒了!!非常感谢 ridgerunner!
猜你喜欢
  • 1970-01-01
  • 2016-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-31
  • 2015-07-17
相关资源
最近更新 更多