6
votes

Comment puis-je obtenir un type de contenu d'un fichier à Python? (avec URL ..)

Supposons que je haev un fichier vidéo:

http://mydomain.com/thevideofile.mp4 p>

Comment puis-je obtenir l'en-tête et le type de contenu de ce fichier? Avec python. Mais, je ne veux pas télécharger tout le fichier. Je veux qu'il retourne: p> xxx pré>

éditer: c'est ce que j'ai fait. Que pensez-vous? P>

f = urllib2.urlopen(url)
    params['mime'] =  f.headers['content-type']


2 commentaires

urlopen (URL) téléchargera tout le fichier pour obtenir les en-têtes. Une solution consiste à utiliser une demande personnalisée qui indiquera Urlopen d'utiliser la tête pour ouvrir l'URL au lieu d'obtenir


FORVEURE Le test montre que l'ensemble du fichier n'est pas téléchargé, juste un morceau de taille arbitraire et la connexion reste ouverte jusqu'à ce que f est hors de portée - il s'agit d'un peu de mauvaise chose à faire sur le serveur.


3 Réponses :


12
votes

Comme: xxx

qui ne fera que télécharger et imprimer les en-têtes car il fabrique un Demande Demande:

demande la réponse identique à celle qui correspondrait à un get demande, mais sans la réponse corps. Ceci est utile pour récupérer méta-information écrit en réponse en-têtes, sans avoir à transporter tout le contenu.

(via Wikipedia )


4 commentaires

Y a-t-il quelque chose de mal avec le mien? F = URLLIB2.URLOPEN (URL) paramètres ['MIME'] = F.Headers ['Type de contenu']


@ALEX: Oui, il téléchargera tout le fichier.


S'il vous plaît reformulation. Il ne téléchargera pas l'ensemble du fichier.


J'ai fait des tests avec Ettercap. Une demande de tête télécharge environ 400 octets, la manière dont Alex a suggéré de télécharger le premier 80k ou donc du fichier et laisse la connexion suspendue.



4
votes

C'est une réponse de niveau plus élevée que celle de Brian. L'utilisation des machines URLLIB a les avantages habituels tels que la manipulation automatique des redirections automatiquement et ainsi de suite.

import urllib2

class HeadRequest(urllib2.Request):
    def get_method(self):
        return "HEAD"

url = "http://mydomain.com/thevideofile.mp4"
head = urllib2.urlopen(HeadRequest(url))
head.read()          # This will return empty string and closes the connection
print head.headers.maintype
print head.headers.subtype
print head.headers.type


0 commentaires

0
votes

Vous pouvez obtenir le type de vidéo à l'aide de la méthode Info () ou des en-têtes DICT

$ cat test.py
#!/usr/bin/env python
import urllib2
url="http://www.merseypirates.com/rjnsteve/rjnsteve/oem16.avi"
f=urllib2.urlopen(url)
print f.headers['Content-Type']

$ time python test.py
video/x-msvideo

real    0m4.931s
user    0m0.115s
sys     0m0.042s


6 commentaires

Qui téléchargera tout le fichier.


Téléchargez tout le fichier? Comme dans le téléchargement sur local et j'ai donc un fichier physique réel? Non, ce ne sera pas. En outre, op demande ce qui ne va pas avec cette méthode, alors je le montrais là où il a tort.


Il fera une demande qui sera Télécharger tout le fichier. Bien sûr, il ne sera pas stocké à votre système de fichiers, mais la demande bloquera et décheter la bande passante pour aucune raison .


Non ce ne sera pas. Si vous lisez les documents, Urlopen renvoie un fichier comme objet. C'est pourquoi vous pouvez faire des choses comme la réponse.Lead (). C'est seulement lorsque vous lisez () alors "la bande passante est gaspillée"


Essaye le. Téléchargez quelque chose comme CharlesProxy.com et voir combien de fois les téléchargements de la demande dans une réplique active. URLOPEN Blocs jusqu'à ce qu'il obtienne les en-têtes et longueur de contenu de sorte qu'il peut semble instantané, mais il télécharge en réalité le contenu en arrière-plan. Lorsque vous lisez , des blocs Python pour le contenu. Donc Il utilise la bande passante lorsque vous appelez urlopen - juste à l'arrière-plan .


Ensuite, vous devriez avoir défini clairement "Télécharger le fichier entier" clairement. Avec un fichier AVI de 600 + MB, il ne faut que quelques secondes pour obtenir ces en-têtes.