2

我正在使用 Ruby + OpenURI + Nokogiri 抓取一个网站。抓取一个页面,找到所有的a[href]并且(如果它们在同一个域和正确的协议中)跟随它们再次抓取。

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

我尝试使用HTTP“Accept”标头为错误的 mime 类型获取错误或空响应,如下所示:

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

...但 OpenURI 仍会下载使用另一种 mime 类型发送的二进制文件。

除了在 url 中查看可能的文件类型的文件扩展名之外,如何防止下载(或检测冲突的响应类型)任意 URL

4

1 回答 1

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请求发送与 a 相同的标头GET,我认为这是一个合理的假设,但需要注意。

于 2012-04-26T22:54:19.980 回答