web-dev-qa-db-fra.com

Obtenez la taille du fichier en utilisant les requêtes python, tout en obtenant uniquement l'en-tête

J'ai regardé la documentation des demandes, mais je n'arrive pas à trouver quoi que ce soit. Comment puis-je uniquement demander l'en-tête, afin de pouvoir évaluer la taille du fichier?

40
scandinavian_

Envoyer un demande HEAD :

>>> import requests
>>> response = requests.head('http://example.com')
>>> response.headers
    {'connection': 'close',
 'content-encoding': 'gzip',
 'content-length': '606',
 'content-type': 'text/html; charset=UTF-8',
 'date': 'Fri, 11 Jan 2013 02:32:34 GMT',
 'last-modified': 'Fri, 04 Jan 2013 01:17:22 GMT',
 'server': 'Apache/2.2.3 (CentOS)',
 'vary': 'Accept-Encoding'}

Une demande HEAD est comme une demande GET qui télécharge uniquement les en-têtes. Notez que c'est au serveur d'honorer réellement votre demande HEAD. Certains serveurs ne répondre aux demandes GET, vous devrez donc envoyer une demande GET et simplement fermer la connexion au lieu de télécharger le corps. Parfois, le serveur ne spécifie jamais la taille totale du fichier.

67
Blender

utilisez requests.get(url, stream=True).headers['Content-length']

stream=True signifie que lorsque la fonction revient, seul l'en-tête de la réponse est téléchargé, le corps de la réponse ne l'est pas .

Tous les deux requests.get et request.head peut vous obtenir des en-têtes mais il y a un avantage à utiliser get

  1. get est plus flexible, si vous voulez télécharger le corps de la réponse après avoir inspecté la longueur, vous pouvez commencer par accéder simplement à la propriété content ou en utilisant un iterator qui téléchargera le contenu en morceaux
  2. "La demande HEAD DEVRAIT être identique aux informations envoyées en réponse à une demande GET." mais ce n'est pas toujours le cas.

voici un exemple pour obtenir la longueur d'un vidéo de cours ouvert du MIT

MitOpenCourseUrl = "http://www.archive.org/download/MIT6.006F11/MIT6_006F11_lec01_300k.mp4"
resHead = requests.head(MitOpenCourseUrl)
resGet = requests.get(MitOpenCourseUrl,stream=True)
resHead.headers['Content-length'] # output 169
resGet.headers['Content-length'] # output 121291539
26
watashiSHUN