Maison > Article > développement back-end > Python implémente l'exploration vidéo
À quoi peut servir Python ? L'entreprise explore principalement les données, les analyse et les exploite. Cependant, nous pouvons les utiliser pour explorer nous-mêmes certaines ressources, telles que les séries télévisées que nous souhaitons regarder. Dans cet article, l'éditeur partagera le code pour explorer les vidéos. Enregistrez-le et essayez-le !
Téléchargez le fichier de streaming. Définissez simplement le flux demandé dans la bibliothèque de requêtes sur True. Le document est ici.
Trouvez d'abord une adresse vidéo à essayer :
# -*- coding: utf-8 -*- import requests def download_file(url, path): with requests.get(url, stream=True) as r: chunk_size = 1024 content_size = int(r.headers['content-length']) print '下载开始' with open(path, "wb") as f: for chunk in r.iter_content(chunk_size=chunk_size): f.write(chunk) if __name__ == '__main__': url = '就在原帖...' path = '想存哪都行' download_file(url, path)
J'ai rencontré un coup :
AttributeError: __exit__
Ce document est-il aussi un mensonge ?
Il semble que la méthode __exit__ requise par le contexte ne soit pas implémentée. Puisqu'il s'agit simplement de s'assurer que r est finalement fermé pour libérer le pool de connexions, utilisez alors la fonctionnalité de fermeture de contextlib :
# -*- coding: utf-8 -*- import requests from contextlib import closing def download_file(url, path): with closing(requests.get(url, stream=True)) as r: chunk_size = 1024 content_size = int(r.headers['content-length']) print '下载开始' with open(path, "wb") as f: for chunk in r.iter_content(chunk_size=chunk_size): f.write(chunk)
Le programme fonctionne normalement, mais je stare Pourquoi la taille de ce fichier reste-t-elle inchangée ? Dans quelle mesure est-il complet ? Je souhaite toujours enregistrer le contenu téléchargé sur le disque dur à temps, et économiser de la mémoire, n'est-ce pas :
# -*- coding: utf-8 -*- import requests from contextlib import closing import os def download_file(url, path): with closing(requests.get(url, stream=True)) as r: chunk_size = 1024 content_size = int(r.headers['content-length']) print '下载开始' with open(path, "wb") as f: for chunk in r.iter_content(chunk_size=chunk_size): f.write(chunk) f.flush() os.fsync(f.fileno())
Le fichier grandit à une vitesse visible par le à l'œil nu, je me sens vraiment triste. Mon disque dur devrait être écrit sur le disque dur pour la dernière fois. Enregistrez simplement le numéro dans le programme :
def download_file(url, path): with closing(requests.get(url, stream=True)) as r: chunk_size = 1024 content_size = int(r.headers['content-length']) print '下载开始' with open(path, "wb") as f: n = 1 for chunk in r.iter_content(chunk_size=chunk_size): loaded = n*1024.0/content_size f.write(chunk) print '已下载{0:%}'.format(loaded) n += 1
Le. le résultat est très intuitif :
已下载2.579129% 已下载2.581255% 已下载2.583382% 已下载2.585508%
Comment pourrais-je, moi qui ai de nobles idéaux, me contenter de celui-ci ? Écrivons un cours à utiliser ensemble :
# -*- coding: utf-8 -*- import requests from contextlib import closing import time def download_file(url, path): with closing(requests.get(url, stream=True)) as r: chunk_size = 1024*10 content_size = int(r.headers['content-length']) print '下载开始' with open(path, "wb") as f: p = ProgressData(size = content_size, unit='Kb', block=chunk_size) for chunk in r.iter_content(chunk_size=chunk_size): f.write(chunk) p.output() class ProgressData(object): def __init__(self, block,size, unit, file_name='', ): self.file_name = file_name self.block = block/1000.0 self.size = size/1000.0 self.unit = unit self.count = 0 self.start = time.time() def output(self): self.end = time.time() self.count += 1 speed = self.block/(self.end-self.start) if (self.end-self.start)>0 else 0 self.start = time.time() loaded = self.count*self.block progress = round(loaded/self.size, 4) if loaded >= self.size: print u'%s下载完成\r\n'%self.file_name else: print u'{0}下载进度{1:.2f}{2}/{3:.2f}{4} 下载速度{5:.2%} {6:.2f}{7}/s'.\ format(self.file_name, loaded, self.unit,\ self.size, self.unit, progress, speed, self.unit) print '%50s'%('/'*int((1-progress)*50))
Courir :
下载开始 下载进度10.24Kb/120174.05Kb 0.01% 下载速度4.75Kb/s ///////////////////////////////////////////////// 下载进度20.48Kb/120174.05Kb 0.02% 下载速度32.93Kb/s /////////////////////////////////////////////////
Ça a l'air beaucoup plus confortable.
La prochaine chose à faire est de télécharger plusieurs fils de discussion en même temps. Le fil de discussion principal produit l'URL et la met dans la file d'attente, et le fil de téléchargement obtient l'URL :
# -*- coding: utf-8 -*- import requests from contextlib import closing import time import Queue import hashlib import threading import os def download_file(url, path): with closing(requests.get(url, stream=True)) as r: chunk_size = 1024*10 content_size = int(r.headers['content-length']) if os.path.exists(path) and os.path.getsize(path)>=content_size: print '已下载' return print '下载开始' with open(path, "wb") as f: p = ProgressData(size = content_size, unit='Kb', block=chunk_size, file_name=path) for chunk in r.iter_content(chunk_size=chunk_size): f.write(chunk) p.output() class ProgressData(object): def __init__(self, block,size, unit, file_name='', ): self.file_name = file_name self.block = block/1000.0 self.size = size/1000.0 self.unit = unit self.count = 0 self.start = time.time() def output(self): self.end = time.time() self.count += 1 speed = self.block/(self.end-self.start) if (self.end-self.start)>0 else 0 self.start = time.time() loaded = self.count*self.block progress = round(loaded/self.size, 4) if loaded >= self.size: print u'%s下载完成\r\n'%self.file_name else: print u'{0}下载进度{1:.2f}{2}/{3:.2f}{4} {5:.2%} 下载速度{6:.2f}{7}/s'.\ format(self.file_name, loaded, self.unit,\ self.size, self.unit, progress, speed, self.unit) print '%50s'%('/'*int((1-progress)*50)) queue = Queue.Queue() def run(): while True: url = queue.get(timeout=100) if url is None: print u'全下完啦' break h = hashlib.md5() h.update(url) name = h.hexdigest() path = 'e:/download/' + name + '.mp4' download_file(url, path) def get_url(): queue.put(None) if __name__ == '__main__': get_url() for i in xrange(4): t = threading.Thread(target=run) t.daemon = True t.start()ajouté Jugement des téléchargements répétés Quant à la façon de produire des URL en continu, vous pouvez explorer et prendre soin de vous ! [Cours recommandé :
Tutoriel vidéo Python]
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!