بعضیا پیش میاد که لازم هست تا یکسری ویدیو را از آپارات دانلود بشه. در آپارات این امکان وجود داره که ویدیوها مربوط به یک موضوع را به صورت لیست پخش ایجاد کرد تا با این دسته بندی دسترسی به ویدیوهای یک موضع راحتر باشه.
اگر بخواهیم که از ویدیوهای آپارات یک نسخه آفلاین داشته باشیم امکان دانلود در سایت برای مراجعین وجود دارد و به راحتی می توان از بین کیفیت های مختلف دانلود را شروع کرد.
اما اگر کسی مثل من تبل باشد و بخواهد کل لیست پخش را دانلود کند کار خسته کننده ای برایش خواهد بود. چون می خواستم یکسری ویدیو را به صورت آفلاین استفاده کنم به فکر نوشتن کد برای دانلود دسته جمعی لیست پخش افتادم که اگر بعدها هم خواستم بتوانم از کد استفاده کنم.
با سرچ در اینترنت کتابخانه BeautifulSoup را پیدا کردم که برای خواندن یک صفحه وب و استخراج اطلاعات از میان تگهای آن استفاده می شه. با راهنمایی اینترنتی کدی که بتواند دانلود را انجام دهد، نه لزوما خوب، را نوشتم. در ادامه می خوام این کد را اینجا کپی پیست کنم :)، چون نمی تونم دقیق خط به خط بنویسم چه اتفاقی افتاده D:؛
برای کار از 3 پکیچ پایتونی استفاده کردم که باید آنها را به کد اضافه کنیم:
import os import requests from bs4 import BeautifulSoup
یک تابع کوچیک برای دانلود فایل از یک ویدیو در آپارت به صورت زیر نوشتم:
def downlaod_video(url, path=os.getcwd()): #درخواست صفحه وب page = requests.get(url) # بارگزاری صفحه وب soup = BeautifulSoup(page.content, 'html.parser') #دریافت عنوان ویدیو #موجود در تگ h1 #id=videoTitle title = soup.find('h1', attrs={'id': 'videoTitle'}).text.strip() #ایجاد مسیر ذخیر فایل file_name = title + '.mp4' file_path = os.path.join(path, file_name) #اگر فایل قبلا وجود داشت دانلود نمی کنه if os.path.exists(file_path)==False: #بدست آوردن آدرس فایل ویدیو file_url = soup.find('div', attrs={'class': 'download-dropdown'}).find_all('li')[-1].find('a')['href'] #دانلود ویدیو r = requests.get(file_url, stream = True) with open(file_path,"wb") as video: for chunk in r.iter_content(chunk_size=1024): if chunk: video.write(chunk) `
تابع بالا 2 ورودی دارد:
صفحه ویدیو در آپارات و محل ذخیره ویدیو. اگر موقع فراخوانی ویدیو محل ذخیره خالی باشد محل اجرای کد را محل پیش فرض در نظر می گیرد.
آدرس فایل دانلود داخل یک تگ DIV با کلاس download-dropdown قرار دارد. داخل این تگ به تعداد کیفیت های موجود از ویدیو تگ li وجود دارد که بهترین فرمت در آخرین تگ li قرار داد به همین دلیل آخرین تگ فراخوان می شود. داخل این تگ یک لینک وجود دارد که href موجود در آن آدرس دانلود است.
حال می توان به راحتی یک صفحه را فراخوانی کرد و فایل را دانلود کرد.
`url = 'https://www.aparat.com/v/j2GCq' downlaod_video(url)
تابع فوق فقط ویدیوی موجود در یک صفحه را دانلود می کند و اگر بخواهیم همه ویدیوهای یک لیست پخش را دانلود کنیم می شه به صورت زیر عمل کرد:
یکی از صفحات رو خوانده می شه:
url = 'https://www.aparat.com/v/j2GCq' page = requests.get(URL) soup = BeautifulSoup(page.content, 'html.parser')`
بعد لیست پخش و آیتمهای موجود در اون لیست پخش در متغیر قرار می گیره:
playlist_body = soup.find('div', attrs={'class': 'playlist-body'}) playlist_items = playlist_body.find_all('div', attrs={'class': 'item'})
و می شه یک پوشه در درایو خاصی ایجاد که فایل های دانلودی در اونجا قرار بگیرند. اسم فولد بر اساس اسم لیست پخش تعیین می شه:
playlist = playlist = soup.find('header', attrs={'class': 'playlist-head'}) path = 'd:\\' + playlist.find('a', attrs={'id':'playlistTitle'}).get_text() try: os.mkdir(path) except: print('This folder is exist')`
در انتها داخل یک حلقه کلیه آیتمها خونده می شه و صفحات مربوطه استخراج و به تابع بالا ارسال می شه تا دانلود فیلم را انجام بده.
برای اینکه تعداد دانلود ها هم نمایش داده بشه از کتابخانه تقدم برای سر نرفتن حوصله هم استفاده کردم:
from tqdm.notebook import tqdm with tqdm(total =len(playlist_items)) as pbar: for index, a in enumerate(playlist_items): a_tag = a.find('a', href=True, text=True) item_url = 'https://www.aparat.com' + a_tag['href'] downlaod_video(item_url, path, index+1) pbar.update(1)`
در کد بالا با فرض اینکه آیتمهای موجود در لیست پخش به ترتیب قرار دارند با index ترتیب ت مشخص می شه. برای همین در تابع 2 تغییر زیر باید انجام بشه:
def downlaod_video(url, path=os.getcwd(), index=None):`
و
file_name = str(index) + '_' + title + '.mp4' if index != None else title + '.mp4'`
با اجرای این کد البته در جوپیتر فایلها ویدیوی آپارت دانلود می شه.
با کمی دقت می تونید بفهمید چی شده :)