2017-01-09 3 views
2

Не уверен, что это возможно, но я хотел бы проверить код состояния HTTP-запроса на большой файл без его загрузки; Я просто хочу проверить, присутствует ли он на сервере.Проверьте, существует ли большой файл без его загрузки

Возможно ли это с помощью Python's requests? Я уже знаю, как проверить код состояния, но я могу сделать это только после того, как файл был загружен.

Я предполагаю, что я спрашиваю, можете ли вы отправить запрос GET и остановить его, как только получите заголовки ответов?

+0

Может быть, [это сообщение] (http://stackoverflow.com/questions/14392432/checking-a-file-existence-on- a-remote-ssh-server-using-python) может вам помочь. –

+0

@ dot.Py, который использует вызов подпроцесса 'ssh' для проверки существования файла на SSH-сервере ... не такая же ситуация, но спасибо. – Juicy

ответ

2

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

Метод HEAD идентичен GET, за исключением того, что сервер НЕ ДОЛЖЕН вернуть тело сообщения в ответ. Метаинформация, содержащая в заголовках HTTP в ответ на запрос HEAD, ДОЛЖНА быть идентичной информации, отправленной в ответ на запрос GET. Этот метод может использоваться для получения метаинформации о сущности, подразумеваемой запросом , без передачи самого сущности. Этот метод часто используется для тестирования гипертекстовых ссылок на достоверность, доступность, и недавнюю модификацию.

, например:

import requests 
url = 'http://lmsotfy.com/so.png' 
r = requests.head(url) 
r.headers 

из:

{'Content-Type': 'image/png', 'Content-Length': '6347', 'ETag': '"18cb-4f7c2f94011da"', 'Accept-Ranges': 'bytes', 'Date': 'Mon, 09 Jan 2017 11:23:53 GMT', 'Last-Modified': 'Thu, 24 Apr 2014 05:18:04 GMT', 'Server': 'Apache', 'Keep-Alive': 'timeout=2, max=100', 'Connection': 'Keep-Alive'} 

этот код не загружает картинку, но и возвращает заголовок сообщения изображения, которое содержит размер, тип, дата , И если картина не существует, такой информации не будет.

0

Обычно вы используете метод HEAD вместо GET для таких вещей. Если вы запрашиваете какой-то случайный сервер в Интернете, тогда будьте готовы, чтобы его можно было настроить для возврата непоследовательных результатов (это типично для серверов, требующих регистрации). В таких случаях вы можете использовать запрос GET с Range header для загрузки только небольшого количества байтов.

0

Использование HEAD способ. Например urllib

import urllib.request 

response = urllib.request.urlopen(url) 
if response.getcode() == 200: 
    print(response.headers['content-length']) 

В вашем случае с requests

import requests 

response = requests.head(url) 
if response.status_code == 200: 
    print(response.headers['content-length'])