در مطلب متد select در ماژول bs4 در مورد متد ()select_one و ()select در کتابخانه bs4 صحبت کردیم و در ادامه یادگیری آن، در این مطلب می خواهیم در مورد بدست آوردن فهرست برخی از ویدیوهای صفحه خانگی سایت آپارات بوسیله متد ()select و بدست کیفیت های متفاوت یک ویدیو (لینک) ویژه صحبت کنیم.

مثال – فهرست برخی از ویدیوهای صفحه خانگی سایت آپارت

در شکل زیر می توانید ببینید که تگ a مربوط به ویدیوهای صفحه خانگی سایت آپارات درون تگ h2 با کلاس video-item__title قرار دارند. در مثال این مطلب می خواهیم کدی را بنویسیم که مقدار خصوصیت href و عنوان یا متن تگ a را به صورت دیکشنری هایی درون یک لیست بریزد. در واقع یک لیست از دیکشنری ها می خواهیم که هم عنوان (متن) و هم آدرس URL ویدیو را نگهداری کند.

در کد شکل زیر یک تابع به نام getAllAparatIndexVideos تعریف کرده ایم. که بوسیله متد ()select می خواهیم تمامی تگ های h2 با کلاس video-item__title را بدست آوریم، پس رشته h2.video-item__title به متد ()select فرستاده شده است. خروجی متد ()select یک لیست است که در این مطلب درون متغیر all_h2_tags ذخیره می شود. در خط ۱۵ و ۱۶ و درون حلقه for، به ترتیب خصوصیت href و متن یا عنوان تگ a به درون متغیرهای href و title ریخته می شوند و سپس این دو به عنوان مقدارهای کلید href و title به صورت یک دیکشنری به درون لیستی به نام متغیر allVideoLinks الحاق می شوند.

در نهایت در خط ۱۹ بوسیله عبارت reeturn لیست حاوی دیکشنری ها برگشت داده می شود. توجه کنید ۱۶ چون خروجی متد ()get_text رشته است، پس می توانیم متد ()strip بدون هیچ ورودی را برای از میان بردن کاراکترهای خط جدید (کاراکتر n\) فراخوانی کنیم.

 مثال – فهرست کیفیت های یک لینک آپارات

در کد این مثال می خواهیم تابعی به نام getQualityHref را بنوسیم که یک آدرس URL را دریافت و سپس یک لیست از دیکشنری ها (در اینجا متغیر videoLinks) را بر می گرداند که کلید هر دیکشنری دارای دو کلید به نام های quality و href است. در خط ۷ نخست بوسیله متد ()urlparse آدرس ورودی به تابع را به زیر مولفه های می شکنیم. در مطلب تجزیه URL مولفه ها توسط پایتون و urllib.parse در مورد متد ()urlparse صحبت کردیم و گفتیم مقدار برگشتی آن یک لیست است که دومین مولفه آن با اندیس 1 به دامنه آدرس و سومین مولفه آن با اندیس 2 به آدرس صفحه درخواستی یا هر منبع دیگری اشاره دارد.

در شکل بالا به دنبال بدست آوردن تمامی تگ های li هسیتم که مقدار خصوصیت data-ec آنها برابر با رشته download است. بنابراین در خط ۱۳ از کد زیر و بوسیله متد ()find_all تمامی تگ های li با خصوصیت data-ec با مقدار download استخراج شده اند. مطابق شکل زیر خروجی متد ()find_all در متغیر li_tags ذخیره شده است. سپس درون یک حلقه for و به اندازه محدوده (Range) اندازه (Length)، در هر گام :

۱ – مقدار خصوصیت data-el از تگ li درون متغیر quality ذخیره می شود. اگر به شکل بالا توجه کنید، می بینید که درون تگ های li مقدار خصوصیت data-el همان کیفیت ویدیو است.

۲ – درون هر تگ li در شکل بالا یک تگ a وجود دارد که همان لینک ویدیو مطابق با کیفیت خصوصیت data-el است که متاسفانه در شکل بالا نشان داده نشده است. بنابراین لازم است این تگ a بوسیله متد ()find استخراج و در متغیر a_tag ذخیره شود.

۳ – لازم است تا لینک ویدیو مطابق با کیفیت را نیز داشته باشیم، پس بوسیله متد ()get خصوصیت href را واکشی می کنیم. توجه کنید در مطلب های پیشین از اندیس گذاری و به صوررت [‘href’] استفاده می کردیم.

در پایان بوسیله متد ()append از لیست های پایتون، دو متغیر quality و href به عنوان مقدارها به کلیدهای qulity و href در دیکشنری اضافه می شوند. نهایتا یک لیست از دیکشنری ها خواهیم داشت که هر دیکشنری دارای دو کلید qulity و href است که به ترتیب به کیفیت و لینک ویدیو مطابق با کیفیت اشاره دارند.

دانلود سورس برنامه این مطلب Python Aparat Web Scraping