Telecharger fichier a partir d'url [Résolu]

sheorogath 2465 Messages postés samedi 21 février 2004Date d'inscription 29 janvier 2010 Dernière intervention - 12 mai 2007 à 11:22 - Dernière réponse : sheorogath 2465 Messages postés samedi 21 février 2004Date d'inscription 29 janvier 2010 Dernière intervention
- 13 mai 2007 à 13:09
bonjour a tous ,
je voudrais avoir une piste de recherche quant a telecharger un fichier a partir d'une url connu :
peut recuperer comme en java le flux d'entre d'un objet urllib2 (genre un getInputStream)
 ou alors une urllib2.openurl(monurl).read() ou alors derniere solution :
j'ouvre une socket et je fais une requete get sur l'url donnant le fichier ? et je lis le fichier en lisant dans la socket

selon vous qu'elle est la meilleur maniere ?

merci
bonne journee
 "n'est pas mort ce qui semble a jamais dormir et en d'etrange temps meme la mort peut mourrir"
Afficher la suite 

11 réponses

Répondre au sujet
cs_DoudouBidou 102 Messages postés jeudi 29 mai 2003Date d'inscription 23 juin 2008 Dernière intervention - 12 mai 2007 à 23:26
+3
Utile
ben tu peux le faire aussi avec urllib2
exemple : je veux récupérer la d'accueil de google

import urllib2
url = "http://www.google.fr"
fp = urllib2.urlopen(url)

#longueur du fichier
lg = fp.headers.get('content-length')

data = ''
for i in range(lg):
    data += fp.read(1) # <= ici je lis le fichier bit par bit

fp.close()
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_DoudouBidou
cs_DoudouBidou 102 Messages postés jeudi 29 mai 2003Date d'inscription 23 juin 2008 Dernière intervention - 13 mai 2007 à 09:20
+3
Utile
fp.headers.get('content-length') #<= ne pas oublier de le convertir en int car c'est du texte

je ne dis pas que c'est la meilleur solution, j'ignore ce que ça vaut niveau rapidité de téléchargement, je pense qu'il vaut mieux lire les bits 16 par 16 ou 32 par 32 plutot que 1 par 1
cette méthode ne te permet pas de télécharger un morceau du fichier situé n'importe où dans le fichier, tu commences obligatoirement par le début, mais je pense qu'on doit pouvoir le faire n'utilisant pas directement urlopen mais en créant un opener "spécial"
comme je le disais c'est la méthode la plus simple pour suivre un téléchargement
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_DoudouBidou
sheorogath 2465 Messages postés samedi 21 février 2004Date d'inscription 29 janvier 2010 Dernière intervention - 13 mai 2007 à 13:09
+3
Utile
resolu : changer le mode d'ecriture :

file = open(titre +

".flv" ,
"a+b")

au lieu de "w"

"n'est pas mort ce qui semble a jamais dormir et en d'etrange temps meme la mort peut mourrir"
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de sheorogath
cs_DoudouBidou 102 Messages postés jeudi 29 mai 2003Date d'inscription 23 juin 2008 Dernière intervention - 12 mai 2007 à 22:53
0
Utile
Tout dépends ce que tu veux faire et la taille de ton fichier mais perso je pense que le simple et rapide est de faire urllib2.openurl(monurl).read()
au moins tu ne t'occupe de rien pour ce qui est du socket et du protocol
Commenter la réponse de cs_DoudouBidou
sheorogath 2465 Messages postés samedi 21 février 2004Date d'inscription 29 janvier 2010 Dernière intervention - 12 mai 2007 à 22:54
0
Utile
ben en fait je voulais pouvoir gerer l'avancement du telechargment ...
c'etait pour faire un prog qui telecharge les video sur youtube (je l'ai fais en java) et je voulais pour mon second prog python faire cela ...
je vais m'oriente cote socket je pense ...
merci bien
++

"n'est pas mort ce qui semble a jamais dormir et en d'etrange temps meme la mort peut mourrir"
Commenter la réponse de sheorogath
sheorogath 2465 Messages postés samedi 21 février 2004Date d'inscription 29 janvier 2010 Dernière intervention - 12 mai 2007 à 23:28
0
Utile
ouais je vois mais si je fais openurl il charge le fichier donc apres ca ne sert a rien de le lire bit par bit ... ce que je veux c'est la progression au cours du temps et mise a part les socket je vois pas d'autre moyen de le faire ...

en tout cas merci poru tes reponses

"n'est pas mort ce qui semble a jamais dormir et en d'etrange temps meme la mort peut mourrir"
Commenter la réponse de sheorogath
cs_DoudouBidou 102 Messages postés jeudi 29 mai 2003Date d'inscription 23 juin 2008 Dernière intervention - 12 mai 2007 à 23:36
0
Utile
il charge le fichier? c'est nouveau ça
non ! urlopen ne charge pas le fichier il ouvre simplement la connexion
les données ne sont télécharger qu'au moment du read
Commenter la réponse de cs_DoudouBidou
sheorogath 2465 Messages postés samedi 21 février 2004Date d'inscription 29 janvier 2010 Dernière intervention - 13 mai 2007 à 01:27
0
Utile
excuse pardon j'ai supperpose mon code au tien en fait je crois que tu viens de resoudre mon pb

je croyais avoir lu un fp = urllib2.urlopen(url).read() ...
je met resolu car je pense que c ca que je cherchais
merci bien
bonen soiree

"n'est pas mort ce qui semble a jamais dormir et en d'etrange temps meme la mort peut mourrir"
Commenter la réponse de sheorogath
sheorogath 2465 Messages postés samedi 21 février 2004Date d'inscription 29 janvier 2010 Dernière intervention - 13 mai 2007 à 10:45
0
Utile
oui en tout cas ca me conviens parfaitement ... ce que je voulais c'etait pouvoir suivre l'avancement et ta methode semble repondre a ce probleme je vais d'ailleurs l'essayer de suite ^^
pour la conversion ok merci de me le dire car comme le type n'est pas explicite jeme serais fait avoir je pense

"n'est pas mort ce qui semble a jamais dormir et en d'etrange temps meme la mort peut mourrir"
Commenter la réponse de sheorogath
cs_DoudouBidou 102 Messages postés jeudi 29 mai 2003Date d'inscription 23 juin 2008 Dernière intervention - 13 mai 2007 à 12:04
0
Utile
pour récupérer la taille on peut faire comme ça aussi, ça revient au même
int(fp.info()['content-length'])

pour faire un calcul sur la vitesse de téléchargement c'est plus simple de récupérer 1024 bits à chaque fois, tu pourras faire un calcul en ko directement
Commenter la réponse de cs_DoudouBidou
sheorogath 2465 Messages postés samedi 21 février 2004Date d'inscription 29 janvier 2010 Dernière intervention - 13 mai 2007 à 12:27
0
Utile
perso j'ai fait ceci :

lg = vid.headers.get( 'content-length'
)

print
"lg en string = %s"
% lg
lg = int(lg)
print "lg int = %i"
% lg
data =
''

for i in range(lg):
   data = vid.read(4096)
   ifnot data:
break
   file.write(data)
   data = None 
file.flush()

par contre la video ne se lit pas il semblerais que j'ajoute des bit qui ne devraient pas y etre lors de l'ecriture

"n'est pas mort ce qui semble a jamais dormir et en d'etrange temps meme la mort peut mourrir"
Commenter la réponse de sheorogath

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.