正则表达式:匹配重复的未知组?

Regex: matching unknown groups that repeat?

我正在尝试为爬虫创建一个通用的正则表达式模式,以避免所谓的 "crawler traps"(仅添加 url 参数并引用完全相同页面的链接,这会导致大量无用的数据)。很多时候,这些链接只是一遍又一遍地将相同的部分添加到 URL。这是日志文件中的示例:

http://examplepage.com/cssms/chrome/cssms/chrome/cssms/pages/browse/cssms/pages/misc/...

我可以使用正则表达式来缩小爬虫的范围,我希望有一个模式,告诉爬虫忽略所有具有重复部分的内容。正则表达式可能吗? 预先感谢您提供一些提示!

澄清一下:

爬虫陷阱并不是为了防止抓取而设计的,它们是糟糕的网页设计的结果。我们正在抓取的所有页面都明确允许我们这样做!

如果您已经在 URL 列表中循环,您可以添加匹配作为跳过当前迭代的条件:

array = ["/abcd/abcd/abcd/abcd/", "http://examplepage.com/cssms/chrome/cssms/chrome/cssms/pages/browse/cssms/pages/misc/", "http://examplepage/apple/cake/banana/"]

import re
pattern1 = re.compile(r'.*?([^\/\&?]{4,})(?:[\/\&\?])(.*?){3,}.*')

for url in array:
    if re.match(pattern1, url):
        print "It matches; skipping this URL"
        continue 
    print url 

正则表达式示例:

.*?([^\/\&?]{4,})(?:[\/\&\?])(.*?){3,}.*

([^\/\&?]{4,}) 匹配并捕获任何内容的序列,但不包含 [/&?],重复 4 次或更多次。 (?:[\/\&\?]) 查找一个 /,& 或 ? (.*?(?:[\/\&\?])){3,} 匹配任何内容直到 [/&?],然后是我们捕获的内容,所有这些都执行 3 次或更多次。 demo

您可以在 Python/PERL 正则表达式(可能还有其他)中使用反向引用来捕获重复的模式:

>>> re.search(r"(/.+)", "http://examplepage.com/cssms/chrome/cssms/chrome/cssms/pages/browse/cssms/pages/misc/").group(1)
'/cssms/chrome'

</code> 引用第一个匹配项,因此 <code>(/.+) 表示 同一序列连续重复两次 。前导 / 只是为了避免正则表达式匹配第一个重复字母(即 http 中的 t)并捕获路径中的重复。