我试图为爬虫创建一个通用的regex模式,以避免所谓的“爬虫陷阱”(只添加url参数并引用相同页面的链接,这会导致大量无用的数据)。很多时候,这些链接只是一次又一次地将相同的部分添加到URL中。下面是一个日志文件的示例:
http://examplepage.com/cssms/chrome/cssms/chrome/cssms/pages/browse/cssms/pages/misc/...我可以使用正则表达式缩小爬虫的范围,并且我希望有一个模式,它告诉爬虫忽略所有有重复部分的内容。用正则表达式可以吗?谢谢你提前给我一些提示!
我只想澄清:
爬虫陷阱的设计并不是为了防止爬行,而是由于网页设计不佳。我们正在爬行的所有页面都明确地允许我们这样做!
发布于 2015-09-28 11:24:04
如果您已经在遍历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,})(?:[\/\&\?])(.*?\1){3,}.*')
for url in array:
if re.match(pattern1, url):
print "It matches; skipping this URL"
continue
print url 示例regex:
.*?([^\/\&?]{4,})(?:[\/\&\?])(.*?\1){3,}.*
([^\/\&?]{4,})匹配和捕获任何东西的序列,但不包含/&?,重复4次或更多次。(?:[\/\&\?])查找一个/,或者?(.*?(?:[\/\&\?])\1){3,}匹配任何东西,直到/&?,然后是我们捕获的内容,完成所有这3次或更多次。演示
发布于 2015-09-28 11:31:19
您可以使用Python/PERL (可能还有其他)中的反向引用来捕获重复的模式:
>>> re.search(r"(/.+)\1", "http://examplepage.com/cssms/chrome/cssms/chrome/cssms/pages/browse/cssms/pages/misc/").group(1)
'/cssms/chrome'\1引用第一个匹配,因此(/.+)\1意味着同一序列在一行中重复两次。前面的/只是为了避免与第一个重复字母(即http中的t )匹配的正则表达式,并在路径中捕获重复。
https://stackoverflow.com/questions/32821640
复制相似问题