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)