چطور با پایتون حجم یه فایل اینترنتی رو تشخیص بدیم؟
دیروز بود که به طور کاملا اتفاقی به یه مقاله مفید در انجمن فارسی اوبونتو راجع به دانلود منیجر aria2c برخوردم که طرز استفاده بهینه ش رو آموزش میداد.
من از همون ماه های اول ورودم به دنیای گنولینوکس با aria2c آشنا بودم اما هیچ وقت کار باهاش رو یاد نگرفتم(البته بالاخره دیروز یاد گرفتم ) و دیشب وقتی که یه فایل نهصد مگی رو زود تر از انتظار برام دانلود کردم به قدرتش پی بردم و راستشو بخواین الآن خیلی خوشحالم. چون یکی دیگه از معدود وابستگیای من به ویندوز کم شد.
اگر به لینک بالا مراجعه کرده باشین و آموزش رو خونده باشین و اگر مثل من به تنبلی مفرط دچار باشین حتما درک کردید که تنظیمش یه کوچولو زمانبره. برای همین باید اسکریپتی بنویسیم که کار رو واسمون آسون کنه. اسکریپتی که فقط url بهش بدیم و فایل تحویل بگیریم.
مشکلترین قسمت ماجرا اونجایی که ما باید حجم فایلی رو که می خوایم دانلود کنیم بدست بیاریم و باور کنید اون لحظه کوچکترین ایده برای حلش نداشتم. اما میدونستم که کتابخونه پایتون ماژولی داره به اسم urllib.request که یه ربطی به مسئله ما داره. با رفتن به کانال آی آر سی python# و چند بار پرسش و پاسخ متوجه شدم که هر فایل موجود در اینترنت خاصیتی به نام header داره که خصوصیات فایل رو که شامل سایز فایل هم میشه اونجا دخیره می کنن و با یه متد ساده از کلاس urllib.request میشه بهش دسترسی پیدا کرد.
با این اطلاعات اسکریپت زیر رو نوشتم:
#!/usr/bin/python3 import urllib.request import os import sys def get(url): file_url = urllib.request.urlopen(url) size = int(file_url.getheader("Content-Length")) conn = (size / 1000000) / 16 if conn < 1: conn = 1 os.system('aria2c -s16 -x16 -k' + str(round(conn)) + 'M \"' + url + '\"') if len(sys.argv) > 1: get(url=sys.argv[1]) else: print('Usage: download FileUrl')
اگر فکر میکنید این اسکریپت به دردتون میخوره، اونو تو یه فایل متنی ذخیره کنید و به یکی از دایرکتوری هایی که خروجی زیر تولید میکنه منتقل کنید:
echo $PATH
توصیه میشه اسکریپت هایی که خودتون مینویسید رو به local/bin./~ منتقل کنید.
پ.ن: میدونید که؛ ~ یا همون تیلدا به معنی home/
من در PersianDM از برنامه های دانلود منجر دیگه استفاده کردم که راحت این کار رو انجام بده و حجم رو به دست بیاره،البته در تنظیم aria2 حساسیت های دیگه رو هم مورد توجه قرار دادم
یه نگاهی به کدهای من بنداز احتمالا بتونه بهت کمک کنه