2012-01-17 96 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?」瞭解有關使用正則表達式::從紅寶石裝配。