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/

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

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

非常感谢!

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

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

4

2 回答 2

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!");
?>
于 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

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

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

于 2012-09-24T12:33:13.123 回答