Heim > Artikel > Backend-Entwicklung > Python implementiert das Video-Crawling
Wofür kann Python verwendet werden? Das Unternehmen crawlt hauptsächlich Daten und analysiert und durchsucht die gecrawlten Daten. Wir können es jedoch verwenden, um einige Ressourcen selbst zu crawlen, beispielsweise die Dramen, die wir sehen möchten. In diesem Artikel teilt der Herausgeber den Code zum Crawlen von Videos. Speichern Sie ihn und probieren Sie ihn aus!
Laden Sie die Streaming-Datei herunter. Setzen Sie einfach den angeforderten Stream in der Anforderungsbibliothek auf „True“. Das Dokument ist hier.
Suchen Sie zunächst eine Videoadresse zum Ausprobieren:
# -*- 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)
Einen Schlag erlitten:
AttributeError: __exit__
Können Dokumente auch lügen?
Es scheint, dass die vom Kontext geforderte __exit__-Methode nicht implementiert ist. Da es nur darum geht, sicherzustellen, dass r endgültig geschlossen wird, um den Verbindungspool freizugeben, verwenden Sie die Schließfunktion von 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)
Das Programm läuft normal, aber ich starre darauf Warum ändert sich die Größe der Datei nicht? Wie vollständig ist sie? Ich möchte den heruntergeladenen Inhalt trotzdem rechtzeitig auf der Festplatte speichern und etwas Speicherplatz sparen, richtig:
# -*- 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())
Die Datei wächst mit einer Geschwindigkeit, die mit bloßem Auge sichtbar ist , es tut mir wirklich leid. Die Festplatte sollte zum letzten Mal auf die Festplatte geschrieben werden. Notieren Sie einfach die Nummer im Programm:
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
Das Ergebnis ist sehr intuitiv:
已下载2.579129% 已下载2.581255% 已下载2.583382% 已下载2.585508%
Wie könnte ich, der ich hohe Ideale habe, nur mit dieser zufrieden sein? Lasst uns eine Klasse schreiben und sie gemeinsam nutzen:
# -*- 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))
Lauf:
下载开始 下载进度10.24Kb/120174.05Kb 0.01% 下载速度4.75Kb/s ///////////////////////////////////////////////// 下载进度20.48Kb/120174.05Kb 0.02% 下载速度32.93Kb/s /////////////////////////////////////////////////
Sieht viel bequemer aus.
Als nächstes müssen Sie mehrere Threads gleichzeitig herunterladen. Der Hauptthread erzeugt die URL und stellt sie in die Warteschlange, und der Download-Thread erhält die 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()
Wiederholte Downloads hinzugefügt. Urteilen Sie, wie Sie kontinuierlich URLs erstellen, können Sie selbst erkunden und für sich selbst sorgen!
[Empfohlener Kurs: Python-Video-Tutorial]
Das obige ist der detaillierte Inhalt vonPython implementiert das Video-Crawling. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!