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リクエストに送信することに依存していますGET。これは合理的な仮定ですが、注意が必要です。

于 2012-04-26T22:54:19.980 に答える