_>>> import httplib
>>>
>>> def exists(site, path):
... conn = httplib.HTTPConnection(site)
... conn.request('HEAD', path)
... response = conn.getresponse()
... conn.close()
... return response.status == 200
...
>>> exists('http://www.fakedomain.com', '/fakeImage.jpg')
False
_
ステータスが200以外の場合、リソースはURLに存在しません。これは、完全になくなったという意味ではありません。サーバーが301または302を返す場合、これはリソースがまだ存在しているが、別のURLにあることを意味します。このケースを処理するように関数を変更するには、ステータスチェック行をreturn response.status in (200, 301, 302)
に変更するだけです。
以下のコードは tikiboy's answer と同等ですが、高レベルで使いやすい requests ライブラリを使用しています。
import requests
def exists(path):
r = requests.head(path)
return r.status_code == requests.codes.ok
print exists('http://www.fakedomain.com/fakeImage.jpg')
requests.codes.ok
は200
と等しいため、必要に応じて正確なステータスコードに置き換えることができます。
requests.head
は、サーバーが応答しない場合に exception をスローする可能性があるため、try-exceptコンストラクトを追加することができます。
また、コード301
および302
を含める場合は、コード303
も検討してください。特に dereference URIs でリソースを示している場合 Linked Data 。 URIは人を表す場合がありますが、人をダウンロードすることはできないため、サーバーは 3リダイレクト を使用してこの人を説明するページにリダイレクトします。
全員のすべての応答に感謝し、最終的には以下を使用しました:
try:
f = urllib2.urlopen(urllib2.Request(url))
deadLinkFound = False
except:
deadLinkFound = True
ファイルがftpサーバー( ftp://url.com/file )にある場合、以前の回答には問題があります。ファイルがftp、http、またはhttpsにある場合、次のコードが機能します。
import urllib2
def file_exists(url):
request = urllib2.Request(url)
request.get_method = lambda : 'HEAD'
try:
response = urllib2.urlopen(request)
return True
except:
return False
http://www.fakedomain.com/fakeImage.jpg
はエラーなしでhttp://www.fakedomain.com/index.html
に自動的にリダイレクトされるようです。
301および302応答のリダイレクトは、ユーザーに応答を返すことなく自動的に行われます。
見てください HTTPRedirectHandler 、それを処理するためにサブクラス化する必要があるかもしれません。
以下は、Dive Into Pythonからの1つのサンプルです。
http://diveintopython3.ep.io/http-web-services.html#redirects
mechanize で試してください:
import mechanize
br = mechanize.Browser()
br.set_handle_redirect(False)
try:
br.open_novisit('http://www.fakedomain.com/fakeImage.jpg')
print 'OK'
except:
print 'KO'
これは、ファイルへのURLが存在するかどうかを確認するには十分な場合があります。
import urllib
if urllib.urlopen('http://www.fakedomain.com/fakeImage.jpg').code == 200:
print 'File exists'
私はあなたがURLにhttpリクエストを送信して応答を読み取ってみることができると思います。例外がキャッチされなかった場合、おそらく存在しています。
Python 3.6.5:
import http.client
def exists(site, path):
connection = http.client.HTTPConnection(site)
connection.request('HEAD', path)
response = connection.getresponse()
connection.close()
return response.status == 200
exists("www.fakedomain.com", "/fakeImage.jpg")
Python 3で、モジュールhttplib
はhttp.client
に名前が変更されました
また、httplib
はhttp://
をポート番号と見なし、ポート番号は数値である必要があるため、URLからhttps://
および:
を削除する必要があります。
なぜそうしているのかはわかりませんが、いずれにしても、「イメージ」へのリクエストが成功したからといって、それが意図したとおりであるとは限らないことに注意してください(何にでもリダイレクトされる可能性があり、または、任意のタイプのデータを返し、応答で何をするかによっては問題を引き起こす可能性があります。
申し訳ありませんが、私はオンラインエクスプロイトと、今日のエクスプロイトからどのように防御するかについて、どんどん読んでいました:P
Python3
import requests
def url_exists(url):
"""Check if resource exist?"""
if not url:
raise ValueError("url is required")
try:
resp = requests.head(url)
return True if resp.status_code == 200 else False
except Exception as e:
return False