Python は何に使用できますか?同社は主にデータをクロールし、クロールされたデータを分析してマイニングしますが、見たいドラマなどの一部のリソースを自分でクロールするために使用することもできます。この記事では、編集者が動画をクロールするためのコードを共有します。保存して試してみてください。
ストリーミング ファイルをダウンロードするには、リクエスト ライブラリでリクエストされたストリームを True に設定するだけです。ドキュメントはここにあります。
まず試してみるビデオ アドレスを見つけてください:
# -*- 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)
打撃に遭遇しました:
AttributeError: __exit__
この文書も嘘をつくことができるのでしょうか?
コンテキストに必要な __exit__ メソッドが実装されていないようです。これは、r が最終的に閉じられて接続プールが解放されることを確認するためなので、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)
プログラムは正常に実行されますが、私はじっと見つめています。ファイルのサイズが変わらないのはなぜですか? ファイルの完成度はどの程度ですか?ダウンロードしたコンテンツを時間内にハードディスクに保存してメモリを節約したいと考えていますよね?
# -*- 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())
ファイルは目に見える速度で増大しています, 本当に申し訳ありません ハードディスクは最後にハードディスクに書き込む必要があります。プログラムに番号を記録するだけです:
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
結果は非常に優れています直感的:
已下载2.579129% 已下载2.581255% 已下载2.583382% 已下载2.585508%
高い理想を持っている私が、これだけで満足できるなんて? クラスを書いて一緒に使ってみましょう:
# -*- 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))
実行:
下载开始 下载进度10.24Kb/120174.05Kb 0.01% 下载速度4.75Kb/s ///////////////////////////////////////////////// 下载进度20.48Kb/120174.05Kb 0.02% 下载速度32.93Kb/s /////////////////////////////////////////////////
より快適に見えます。
次に行うことは、複数のスレッドを同時にダウンロードすることです。メイン スレッドは URL を生成してキューに入れ、ダウンロード スレッドは 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()
繰り返しダウンロードを追加しました。URL を継続的に生成する方法については、自分で調べて対処できます。
[おすすめコース: Python ビデオ チュートリアル ]
以上がPythonはビデオクローリングを実装しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。