QGET是用Python編寫的Apache2許可庫,用於盡可能快地以異步方式下載Web資源。
在引擎蓋下,它受益於asyncio和aiohttp ,可以創建多個同時連接以資源並使用緩衝零件文件下載。
目錄
wget vs qgettqdm )chunk_bytes和max_part_mb限制RAM使用情況qget_coro COROUTINE在asyncio中使用自己的事件循環wget vs qget考慮簡單的nginx配置片段:
http {
server {
...
limit_rate 5m ;
...
}
}現在,讓我們比較1000MB文件的wget和qget的下載統計信息以及上面提到的配置:
| 應用 | 總時間[S] | AVG速度[MB/S] | 細節 |
|---|---|---|---|
wget | 251.34 | 3.98 | |
qget | 16.00 | 95.97 | 連接限制測試:5.00 下載:10.42S 零件改寫:0.58 |
結論:
對於簡單的速率限制(每個連接), qget允許根據用戶Internet連接速度,同時請求的數量和資源服務器配置來更快地實現多次下載速度。在上面的示例中qget達到了24倍的wget速度。
對於更複雜的情況(例如連接限制),創建了自動連接限制測量測試,以計算在服務器拒絕下一個下一個之前可以同時獲得多少個同時請求。
您可以從發行版中下載選定的二進製文件。可用版本:
要安裝qget模塊,簡單:
$ pip install qget確保安裝了Anaconda。
在Windows上構建(在Anaconda提示中):
$ build.bat要建立在Posix上(需要libc-bin和binutils包):
$ build.sh函數參數:
URL(str):下載資源的URL。
FILEPATH(STR,可選):下載資源的輸出路徑。
如果未設置,則指向當前工作目錄和來自URL的文件名。默認為無。
覆蓋(bool,可選):標誌是否應覆蓋現有的輸出文件。默認為false。
auth(str,可選):用戶字符串:SSL連接的密碼對。默認為無。
verify_ssl(bool,可選):標誌如果應執行SSL證書驗證。默認為true。
mock_browser(bool,可選):標誌是否應添加用戶代理標頭來請求。默認為true。
默認用戶代理字符串:'Mozilla/5.0(Windows NT 10.0; Win64; x64)AppleWebkit/537.36
(Khtml,像壁虎一樣)Chrome/101.0.4951.67 Safari/537.36'
proxy_url(str,可選):格式的http/socks4/socks4/socks5代理URL'協議://用戶:passwere@ip:port'。
默認為無。
標題:( dict [str,str],可選):要發送的自定義標題。默認為無。
如果設置用戶可以指定自己的用戶代理並接受標頭,則將使用默認值。
progress_ref(progressstate,可選):參考進度狀態。
如果通過所有零件字節,並且重寫狀態將在其中進行更新。默認為無。
max_connections(INT,可選):異步HTTP連接的最大量。默認為50。
Connection_test_sec(INT,可選):分配給測試的最大時間
可以與URL實現多少異步連接。
如果設置為0測試將被省略。默認為5。
chunk_bytes(int,可選):從URL讀取的數據很多,並保存到字節中的部分文件。
將零件重寫以輸出文件時也將使用。如果提供限制,則可以覆蓋
流迭代。默認為2621440。
max_part_mb(float,可選):Megabytes中的最大零件大小。默認為5。
重試(INT,可選):零件下載的重試號碼。默認為10。
retry_sec(int,可選):在零件下載之間等待零件下載的時間。默認為1。
限制(STR,可選):Mbps中的下載速率限制。可以提供單位為“ Nunit”,例如。 “ 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 ()進度掛鉤的用法(默認情況下掛鉤用於顯示tqdm進度欄):
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]
[-proxy proxy_url] [-h標頭] [-c max_connections]
[ - 測試Connection_test_sec] [ - bytes chunk_bytes] [ - part max_part_mb]
[ - retries retryies] [ - retry_sec retry_sec] [ - 限制限制] [-tmp tmp_dir]
[-debug] [-v]
URL
使用異步HTTP連接從給定的URL下載給定URL的資源
與AIOHTTP會話。
位置論點:
資源的URL URL
選項:
-h, - 赫爾普顯示此幫助消息和退出
-o filepath, - 輸出filepath
下載資源的輸出路徑。
-f, - 強力文件覆蓋以進行輸出。
-a auth, - 用戶的auth auth字符串:SSL連接的密碼對。
- 不驗證禁用SSL證書驗證。
- 不摩克禁用默認用戶代理標頭。
-proxy proxy_url http/socks4/socks5代理URL格式
'協議://用戶:密碼@ip:port'。
-H頭, - 頭標題
格式的自定義標頭“名稱:value”。可以提供多個
時代。
-c max_connections,-connections max_connections
異步HTTP連接的最大量。
-Test Connection_test_sec
分配的最大時間以測試多少異步
可以與URL實現連接。使用0跳過。
- bytes chunk_bytes在URL中讀取的數據很多,然後保存到部分文件中
位元組.將零件重寫以輸出文件時也將使用。
- part max_part_mb希望(如果可能的話)megabytes中的最大零件大小。
- 取回零件下載的重試編號。
-retry_sec retry_sec的時間在零件下載之間等待幾秒鐘。
- 限制限制下載率限制Mbps。可以以“ nunit”為單位,
例如。 '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.binLimiter試圖通過在資源內容上添加迭代之間的停頓來降低下載字節的速率。如果請求非常低的下載率,請嘗試降低連接金額( max_connections或--connections MAX_CONNECTIONS ),以達到更高的限制精度。
零件大小是根據資源大小在字節中的資源大小和用戶設置的最大異步連接數量(或連接測試)計算的。用戶提供的最大零件大小param( max_part_mb或--part MAX_PART_MB )用作計算值的最高限制。
part_bytes = min(resource_bytes/connections,max_part_bytes)