ダウンロード可能なファイルである URL を起動する Python スクリプトがあります。ブラウザを起動するのではなく、Python にダウンロードの進行状況を表示させる方法はありますか?
11 に答える
特定のサイトからPDFをスクレイピングするための、これに対する非常に単純な(少しハックな)アプローチを作成しました。PowerShell は以下を処理しないため、Unix ベースのシステム (Linux、Mac OS) でのみ正しく動作することに注意してください"\r"
。
import sys
import requests
link = "http://indy/abcde1245"
file_name = "download.data"
with open(file_name, "wb") as f:
print("Downloading %s" % file_name)
response = requests.get(link, stream=True)
total_length = response.headers.get('content-length')
if total_length is None: # no content length header
f.write(response.content)
else:
dl = 0
total_length = int(total_length)
for data in response.iter_content(chunk_size=4096):
dl += len(data)
f.write(data)
done = int(50 * dl / total_length)
sys.stdout.write("\r[%s%s]" % ('=' * done, ' ' * (50-done)) )
sys.stdout.flush()
requests ライブラリを使用するため、それをインストールする必要があります。これにより、次のようなものがコンソールに出力されます。
>download.dataのダウンロード
>[============= ]
進行状況バーは、スクリプト内で 52 文字幅です (2 文字は単純に[]
50 文字の進行状況です)。それぞれ=
がダウンロードの 2% を表します。
「clint」パッケージ (「requests」と同じ作成者によって作成された) を使用して、次のようにダウンロードに簡単な進行状況バーを追加できます。
from clint.textui import progress
r = requests.get(url, stream=True)
path = '/some/path/for/file.txt'
with open(path, 'wb') as f:
total_length = int(r.headers.get('content-length'))
for chunk in progress.bar(r.iter_content(chunk_size=1024), expected_size=(total_length/1024) + 1):
if chunk:
f.write(chunk)
f.flush()
これにより、次のような動的出力が得られます。
[################################] 5210/5210 - 00:00:01
複数のプラットフォームでも動作するはずです! .bar の代わりに .dots と .mill を使用して、バーをドットまたはスピナーに変更することもできます。
楽しみ!
clickを使用することもできます。プログレスバー用の優れたライブラリがあります。
import click
with click.progressbar(length=total_size, label='Downloading files') as bar:
for file in files:
download(file)
bar.update(file.size)
別の良いオプションはwget
次のとおりです。
import wget
wget.download('http://download.geonames.org/export/zip/US.zip')
出力は次のようになります。
11% [........ ] 73728 / 633847
ソース: https://medium.com/@petehouston/download-files-with-progress-in-python-96f14f6417a2
ここにあるようにダウンロードをストリーミングできます-> Stream a Download。
また、アップロードをストリーミングすることもできます。
わずか 2 行で response.content にアクセスしようとしない限り、最も重要なリクエストのストリーミングが行われます。
for line in r.iter_lines():
if line:
print(line)