2012-04-26 4 views
2

Ruby + OpenURI + Nokogiriを使用してサイトをクロールしています。ページを取得し、すべてのa[href]と(同じドメインと正しいプロトコルにいる場合)それらをフォローして、再びクロールします。MIMEタイプに基づいたX/HTMLリンク(画像ではない)のみを取得する

大きなバイナリ(例:jpeg、exe)へのリンクがあり、それらをクロールしたくない場合があります。

私はそうのような間違ったMIMEタイプのエラーまたは空の応答を取得するためにHTTP "Accept" headerを使用してみました:

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

を...しかしOpenURIは別のMIMEタイプで送信されたバイナリをダウンロードします。 可能性ファイルタイプのURLにあるファイルの拡張子を見ている以外

はどのように私は、任意のURLのために(または競合する応答タイプを検出)、ダウンロードを防ぐことができますか?

答えて

3

あなたはレスポンスのContent-typeヘッダをチェックし、唯一それが許容できるかどう本当の要求を行い、その後、最初のHEADリクエストを送ることができます:

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 

これは、各ページのための余分な要求が必要になりますが、私はすることができますそれを避ける方法があります。また、GETの場合と同じように、HEAD要求と同じヘッダーを送信するサーバーに依存しています。これは合理的な前提ですが、認識しておくべきことです。

+1

HEADリクエストは移動方法です。サーバーがファイルの種類を見つけられない、または嘘をつくように指示されている場合でも、それは完全に間違っている可能性がありますが、依然として最良の選択です。 –

+0

これはうまくいくように見えますが、URLの拡張機能をテストするだけの場合と比較して、パフォーマンスが低下するのはサーバーが遅い場合です。私は正しい答えだから受け入れますが、残念ながら私は使用できません。ありがとう。 – Phrogz

関連する問題