web-dev-qa-db-ja.com

python:jpgへのURLが存在するかどうかを確認します

Pythonでは、.jpgで終わるURLが存在するかどうかをどのように確認しますか?

例: http://www.fakedomain.com/fakeImage.jpg

ありがとう

31
user257543
_>>> 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)に変更するだけです。

33
tikiboy

以下のコードは 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.ok200と等しいため、必要に応じて正確なステータスコードに置き換えることができます。

requests.headは、サーバーが応答しない場合に exception をスローする可能性があるため、try-exceptコンストラクトを追加することができます。

また、コード301および302を含める場合は、コード303も検討してください。特に dereference URIs でリソースを示している場合 Linked Data 。 URIは人を表す場合がありますが、人をダウンロードすることはできないため、サーバーは 3リダイレクト を使用してこの人を説明するページにリダイレクトします。

34

全員のすべての応答に感謝し、最終的には以下を使用しました:

try:
  f = urllib2.urlopen(urllib2.Request(url))
  deadLinkFound = False
except:
  deadLinkFound = True
7
user257543

ファイルが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
4
XavierCLL

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

4
YOU

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'
1
systempuntoout

これは、ファイルへのURLが存在するかどうかを確認するには十分な場合があります。

import urllib
if urllib.urlopen('http://www.fakedomain.com/fakeImage.jpg').code == 200:
  print 'File exists'
0
z3moon

私はあなたがURLにhttpリクエストを送信して応答を読み取ってみることができると思います。例外がキャッチされなかった場合、おそらく存在しています。

0
Young

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で、モジュールhttplibhttp.clientに名前が変更されました

また、httplibhttp://をポート番号と見なし、ポート番号は数値である必要があるため、URLからhttps://および:を削除する必要があります。

0
dengApro

なぜそうしているのかはわかりませんが、いずれにしても、「イメージ」へのリクエストが成功したからといって、それが意図したとおりであるとは限らないことに注意してください(何にでもリダイレクトされる可能性があり、または、任意のタイプのデータを返し、応答で何をするかによっては問題を引き起こす可能性があります。

申し訳ありませんが、私はオンラインエクスプロイトと、今日のエクスプロイトからどのように防御するかについて、どんどん読んでいました:P

0
Carson Myers

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
0
Anthony Awuley