پوریا ماندی‌صنم
پوریا ماندی‌صنم
خواندن ۶ دقیقه·۵ سال پیش

مهیا کردن بساط لهو و لعب با برنامه‌نویسی!

 مسیر تهران - تبریز به کمک دوست همیشگی.
مسیر تهران - تبریز به کمک دوست همیشگی.

خب طبق معمول اولش می‌خوام بگم که ماجرا از کجا شروع شده. اگر خدا بخواد هفته آینده داریم می‌ریم تبریز که یه بادی به سرمون بخوره بعد از این چند وقت شلوغی کاروزندگی. از تهران تا تبریز حدودا ۶، ۷ ساعت راهه. معمولا وقتی خودمون مسافرت می‌ریم، تو راه پادکست گوش می‌دیم. ماشااله پادکست‌های فارسی هم تو چند وقت اخیر رشد چشم‌گیری داشتند و الآن پادکست‌های خیلی‌خوبی تو موضوعات مختلف داریم.

یه ریپو روی github هم هست که تقریبا هرچی هست رو لیست کرده:

https://github.com/ashkanRmk/awesome-persian-podcasts

خب بریم سر ادامه داستان. تو این سفر مهمون داریم و متاسفانه خیلی اهل پادکست و این جینگولک بازی‌ها نیستند. از طرفی هم ما خیلی اهل آهنگ گوش دادن نیستیم و در نتیجه ضبط ماشین کلا چیز خاصی نداره برای اینکه خودی نشون بده. :)

این شد که تصمیم گرفتیم یذره مواد اولیه برای قر دادن آماده کنیم. در همین راستا سری به گوگل زدیم و گفتیم بریم سراغ سایت‌های دانلود آهنگ. تهش چند تا لینک انتخاب شد که ما رو ببره به فضای «همایون ولش کن» دوست عزیزمون! یکی از لینک‌ها به عنوان مثال اینه:

http://blogmusic.ir/خاطره-انگیز-قدیمی/

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

خب پس صورت مسئله مشخص شد. نیاز به یه برنامه‌ای داریم تا بره صفحه مورد نظر ما رو بخونه و هر چی آهنگ تو اون صفحه هست رو برامون دانلود کنه. به این کار تو زمینه برنامه‌نویسی می‌گن crawl کردن. مشابه کاری که ربات‌های گوگل برای index کردن صفحات وب انجام می‌دن. در واقع گوگل کلی از این خزنده‌ها داره که میرن صفحات مختلف سایت‌ها رو می‌خونن و محتواشون رو بررسی می‌کنن و در نهایت با یه سری الگوریتم بین محتوا‌یی که بات‌ها خوندن سرچ می‌کنه و نتایج رو به شما نشون می‌ده.

عکس از سایت state of digital
عکس از سایت state of digital

خب دیگه بریم سراغ اصل مطلب. من برای این کار طبق معمول از پایتون استفاده کردم. یکی از فواید بزرگ این زبون اینه که آدم‌های زیادی تو دنیا دارن باهاش کار می‌کنن و نتیجش می‌شه اینکه تقریبا هرکاری بخواین انجام بدید یکی قبلا مشابهش رو انجام داده و کلی کتابخونه براش وجود داره که باعث می‌شه روی کار اصلیتون تمرکز کنید. کتابخونه‌ای که من برای اینکار انتخاب کردم BeautifulSoup هست که ترجمش می‌شه «سوپ زیبا»! تو ادامه کار من فرض رو بر این گذاشتم که با پایتون آشنایی دارید، اگر اینطور نیست می‌تونید یدوری تو اینترنت بزنید و در موردش بخونید یا اینکه از این دوره جادی استفاده کنید تا کلیات قضیه دستتون بیاد.

  1. من تو پایتون عادت دارم که هروقت می‌خوام یه پروژه‌ای رو شروع کنم براش یه محیط مجازی (virtual environment) درست می‌کنم. بعد از این‌ کار باید package مورد نظرمون رو نصب کنیم.
pip install beautifulsoup4

۲. برای اینکه یچیزی رو خوب یاد بگیرید، بهترین کار اینه که برید داکیومنتش رو بخونید. اینجا من فقط استفاده‌ای که قرار هست ازش بکنم رو توضیح می‌دم و وارد جزئیاتش نمی‌شم. همونطور که در جریان هستید صفحات وب در نهایت یسری html و css و js هستند که روی browser ما داره نمایش داده می‌شه. امکانی که این کتابخونه به ما می‌ده این هست که بتونیم روی html یا همون ساختار صفحه دنبال چیزایی که نیاز داریم بگردیم. پس کاری که من می‌کنم اینه که html صفحه‌ای که دارم می‌بینم رو دانلود می‌کنم و سعی ‌‌می‌کنم با پایتون برم دنبال آهنگ‌ها. اگر به سورس صفحه نگاه کنید، لینک آهنگ‌ها همچین شکلی داره:

<a href=&quothttp://sv.blogmusic.ir/myahang/Morteza-Ahmadi.mp3&quot class=&quotsmall otw-aqua radius otw-button&quot target=&quot_blank&quot>DOWNLOAD</a>

تا اینجا میشه گفت ویژگی مشترک لینک‌های دانلود همچین چیزیه:

  • داخل تگ a قرار گرفتند.
  • متن لینک DOWNLOAD هست.

پس من کافیه تو صفحه دنبال این ویژگی‌ها بگردم و تمام تگ‌های 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=&quotDOWNLOAD&quot): print(a_tag)

تا این مرحله همه تگ‌های a ای که می‌خواستیم پیدا شدند و خروجی اینه:

<a class=&quotsmall otw-aqua radius otw-button&quot href=&quothttp://sv.blogmusic.ir/myahang/Mix-Ghadimi.mp3&quot target=&quot_blank&quot>DOWNLOAD</a>
<a class=&quotsmall otw-aqua radius otw-button&quot href=&quothttp://sv.blogmusic.ir/myahang/Mix-Ghadimi-shad.mp3&quot target=&quot_blank&quot>DOWNLOAD</a>
و ...

۴. حالا کافیه مقدار href هارو دانلود کنیم. من معمولا برای دانلود از wget تو لینوکس استفاده می‌کنم. اگر با لینوکس خیلی آشنایی ندارید، فکر کنم تو پست قبلیم یسری لینک دادم برای نصب و این داستان‌هاش. البته کاملا مشخصه که با پایتون هم می‌تونید دانلود رو انجام بدید، صرفا من اینجوری بیشتر خوشم اومد. :)

https://gist.github.com/pourya2374/87fb661a12c210bd604519c98b11f4ef

خب همونطور که تو کد بالا می‌بینید لینک‌ها تو فایلی به اسم 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

تا پست بعدی، یا حق

برنامه نویسیپایتونcrawlerpythonدانلود آهنگ
یه برنامه‌نویس که همیشه دوست داره بین دو تا چیز، دومی رو اول بگه! در حال حاضر مدیرفنی تیم تیکا و علاقه‌مند به مباحث زیرساخت و امنیت.
شاید از این پست‌ها خوشتان بیاید