آموزش دانلود فایل با کد پایتون

در این آموزش کار با ۲ ماژول قدرتمند برای دانلود هر فایلی با پایتون را یاد می‌گیریم. با این روش‌ها می‌توانید فایل‌ها را از url موردنظر در اینترنت دانلود کرده و آن را با نام دلخواهتان در مسیر دلخواه ذخیره کنید.

ماژول‌ها و روش‌های مختلفی برای دانلود فایل از اینترنت در پایتون وجود دارد. همانطور که می‌دانید، هر فایلی از یکسری کد تشکیل شده که محتوای فایل را مشخص می‌کند. در یک نگاه ساده، دانلود فایل یعنی انتقال این محتوا از روی اینترنت به کامپیوتر خودمان!

روش اول یک تابع ساده اما کاربردی است که فایل مورد نظرمان را دانلود و ذخیره می‌کند. در روش دوم، عملیات دانلود و ایجاد فایل جدید را خودمان انجام می‌دهیم؛ بنابراین احتمالاً دستمان بیشتر باز خواهد بود.

دانلود با urllib در پایتون

کتابخانه urllib در پایتون توابع مختلفی برای کار با URLهای وب ارائه می‌کند. از تجزیه و تحلیل و ارسال درخواست به یک صفحه وب گرفته تا دانلود یک فایل از اینترنت!

در این آموزش فقط با یکی از این توابع کار می‌کنیم. در آموزشی جداگانه در مورد چند تا از امکانات کاربردی این ماژول صحبت خواهم کرد.

اگر نصب پایتون را به‌طور عادی انجام داده باشید، این کتابخانه روی سیستم شما نصب شده است؛ بنابراین فقط کافی است آن را در ابتدای کدمان وارد کنیم. ما فقط با ماژول request در این کتابخانه کار داریم، پس صرفاً همین یک ماژول را import می‌کنم:

from urllib import request

اگر با ماژول‌ها آشنا نیستید یا نمی‌دانید چطور از آن‌ها استفاده کنید، می‌توانید آموزش ماژول در پایتون را برای یادگیری بیشتر ببینید.

برای دانلود فایل با urllib در پایتون از تابع urlretrieve() استفاده می‌کنیم. این تابع دو ورودی اجباری می‌گیرد:

  1. آدرس فایلی که می‌خواهیم از وب دانلود شود.
  2. اسم فایل و مسیر (path) دلخواهی که فایل در آنجا ذخیره می‌شود.

در اینجا یک متغیر پایتون به نام url تعریف می‌کنم که آدرس عکس همین آموزش را مشخص می‌کند. در قطعه کد زیر، این عکس را روی سیستم دانلود و در کنار فایل کد ذخیره می‌کنیم.

from urllib import request

url = "https://sabzdanesh.com/Uploads/2022/02/Download-Files-with-Python-Tutorial.jpg"

request.urlretrieve(url, "sabzdanesh.com_Download-with-python.jpg")

اگر دقت کنید می‌بینید که حتماً لازم نیست اسم فایل اصلی با فایلی که ذخیره می‌شود یکسان باشد. می‌توانیم هر اسمی را برای فایل نهایی در کامپیوترمان تعیین کنیم.

در مستندات این ماژول (نسخه 3 پایتون) گفته شده که «ممکن است» این ماژول در آینده منسوخ شود! به نظر من با اینکه کلمه «ممکن» احتمالاً هیچ وقت به نتیجه نرسد (!) می‌توانید از این روش در پروژه‌های کوچک و متوسط خودتان استفاده کنید. اما اگر احساس می‌کنید در آینده برایتان مشکلی ایجاد شود، روش بعدی انتخاب بهتری است.

دانلود با ماژول requests پایتون

ماژول requests امکانات و توابع فوق‌العاده‌ای برای کار با وب در اختیار ما می‌گذارد. اگر در برنامه‌های خود با وب سروکار دارید، حتماً پیشنهاد می‌کنم این ماژول را با جزئیات بیشتری یاد بگیرید. 😉

با اینکه این ماژول ویژگی‌های زیادی دارد، اما یک تابع خاص برای دانلود فایل ندارد! ما باید دانلود فایل را به‌صورت دستی در پایتون انجام داده و فایل نهایی را خودمان ذخیره کنیم.

قبل از هر چیز، کتابخانه reqeusts را نصب می‌کنیم:

pip install requests

برای نصب از دستور pip پایتون استفاده کرده‌ام؛ اگر با این ابزار آشنا نیستید، حتماً آموزشش را ببینید.

دانلود فایل با پایتون

قبول دارید که دانلود فایل به‌نوعی باز کردن یک صفحه در وب است؟! با همین روش در پایتون می‌توانیم یک فایل را از اینترنت دانلود کنیم.

متدهای مختلفی در پروتکل HTPP برای انتقال اطلاعات وجود دارد. دو تا از معروف‌ترین‌ها که شاید اسمشان را شنیده باشید، POST و GET است. تفاوت این‌ها و بررسی سایر متدها بحث جداگانه‌ای است. اما به زبان خیلی ساده، همین را در ذهن داشته باشید که وقتی یک url را در مرورگر تایپ و اینتر می‌کنیم، درخواست GET و وقتی یک فرم ارسال می‌کنیم معمولاً درخواست POST می‌فرستیم.

می‌دانیم که برای دانلود یک فایل، کافی است آدرس آن را در مرورگرمان وارد و Enter کنیم! بنابراین از روش get برای دانلود در پایتون استفاده می‌کنیم.

تابع get() یک ورودی اجباری دارد که آدرس صفحه (url) مورد نظر ماست؛ درخواست باز کردن صفحه (فایل) را شبیه زیر ارسال می‌کنیم:

import requests

url = "https://sabzdanesh.com/Uploads/2022/02/Download-Files-with-Python-Tutorial.jpg"

page = requests.get(url)
بررسی شئ پاسخ requests در دانلود get
بررسی نوع شیء پاسخ requests.get در دانلود صفحه

نوع شیء page از کلاس requests.models.Response است. این کلاس متدها و ویژگی‌های مختلفی دارد که می‌توانیم بنا به نیازمان از آن‌ها استفاده کنیم. چند ویژگی را که برایمان مفید است در جدول زیر قرار داده‌ام:

ویژگی (property)مقدار
status_codeوضعیت اجرای درخواست
textمتن محتوای پاسخ به‌صورت unicode
contentمتن محتوای پاسخ (فایل) به‌صورت رشته پایتون
۳ ویژگی مهم شیء Requests Response

برای دانلود فایل با پایتون به محتوای عادی فایل نیاز داریم تا بتوانیم آن را ذخیره کنیم؛ بنابراین از ویژگی content استفاده می‌کنیم.

از «کد وضعیت» می‌توانیم بررسی کنیم که آیا خطایی در باز کردن صفحه وب (فایل) وجود داشته یا نه. برای مثال، چند کد status معروف عبارت‌اند از:

  • 200 یعنی همه چیز عالی بوده و url به‌درستی باز شده
  • 404 یعنی چنین آدرسی وجود ندارد (not found)
  • 403 یعنی سرور درخواستمان را متوجه شده اما پاسخ به آن را ممنون می‌داند!
تعریف کلاس در پایتون و کار با متد و ویژگی

تعریف کلاس در پایتون و کار با متد و ویژگی

ذخیره فایل دانلودی

برای ذخیره فایلی که دانلود شده لازم است یک فایل جدید در سیستم ایجاد کرده و محتوای دانلودی را در آن قرار دهیم. اگر یک فایل (با هر فرمتی) را با یکی از ویرایشگرهای متنی باز کنید، یکسری کد (احتمالاً نامفهوم) می‌بینید که ساختار فایل را مشخص می‌کنند.

قبلاً در آموزش کار با فایل در پایتون به‌طور مفصل درباره روش‌های خواندن، نوشتن و ایجاد کردن فایل‌ها صحبت کرده‌ام. در اینجا فقط از دانسته‌هایمان استفاده می‌کنیم.

ابتدا باید یک فایل با نام مورد نظرمان و فرمت متناسب با فایلی که دانلود کرده‌ام ایجاد و باز کنیم. سپس با متد write() محتویات فایل را در آن قرار دهیم.

with open('downloaded-with-reqeusts.jpg', 'wb') as file:
    file.write(page.content)

اگر با تابع open() از قبل آشنا هستید، احتمالاً بدانید که در حالت عادی باید فایل را ببندیم. (با متد close()) با روش قطعه کد بالا (دستور with) نیازی به این کار نیست و بعد از اتمام اجرای بدنه، فایل بسته می‌شود.

مد نوشتن در فایل را wb تعریف کرده‌ایم؛ چون در حال نوشتن محتوای یک فایل غیر متنی هستیم و باید در مد باینری (binary) نوشته شود.

کد دانلود فایل با requests

برای جمع‌بندی این روش، قطعه کد زیر را برای دانلود عکس همین آموزش بر روی کامپیوترمان داریم. در این کد، آدرس عکس با فرمت jpg را از کاربر می‌گیریم. (بیشتر یاد بگیرید: دستور input برای گرفتن ورودی در پایتون)

import requests

url = input("Enter your .jpg file url: ")

image = requests.get(url)

with open('SabzDanesh-image.jpg', 'wb') as file:
    file.write(image.content)

print("Download Completed!")

به همین سادگی می‌توانید هر نوع فایلی را از اینترنت با پایتون دانلود کنید.

فقط دقت کنید که حتماً فرمت فایلی که ایجاد می‌کنید متناسب با فرمت فایل دانلود باشد. یعنی قسمت jpg در این مثال باید با فرمت موردنظر شما مثل mp4، mp3، pdf، zip و … جایگزین شود.

همچنین می‌توانید این روش را با ساختارهای شرطی پایتون و مدیریت خطای python ترکیب کنید تا اگر خطایی در دانلود فایل وجود داشت، برنامه با مشکل مواجه نشود.

پیشنهاد می‌کنم برای تقویت مهارت برنامه‌نویس خودتان، سعی کنید یک ویژگی دیگر به این کد اضافه کنید:

  • سعی کنید را روش‌های کار با رشته سعی کنید فرمت فایل را از روی آدرس تشخیص دهید. اینطوری نیاز نیست برای هر نوع فایل، کدتان را تغییر دهید.

امیدوارم از این آموزش استفاده کاربردی داشته باشید. اگر سؤال یا تجربه‌ای در برنامه‌نویسی برنامه دانلود با پایتون یا چالشی در تکمیل آن دارید، بخش دیدگاه‌ها برای اشتراک‌گذاری صحبت‌های شماست! 🙂