Подтвердить что ты не робот

Python: проверьте, существует ли url для jpg

В python, как бы проверить, существует ли url, заканчивающийся на .jpg?

например: http://www.fakedomain.com/fakeImage.jpg

спасибо

4b9b3361

Ответ 1

>>> 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).

Ответ 2

Код ниже эквивалентен tikiboy 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, особенно если вы URI разделов которые обозначают ресурсы в Связанные данные. URI может представлять человека, но вы не можете загрузить человека, поэтому сервер перенаправит вас на страницу, описывающую этого человека, используя 303 redirect.

Ответ 3

спасибо за все ответы всем, в результате получилось следующее:

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

Ответ 4

Похоже, http://www.fakedomain.com/fakeImage.jpg автоматически перенаправляется на http://www.fakedomain.com/index.html без ошибок.

Перенаправление для ответов 301 и 302 автоматически выполняется без ответа пользователю.

Пожалуйста, посмотрите HTTPRedirectHandler, вам может потребоваться подкласс для его обработки.

Вот один образец из Dive Into Python:

http://diveintopython3.ep.io/http-web-services.html#redirects

Ответ 5

Есть проблемы с предыдущими ответами, когда файл находится на 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

Ответ 6

Попробуйте с 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'

Ответ 7

Я думаю, вы можете попробовать отправить HTTP-запрос на URL-адрес и прочитать ответ. Если исключение не было обнаружено, оно, вероятно, существует.

Ответ 8

Я не знаю, почему вы это делаете, но в любом случае: следует отметить, что только потому, что запрос на "образ" преуспевает, не означает, что это то, что вы думаете (оно может перенаправлять на что угодно, или возвращать любые данные любого типа и потенциально вызывать проблемы в зависимости от того, что вы делаете с ответом).

Извините, я продолжал рассказывать о онлайн-подвигах и о том, как защитить их сегодня: P

Ответ 9

Это может быть достаточно хорошим, чтобы увидеть, существует ли URL-адрес файла.

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