خب طبق معمول اولش میخوام بگم که ماجرا از کجا شروع شده. اگر خدا بخواد هفته آینده داریم میریم تبریز که یه بادی به سرمون بخوره بعد از این چند وقت شلوغی کاروزندگی. از تهران تا تبریز حدودا ۶، ۷ ساعت راهه. معمولا وقتی خودمون مسافرت میریم، تو راه پادکست گوش میدیم. ماشااله پادکستهای فارسی هم تو چند وقت اخیر رشد چشمگیری داشتند و الآن پادکستهای خیلیخوبی تو موضوعات مختلف داریم.
یه ریپو روی github هم هست که تقریبا هرچی هست رو لیست کرده:
https://github.com/ashkanRmk/awesome-persian-podcasts
خب بریم سر ادامه داستان. تو این سفر مهمون داریم و متاسفانه خیلی اهل پادکست و این جینگولک بازیها نیستند. از طرفی هم ما خیلی اهل آهنگ گوش دادن نیستیم و در نتیجه ضبط ماشین کلا چیز خاصی نداره برای اینکه خودی نشون بده. :)
این شد که تصمیم گرفتیم یذره مواد اولیه برای قر دادن آماده کنیم. در همین راستا سری به گوگل زدیم و گفتیم بریم سراغ سایتهای دانلود آهنگ. تهش چند تا لینک انتخاب شد که ما رو ببره به فضای «همایون ولش کن» دوست عزیزمون! یکی از لینکها به عنوان مثال اینه:
http://blogmusic.ir/خاطره-انگیز-قدیمی/
این دوستمون یذره حرکت عجیبی زده و جایی تو سایتش پیدا نمیشه که کل این پکیج رو بشه دانلود کرد و باید برای هر آهنگ روی گزینه دانلود کلیک کنید. حالا این یکی از مثالها بود و تقریبا بیستتا از این سایتها رو انتخاب کرده بودیم که این کارشون مشابه بوده. احتمالا هم به دلیل داستانهای SEO این کار رو کردند تا کاربر مجبور بشه زمان بیشتری رو روی سایتشون بمونه. ولی خب یه برنامهنویس هیچوقت نمیره این کار رو بکنه، چون کار حوصلهسربری هست. برای همین سعی میکنم یذره گیکبازی قاطیش کنم تا بشه انجامش داد!
خب پس صورت مسئله مشخص شد. نیاز به یه برنامهای داریم تا بره صفحه مورد نظر ما رو بخونه و هر چی آهنگ تو اون صفحه هست رو برامون دانلود کنه. به این کار تو زمینه برنامهنویسی میگن crawl کردن. مشابه کاری که رباتهای گوگل برای index کردن صفحات وب انجام میدن. در واقع گوگل کلی از این خزندهها داره که میرن صفحات مختلف سایتها رو میخونن و محتواشون رو بررسی میکنن و در نهایت با یه سری الگوریتم بین محتوایی که باتها خوندن سرچ میکنه و نتایج رو به شما نشون میده.
خب دیگه بریم سراغ اصل مطلب. من برای این کار طبق معمول از پایتون استفاده کردم. یکی از فواید بزرگ این زبون اینه که آدمهای زیادی تو دنیا دارن باهاش کار میکنن و نتیجش میشه اینکه تقریبا هرکاری بخواین انجام بدید یکی قبلا مشابهش رو انجام داده و کلی کتابخونه براش وجود داره که باعث میشه روی کار اصلیتون تمرکز کنید. کتابخونهای که من برای اینکار انتخاب کردم BeautifulSoup هست که ترجمش میشه «سوپ زیبا»! تو ادامه کار من فرض رو بر این گذاشتم که با پایتون آشنایی دارید، اگر اینطور نیست میتونید یدوری تو اینترنت بزنید و در موردش بخونید یا اینکه از این دوره جادی استفاده کنید تا کلیات قضیه دستتون بیاد.
pip install beautifulsoup4
۲. برای اینکه یچیزی رو خوب یاد بگیرید، بهترین کار اینه که برید داکیومنتش رو بخونید. اینجا من فقط استفادهای که قرار هست ازش بکنم رو توضیح میدم و وارد جزئیاتش نمیشم. همونطور که در جریان هستید صفحات وب در نهایت یسری html و css و js هستند که روی browser ما داره نمایش داده میشه. امکانی که این کتابخونه به ما میده این هست که بتونیم روی html یا همون ساختار صفحه دنبال چیزایی که نیاز داریم بگردیم. پس کاری که من میکنم اینه که html صفحهای که دارم میبینم رو دانلود میکنم و سعی میکنم با پایتون برم دنبال آهنگها. اگر به سورس صفحه نگاه کنید، لینک آهنگها همچین شکلی داره:
<a href="http://sv.blogmusic.ir/myahang/Morteza-Ahmadi.mp3" class="small otw-aqua radius otw-button" target="_blank">DOWNLOAD</a>
تا اینجا میشه گفت ویژگی مشترک لینکهای دانلود همچین چیزیه:
پس من کافیه تو صفحه دنبال این ویژگیها بگردم و تمام تگهای a با ویژگیهای بالا رو پیدا کنم.
۳. برای شروع اول باید متن صفحه رو که دانلود کردم بدم به کتابخونهای که صحبتش شد. بعد از یکی از متدهاش برای پیداکردن هدف استفاده کنم!
from bs4 import BeautifulSoup source = str(open('page_source.html', 'r').readlines()) soup = BeautifulSoup(source, 'html.parser') for a_tag in soup.find_all('a', string="DOWNLOAD"): print(a_tag)
تا این مرحله همه تگهای a ای که میخواستیم پیدا شدند و خروجی اینه:
<a class="small otw-aqua radius otw-button" href="http://sv.blogmusic.ir/myahang/Mix-Ghadimi.mp3" target="_blank">DOWNLOAD</a>
<a class="small otw-aqua radius otw-button" href="http://sv.blogmusic.ir/myahang/Mix-Ghadimi-shad.mp3" target="_blank">DOWNLOAD</a>
و ...
۴. حالا کافیه مقدار href هارو دانلود کنیم. من معمولا برای دانلود از wget تو لینوکس استفاده میکنم. اگر با لینوکس خیلی آشنایی ندارید، فکر کنم تو پست قبلیم یسری لینک دادم برای نصب و این داستانهاش. البته کاملا مشخصه که با پایتون هم میتونید دانلود رو انجام بدید، صرفا من اینجوری بیشتر خوشم اومد. :)
خب همونطور که تو کد بالا میبینید لینکها تو فایلی به اسم links.txt ذخیره میشن. تو مرحله بعدی کافیه با wget فایلها رو دانلود کنیم. یکی از امکاناتی که wget داره اینه که میتونید بهش یه لیستی از لینکها بدید تا براتون بقیه کارها رو انجام بده و این یعنی دقیقا چیزی که الآن نیاز داریم.
wget -i links.txt
خروجی:
Resolving sv.blogmusic.ir (sv.blogmusic.ir)... 185.49.85.151
Connecting to sv.blogmusic.ir (sv.blogmusic.ir)|185.49.85.151|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 111917 (11M) [application/octet-stream]
Saving to: ‘Mix-Ghadimi.mp3’
Mix-Ghadimi.mp3 96%[===============> ] 11.19M 4.73MB/s eta 1s
حالا دیگه میتونیم بریم یکم استراحت کنیم تا فایلها آماده بشه برای گوش دادن و ...
امیدوارم مطالبی که با هم مرور کردیم براتون مفید بوده باشه. هدف از این پستها اینه با دانشی که تو حوزهی برنامهنویسی داریم یسری از مسئل روزانهمون رو باحالتر حلشون کنیم و ازشون لذت ببریم! :)
حالا که تا اینجا اومدیم یذره هم در مورد خود عمل کرال کردن صحبت کنیم. این کار امروزه زیاد داره استفاده میشه که چند تا از ابزارهایی که دارن از همین مکانیزم استفاده میکنند رو معرفی میکنیم.
اگر میخواید جدیتر از این مسئله دانلود آهنگ که با هم انجامش دادیم، کار کرال انجام بدید حتما فریمورک scrapy رو چک کنید. گرفتن داده تو حجم بالا چالشهای جالبی داره که بخش عمدهای از اون تو scrapy حل شده.
اگر پیشنهاد یا انتقادی داشتید خوشحال میشم نظر بدید. آدرس ایمیل من:
pourya.2374@gmail.com
تا پست بعدی، یا حق