QGET هي مكتبة مرخصة APACH2 ، مكتوبة في Python ، لتنزيل موارد الويب بطريقة غير متزامنة بأسرع وقت ممكن.
تحت الغطاء يستفيد من asyncio و aiohttp لإنشاء اتصالات متعددة متزامنة للموارد وتنزيلها باستخدام ملفات الأجزاء المخزنة.
جدول المحتويات
wget vs qgettqdm )chunk_bytes و max_part_mbasyncio بواسطة qget_coro coroutinewget vs qget النظر في جزء تكوين nginx البسيط مثل هذا:
http {
server {
...
limit_rate 5m ;
...
}
} الآن دعنا نقارن إحصائيات التنزيل لـ wget و qget لملف وتكوين 1000 ميغابايت المذكورة أعلاه:
| طلب | إجمالي الوقت [S] | سرعة AVG [MB/S] | تفاصيل |
|---|---|---|---|
wget | 251.34 | 3.98 | |
qget | 16.00 | 95.97 | اختبار حد الاتصال: 5.00s تنزيل: 10.42s أجزاء إعادة كتابة: 0.58s |
خاتمة :
للحصول على الحد الأقصى للمعدل البسيط ( لكل اتصال ) ، يسمح qget بتحقيق سرعة تنزيل أسرع عدة مرات استنادًا إلى سرعة اتصال الإنترنت ، وعدد الطلبات المتزامنة وتكوين خادم الموارد. في المثال أعلاه ، حقق qget أكثر من 24x تنزيل سرعة wget .
بالنسبة للحالات الأكثر تعقيدًا ( حد اتصالات مثل IP ) ، تم إنشاء اختبار قياس اتصال الاتصال التلقائي لحساب عدد الطلبات المتزامنة التي يمكن تحقيقها قبل رفض الخادم التالي.
يمكنك تنزيل الملفات الثنائية المحددة من الإصدارات. الإصدارات المتاحة:
لتثبيت وحدة qget ، ببساطة:
$ pip install qgetتأكد من تثبيت Anaconda.
للبناء على Windows (في مطالبة Anaconda):
$ build.bat للبناء على POSIX (حزم libc-bin و binutils مطلوبة):
$ build.shحجج الوظيفة:
عنوان URL (STR): عنوان URL لتنزيل المورد.
FilePath (Str ، اختياري): مسار الإخراج للموارد التي تم تنزيلها.
إذا لم يتم تعيينه ، فإنه يشير إلى دليل العمل الحالي واسم الملف من عنوان URL. الافتراضات إلى لا شيء.
تجاوز (منطقي ، اختياري): العلم إذا كان يجب تجاوز ملف الإخراج الموجود. الإعدادات الافتراضية إلى خطأ.
Auth (Str ، اختياري): سلسلة من المستخدم: زوج كلمة المرور لاتصال SSL. الافتراضات إلى لا شيء.
Verify_SSL (Bool ، اختياري): يجب إجراء التحقق من صحة شهادة SSL. الافتراضات إلى صواب.
mock_browser (منطقي ، اختياري): يجب إضافة رأس إذا كان يجب إضافة رأس وكيل المستخدم إلى الطلب. الافتراضات إلى صواب.
سلسلة وكيل المستخدم الافتراضية: '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 ، اختياري): عنوان URL للوكالة http/socks4/socks5 بالتنسيق 'بروتوكول: // المستخدم: password@ip: port'.
الافتراضات إلى لا شيء.
الرؤوس: (dict [str ، str] ، اختياري): يتم إرسال رؤوس مخصصة. الافتراضي إلى لا شيء.
إذا تمكن المستخدم من تحديد وكيل المستخدم الخاص وقبول الرؤوس ، فسيتم استخدام الإعدادات الافتراضية.
Progress_ref (ProgressState ، اختياري): الإشارة إلى حالة التقدم.
إذا تم تمرير جميع الأجزاء بايت وحالة إعادة كتابة سيتم تحديثها. الافتراضات إلى لا شيء.
Max_Connections (int ، اختياري): أقصى قدر من اتصالات HTTP غير المتزامنة. الافتراضات إلى 50.
connection_test_sec (int ، اختياري): الحد الأقصى للوقت في الثواني المخصصة للاختبار
كم يمكن تحقيق اتصالات غير متزامنة في عنوان URL.
إذا تم تعيين اختبار 0 سيتم حذفه. الافتراضات إلى 5.
chunk_bytes (int ، اختياري): قراءة جزء من البيانات بالتكرار من عنوان URL وحفظه إلى ملف part في بايت.
سيتم استخدامها أيضًا عند إعادة كتابة أجزاء إلى ملف الإخراج. إذا تم توفير الحد الأقصى ، فيمكن تجاوز ذلك
تكرار الدفق. الإعدادات الافتراضية إلى 2621440.
max_part_mb (تعويم ، اختياري): مرغوب فيه (إن أمكن) حجم الجزء الأقصى في ميغابايت. الافتراضات إلى 5.
Retries (int ، اختياري): العدد المحدد لتنزيل جزء. الافتراضات إلى 10.
RETRY_SEC (int ، اختياري): حان الوقت للانتظار بين إعادة تنزيل جزء في ثوان. الإعدادات الافتراضية إلى 1.
الحد (STR ، اختياري): حد التنزيل في MBPs. يمكن تزويدها بوحدة باسم "nunit" ، على سبيل المثال. "5M".
وحدات صالحة (حالة غير حساسة): B ، K ، M ، G ، KB ، MB ، GB. سيتم التعامل مع 0 بايت على أنه لا يوجد حد.
الافتراضات إلى لا شيء.
TMP_DIR (STR ، اختياري): مسار الدليل المؤقت. إذا لم يتم تعيينه ، فإنه يشير إلى دليل OS TMP.
الافتراضات إلى لا شيء.
Debug (Bool ، اختياري): علم التصحيح. الإعدادات الافتراضية إلى خطأ.
للاستخدام في التعليمات البرمجية ، ما عليك سوى استيراد وظيفة الوحدة النمطية:
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 uple] [-لا verify] [--no mock]
[-proxy_url] [-H header] [-c max_connections]
[-Test Connection_test_sec] [-bytes chunk_bytes] [-جزء max_part_mb]
[-Retries Retries] [-retry_sec recepy_sec] [-حد محدد] [-TMP TMP_DIR]
[-ديبوج] [-V]
عنوان URL
تنزيل مورد من عنوان URL المعطى في الأجزاء المخزنة باستخدام اتصالات HTTP غير متزامن
مع جلسة AIOHTTP.
الحجج الموضعية:
عنوان URL عنوان URL للموارد
خيارات:
-H ، -عرض رسالة المساعدة هذه والخروج
-o filepath ، -output filepath
مسار الإخراج للموارد التي تم تنزيلها.
-f ، -قوى القوة تجاوز ملف الإخراج.
-Auth ، -سلسلة مصادقة للمستخدم: زوج كلمة المرور لاتصال SSL.
-لا تُعطل التحقق من صحة شهادة SSL.
-لا تُعطف رأس المستخدم الافتراضي.
-Proxy proxy_url http/socks4/socks5 بروكسي عنوان URL
"بروتوكول: // المستخدم: كلمة المرور@IP: منفذ".
-H HEADER ، -رأس الرئيس
رأس مخصص في التنسيق "اسم: القيمة". يمكن تزويد متعددة
مرات.
-c max_connections ، -connections max_connections
أقصى قدر من اتصالات HTTP غير المتزامنة.
-Test Connection_test_sec
الحد الأقصى للوقت في الثواني المخصصة لاختبار مدى عدم التزامن
يمكن تحقيق اتصالات إلى عنوان URL. استخدم 0 لتخطي.
-bytes chunk_bytes جزء من البيانات قراءة بالتكرار من عنوان URL وحفظها
بايت. سيتم استخدامها أيضًا عند إعادة كتابة أجزاء إلى ملف الإخراج.
-جزء MAX_PART_MB مرغوب فيه (إن أمكن) حجم الجزء الأقصى في ميغابايت.
-Retries Retrime Retred Number for Part Download.
-retry_sec retry_sec حان الوقت للانتظار بين إعادة تنزيل جزء في ثوان.
-الحد الأقصى للحد من معدل التنزيل في MBPs. يمكن تزويدها بوحدة "nunit" ،
على سبيل المثال. '5m'. وحدات صالحة (حالة غير حساسة): B ، K ، M ، G ، KB ، MB ، GB.
سيتم التعامل مع 0 بايت على أنه لا يوجد حد.
-TMP TMP_DIR مسار الدليل المؤقت. إذا لم يتم تعيينها إلى OS TMP
دليل.
-علم تصحيح الأخطاء.
-v ، -يعرض الاستفادة الإصدار الفعلي من 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 يحاول Limiter تقليل معدل تنزيل البايتات عن طريق إضافة توقف مؤقت بين التكرار على محتوى الموارد. إذا تم طلب معدل التنزيل المنخفض للغاية ، فحاول تخفيض مبلغ الاتصالات ( max_connections أو --connections MAX_CONNECTIONS ) لتحقيق دقة أفضل للحد.
يتم حساب حجم الجزء في وقت التشغيل استنادًا إلى حجم الموارد بالبايت وأقصى قدر من الاتصالات غير المتزامنة التي يضبطها المستخدم (أو اختبار الاتصال). أقصى حجم الجزء param ( max_part_mb أو --part MAX_PART_MB ) يتم توفيره بواسطة المستخدم كحدود أعلى للقيمة المحسوبة.
part_bytes = min (resource_bytes/connections ، max_part_bytes)