В python, как бы проверить, существует ли url, заканчивающийся на .jpg?
например: http://www.fakedomain.com/fakeImage.jpg
спасибо
В python, как бы проверить, существует ли url, заканчивающийся на .jpg?
например: http://www.fakedomain.com/fakeImage.jpg
спасибо
>>> 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 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.
спасибо за все ответы всем, в результате получилось следующее:
try:
f = urllib2.urlopen(urllib2.Request(url))
deadLinkFound = False
except:
deadLinkFound = True
Похоже, 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
Есть проблемы с предыдущими ответами, когда файл находится на 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
Попробуйте с 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'
Я думаю, вы можете попробовать отправить HTTP-запрос на URL-адрес и прочитать ответ. Если исключение не было обнаружено, оно, вероятно, существует.
Я не знаю, почему вы это делаете, но в любом случае: следует отметить, что только потому, что запрос на "образ" преуспевает, не означает, что это то, что вы думаете (оно может перенаправлять на что угодно, или возвращать любые данные любого типа и потенциально вызывать проблемы в зависимости от того, что вы делаете с ответом).
Извините, я продолжал рассказывать о онлайн-подвигах и о том, как защитить их сегодня: P
Это может быть достаточно хорошим, чтобы увидеть, существует ли URL-адрес файла.
import urllib
if urllib.urlopen('http://www.fakedomain.com/fakeImage.jpg').code == 200:
print 'File exists'