2012-01-17 92 views
0

我正在写一个网络爬虫,并希望忽略其链接到二进制文件的URL:如何忽略网络爬虫中的文件类型?

$exclude = %w(flv swf png jpg gif asx zip rar tar 7z gz jar js css dtd xsd ico raw mp3 mp4 wav wmv ape aac ac3 wma aiff mpg mpeg avi mov ogg mkv mka asx asf mp2 m1v m3u f4v pdf doc xls ppt pps bin exe rss xml) 

我如何检查URI对这些结局吗?

@url = URI.parse(url) 

如果它不包含任何上述后缀,应该设置。

回答

2

使用URI路径#:

unless URI.parse(url).path =~ /\.(\w+)$/ && $exclude.include?($1) 
    puts "downloading #{url}..." 
end 
0

您可以用正则表达式或split剥离的URL的文件扩展名(我这里显示了后者,但要注意这也将匹配一些恶意的URL,如http://foo.exe),然后用Array#include?检查成员:

@url = URI.parse(url) unless $exclude.include?(url.split('.').last) 
1

红宝石缺乏一个Perl有一个真正有用的模块,称为正则表达式::组装。 Ruby的Regexp :: Union远不及它。以下是如何使用正则表达式::组装,其结果是:

use Regexp::Assemble; 

my @extensions = sort qw(flv swf png jpg gif asx zip rar tar 7z gz jar js css dtd xsd ico raw mp3 mp4 wav wmv ape aac ac3 wma aiff mpg mpeg avi mov ogg mkv mka asx asf mp2 m1v m3u f4v pdf doc xls ppt pps bin exe rss xml); 

my $ra = Regexp::Assemble->new; 
$ra->add(@extensions); 

print $ra->re, "\n"; 

,输出:

(?-xism:(?:m(?:p(?:[234]|e?g)|[1o]v|k[av]|3u)|a(?:s[fx]|iff|ac|c3|pe|vi)|p(?:p[st]|df|ng)|r(?:a[rw]|ss)|w(?:m[av]|av)|x(?:ls|ml|sd)|j(?:ar|pg|s)|d(?:oc|td)|g(?:if|z)|f[4l]v|bin|css|exe|ico|ogg|swf|tar|zip|7z)) 

Perl的支持s标志和Ruby没有,所以需要取出的?-xism ,并且我们要忽略字符大小写,因此i需要移动,导致?i-xm

把它插入到一个Ruby脚本正则表达式:

REGEX = /(?i-xm:(?:m(?:p(?:[234]|e?g)|[1o]v|k[av]|3u)|a(?:s[fx]|iff|ac|c3|pe|vi)|p(?:p[st]|df|ng)|r(?:a[rw]|ss)|w(?:m[av]|av)|x(?:ls|ml|sd)|j(?:ar|pg|s)|d(?:oc|td)|g(?:if|z)|f[4l]v|bin|css|exe|ico|ogg|swf|tar|zip|7z))/ 

@url = URI.parse(url) 

puts @url.path[REGEX] 

uri = URI.parse('http://foo.com/bar.jpg') 
uri.path  # => "/bar.jpg" 
uri.path[REGEX] # => "jpg" 

请参阅“Is there an efficient way to perform hundreds of text substitutions in Ruby?”了解有关使用正则表达式::从红宝石装配。