Python implémente l'exploration vidéo

little bottle
Libérer: 2019-04-10 09:56:30
avant
3506 Les gens l'ont consulté

À 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)
Copier après la connexion

J'ai rencontré un coup :


AttributeError: __exit__
Copier après la connexion

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)
Copier après la connexion

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())
Copier après la connexion

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
Copier après la connexion

Le. le résultat est très intuitif :


已下载2.579129%
已下载2.581255%
已下载2.583382%
已下载2.585508%
Copier après la connexion

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))
Copier après la connexion

Courir :


下载开始
下载进度10.24Kb/120174.05Kb 0.01% 下载速度4.75Kb/s 
///////////////////////////////////////////////// 
下载进度20.48Kb/120174.05Kb 0.02% 下载速度32.93Kb/s 
/////////////////////////////////////////////////
Copier après la connexion

Ç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[&#39;content-length&#39;])
        if os.path.exists(path) and os.path.getsize(path)>=content_size:
            print &#39;已下载&#39;
            return
        print &#39;下载开始&#39;
        with open(path, "wb") as f:
            p = ProgressData(size = content_size, unit=&#39;Kb&#39;, 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=&#39;&#39;, ):
        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&#39;%s下载完成\r\n&#39;%self.file_name
        else:
            print u&#39;{0}下载进度{1:.2f}{2}/{3:.2f}{4} {5:.2%} 下载速度{6:.2f}{7}/s&#39;.\
                  format(self.file_name, loaded, self.unit,\
                  self.size, self.unit, progress, speed, self.unit)
            print &#39;%50s&#39;%(&#39;/&#39;*int((1-progress)*50))

queue = Queue.Queue()
def run():
    while True:
        url = queue.get(timeout=100)
        if url is None:
            print u&#39;全下完啦&#39;
            break
        h = hashlib.md5()
        h.update(url)
        name = h.hexdigest()
        path = &#39;e:/download/&#39; + name + &#39;.mp4&#39;
        download_file(url, path)
def get_url():
    queue.put(None)

if __name__ == &#39;__main__&#39;:
    get_url()
    for i in xrange(4):
        t = threading.Thread(target=run)
        t.daemon = True
        t.start()
Copier après la connexion
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!

Étiquettes associées:
source:csdn.net
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal