Qgetは、Pythonで書かれたApache2ライセンスライブラリで、可能な限り速くWebリソースをダウンロードするためです。
フードの下では、 asyncioとaiohttpの恩恵を受けて、リソースへの複数の同時接続を作成し、バッファーパーツファイルを使用してダウンロードします。
目次
wget対qgettqdmを使用して)chunk_bytesおよびmax_part_mbqget_coro Coroutineによるasyncioで独自のイベントループを使用するためのサポートwget対qgetこのような単純なnginx構成フラグメントを検討してください:
http {
server {
...
limit_rate 5m ;
...
}
}次に、 1000MBのファイルと上記の構成のwgetとqgetの統計をダウンロードしてみましょう。
| 応用 | 合計時間 | AVG Speed [MB/s] | 詳細 |
|---|---|---|---|
wget | 251.34 | 3.98 | |
qget | 16.00 | 95.97 | 接続制限テスト:5.00秒 ダウンロード:10.42s パーツの書き換え:0.58秒 |
結論:
単純なレートの制限(接続ごと) qget使用すると、ユーザーインターネット接続速度、同時リクエストの数、リソースサーバーの構成に基づいて、数倍高速なダウンロード速度を達成できます。上記の例では、 qget 24倍以上のwget速度を達成しました。
より複雑なケースの場合(例:IPごとに接続制限)、自動接続制限測定テストが作成され、サーバーが次のものを拒否する前に同時リクエストを達成できる数を計算しました。
選択したバイナリファイルをリリースからダウンロードできます。利用可能なバージョン:
qgetモジュールをインストールするには、単純に:
$ pip install qgetアナコンダがインストールされていることを確認してください。
Windowsの上に構築するには(アナコンダプロンプト):
$ build.bat POSIXに基づいて構築するには( libc-binおよびbinutilsパッケージが必要です):
$ build.sh関数引数:
URL(STR):リソースをダウンロードするURL。
FilePath(STR、オプション):ダウンロードされたリソースの出力パス。
設定していない場合は、URLの現在の作業ディレクトリとファイル名を指します。デフォルトはありません。
オーバーライド(Bool、オプション):既存の出力ファイルがオーバーライドする場合はフラグ。デフォルトはfalseになります。
auth(str、optional):ユーザーの文字列:SSL接続用のパスワードペア。デフォルトはありません。
verify_ssl(bool、optional):SSL証明書の検証を実行する必要がある場合はフラグ。デフォルトはtrueです。
mock_browser(bool、optional):フラグユーザーエージェントヘッダーをリクエストに追加する必要がある場合。デフォルトはtrueです。
デフォルトのユーザーエージェント文字列: 'Mozilla/5.0(Windows NT 10.0; Win64; X64)AppleWebkit/537.36
(KHTML、Geckoのような)Chrome/101.0.4951.67 Safari/537.36 '
proxy_url(str、optional):http/socks4/socks5 proxy url 'protocol:// user:password@ip:port'。
デフォルトはありません。
ヘッダー:( dict [str、str]、オプション):送信されるカスタムヘッダー。デフォルトはありません。
SETユーザーが独自のユーザーエージェントを指定してヘッダーを受け入れることができる場合、それ以外の場合はデフォルトが使用されます。
Progress_Ref(ProgressState、オプション):Progress Stateへの参照。
すべての部品バイトを渡すと、ステータスが更新されます。デフォルトはありません。
max_connections(int、optional):非同期HTTP接続の最大量。デフォルトは50です。
connection_test_sec(int、optional):テストに割り当てられた秒単位の最大時間
URLに対してどれだけの非同期接続を達成できるか。
0に設定されている場合、テストは省略されます。デフォルトは5です。
chunk_bytes(int、optional):URLから反復的に読み取られ、バイトのパーツファイルに保存します。
部品を書き換えてファイルを出力するときにも使用されます。制限が提供されている場合、これはオーバーライドできます
ストリーム反復。デフォルトは2621440です。
max_part_mb(float、optional):Megabytesの最大パーツサイズが望ましい(可能であれば)。デフォルトは5です。
再試行(int、オプション):パーツダウンロードの番号を取得します。デフォルトは10です。
retry_sec(int、optional):パーツダウンロードの再試行の間に数秒で待つ時間。デフォルトは1です。
制限(STR、オプション):MBPSでレート制限をダウンロードします。 「ヌニット」としてユニットを提供できます。 「5m」。
有効な単位(ケース非感受性):B、K、M、G、Kb、MB、GB。 0バイトは制限なしに扱われます。
デフォルトはありません。
TMP_DIR(STR、オプション):一時ディレクトリパス。設定していない場合は、OS TMPディレクトリにポイントを指します。
デフォルトはありません。
デバッグ(ブール、オプション):デバッグフラグ。デフォルトはfalseになります。
コードで使用するには、モジュール関数をインポートするだけです。
from qget import qget
url = "https://speed.hetzner.de/100MB.bin"
qget ( url )独自のループとasyncio備えたコードで使用するには:
import asyncio
from qget import qget_coro
async def main ( loop ):
url = "https://speed.hetzner.de/100MB.bin"
download_task = loop . create_task ( qget_coro ( url ))
await download_task
# Or just
# await qget_coro(url)
loop = asyncio . get_event_loop ()
loop . run_until_complete ( main ( loop ))
loop . close ()Progressフックの使用(デフォルトでは、 tqdm Progress Barを表示するためにフックが使用されます):
from qget import ProgressState , qget
def print_download_progress ( progress : ProgressState ) -> None :
print ( f"Download: { progress . get_download_progress ():.2f } %" , end = " r " )
if progress . get_download_bytes () == progress . total_bytes :
print ()
def print_rewrite_progress ( progress : ProgressState ) -> None :
print ( f"Rewrite: { progress . get_rewrite_progress ():.2f } %" , end = " r " )
if progress . rewrite_bytes == progress . total_bytes :
print ()
url = "https://speed.hetzner.de/100MB.bin"
progress = ProgressState (
on_download_progress = print_download_progress ,
on_rewrite_progress = print_rewrite_progress
)
qget ( url , progress_ref = progress )使用法:qget [-h] [-o filepath] [-f] [-a auth] [ - no-verify] [ - -no-mock]
[--ProxyProxy_url] [-hヘッダー] [-c max_connections]
[--test connection_test_sec] [--bytes chunk_bytes] [ - パートmax_part_mb]
[-retries retiries] [-retry_sec retry_sec] [ - limit lime] [-tmp tmp_dir]
[ - debug] [-v]
URL
非同期HTTP接続を使用して、バッファーパーツの与えられたURLからリソースをダウンロードします
AIOHTTPセッション付き。
位置的議論:
リソースのURL URL
オプション:
-H、 - ヘルプこのヘルプメッセージと出口を表示します
-o filepath、 - output filepath
ダウンロードされたリソースの出力パス。
-f、 - フォースフォースファイルが出力のためにオーバーライドします。
-auth、-auth auth sring of user:SSL接続用のパスワードペア。
-No-VerifyはSSL証明書の検証を無効にします。
-No-Mockはデフォルトのユーザーエージェントヘッダーを無効にします。
-Proxy Proxy_url http/socks4/socks5 proxy url形式
'Protocol:// user:password@ip:port'。
-hヘッダー、 - ヘッダーヘッダー
形式のカスタムヘッダー 'name:value'。複数供給できます
時代。
-c max_connections、-connections max_connections
非同期HTTP接続の最大量。
--test connection_test_sec
非同期のテストに割り当てられた秒単位の最大時間
接続はURLに達成できます。 0を使用してスキップします。
-BYTES CHUNK_BYTESデータのチャンクはURLから反復的に読み、パーツファイルに保存します
バイト。部品を書き換えてファイルを出力するときにも使用されます。
--PART MAX_PART_MB MEGABYTESの最大パーツサイズが望ましい(可能であれば)。
-retriesパーツダウンロードの再試行番号。
-retry_sec retry_sec部品ダウンロードの再試行の間に数秒で待つ時間。
-limit制限MBPSのダウンロードレート制限。 「ヌニット」としてユニットを供給することができます。
例えば。 「5m」。有効な単位(ケース非感受性):B、K、M、G、Kb、MB、GB。
0バイトは制限なしに扱われます。
-TMP TMP_DIR一時ディレクトリパス。設定していない場合は、OS TMPにポイントを指します
ディレクトリ。
- デバッグフラグ。
-v、-versionはqgetの実際のバージョンを表示します。
バイナリと同じ引数を持つPythonモジュールからも使用できます。
python -m qget https://speed.hetzner.de/100MB.bin次のように、複数のヘッダーを提供できます。
python -m qget -H ' name1:value1 ' -H ' name2:value2 ' https://speed.hetzner.de/100MB.binリミッターは、リソースコンテンツを介した反復間に一時停止を追加することにより、ダウンロードされたバイトの速度を下げようとします。非常に低いダウンロードレートが要求されている場合は、制限の正確性を向上させるために、接続の量( max_connectionsまたは--connections MAX_CONNECTIONS )を下げるようにしてください。
パートサイズは、リソースサイズのリソースサイズと、ユーザー(または接続テスト)によって設定された非同期接続の最大量に基づいて、ランタイムで計算されます。 MAXパートサイズPARAM( max_part_mbまたは--part MAX_PART_MB )は、ユーザーが提供することは、計算値の最上位として使用されます。
part_bytes = min(resource_bytes/connections、max_part_bytes)