2012-04-26 55 views
2

我使用Ruby + OpenURI + Nokogiri来爬取网站。抓取页面,找到所有a[href]和(如果它们位于相同的域和正确的协议中),请按照它们再次抓取。仅基于MIME类型获取X/HTML链接(不是图像)

有时会有链接到大的二进制文件(例如jpeg,exe),我不想抓取这些文件。

我尝试使用HTTP "Accept" header得到了错误的MIME类型错误或空的响应,像这样:

require 'open-uri' 
page = open(url, 'Accept'=>'text/html,application/xhtml+xml,application/xml') 

...但仍OpenURI下载与另一MIME类型发送二进制文件。

除了在URL看着文件扩展名的可能文件类型,我怎么能防止下载(或检测冲突响应型)任意URL

回答

3

你可以先发一个HEAD请求,然后检查响应的Content-type头,只让真正的要求,如果它是可以接受的:

ACCEPTABLE_TYPES = %w{text/html application/xhtml+xml application/xml} 

uri = URI(url) 

type = Net::HTTP.start(uri.host, uri.port) do |http| 
    http.head(uri.path).content_type 
end 

if ACCEPTABLE_TYPES.include? type 
    # fetch the url 
else 
    # do whatever 
end 

这将需要为每个页面一个额外的要求,但我可以没有办法避免它。它也依赖于服务器发送HEAD请求的相同头文件,它与GET相同,我认为这是一个合理的假设,但需要注意。

+1

HEAD请求是要走的路。即使这可能是完全错误的,如果服务器无法弄清楚文件类型,或被指示说谎,但它仍然是最好的选择。 – 2012-04-26 23:20:29

+0

这看起来很实用,但与仅测试URL扩展相比,性能受到影响的服务器速度很慢。我会接受它,因为这是正确的答案,但不幸的是我无法使用它。谢谢。 – Phrogz 2012-04-27 14:53:02