有人可以帮助我们使用正则表达式来检测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”:
答案 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)
只是为了让你朝着正确的方向发展:
但除非你不发布任何代码,否则我们可以说不多。可能重复的问题是:
示例数据集显示数据存在问题:
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来看到它,所以你需要制定一个策略(或多个策略)来处理问题。
你可以举例......
显然,不同的策略需要您做更多或更少的工作,并且还会影响您对爬虫的数据结构和数据库。
正如你所看到的,这不是微不足道的。有些网站甚至提供无限的URL tarpits来让爬虫放弃。因此,您已经拥有了一些更强大的功能,可以让您的抓取工具更加强大。