چچچ (۹): چطور به صورت فلهای لینکهای یوتیوب را از وبسایتی استخراج و دانلود کنیم!
ببخشید که تیتری از این سادهتر و گویاتر پیدا نکردم. ولی خوب اصل موضوع خیلی قشنگ چالش برانگیز است. مساله این است:
سایتی به این شکل داریم (لینک را باز کنید) که شامل یک لیست از پیوند به صفحات دیگرش است که در آنها علاوه بر قابلیت نمایش ویدیو، لینک یوتیوب همان ویدیو وجود دارد. حجم پیوندها برابر ۲۰۰ عدد است
کار عادیاش به این صورت است که بنشینیم و با حوصله تک تک لینکها را کپی پیست کرده و جایی ذخیره کنیم. ولی با وجود دویست صفحه و لینک، کمی (خیلی) خسته کننده (خریت به معنای واقعی کلمه، البته ببخشید ;-)) است. خوب جواب مساله را خودم هم نمیدانستم، ولی مطمئن بودم، با ابزارهای گنو/لینوکسی، نتیجهی خیلی خوبی خواهم گرفت. اولین کاری که به فکرم رسید، دانلود صفحهی اصلی و صفحههای پیوند شده به هر لینک بود که با wget خیلی خوب بلد بودم! به این صورت:
[bash]
wget -rl1 http://thenewboston.org/list.php?cat=11
[/bash]
خوب نتیجه مجموعهای از فایلها بود که با اسمهایی شبیه به آدرسشان در پوشهی جاری ذخیره شده بود. با استفاده از آرگومانهای rl1 به wget فهماندم که صفحهی حاضر را به عمق یک صفحه رو به جلو دانلود کند. حالا مسالهی سخت اینجا بود که چطور به grep بفهمانیم که چه چیزی را (در اینجا لینک ویدیو در یوتیوب) برایمان جدا کند. دستوری که با دفعات زیادی آزمون و خطا نتیجه داد، به این صورت بود: (برای دیدن دستور کاملتر به آخر مطلب رجوع کنید، ویرایش۱)
[bash]
grep -ohE «http://www.youtube.com/watch?v=%5B%5B:alnum:%5D-%5D{11}» * > list
[/bash]
کار این دستور این است که یک لیست از الگوی داده شده را ایجاد و در فایل list ذخیره کند. آرگومانهای ohE به طور خلاصه به grep میفهمانند که فقط عبارت داخل پرانتز را در فایلها پیدا کند و در خروجی نمایش دهد. قسمت جالب قضیه که بیشتر از همه وقتم را گرفت بخش زیر بود:
[bash]
[[:alnum:]-]{11}
[/bash]
که به grep میگفت ترکیبی از حروف و ارقام را به تعداد یازده عدد قبول کند. در مورد این عبارتها در آیندهای نزدیک پستی در شاهینیسم خواهیم داشت.
برای دانلود لینکها هم میتوانید همان فایل خروجی را به صورت زیر به youtube-dl بدهید:
[bash]
youtube-dl -ta list
[/bash]
البته سرعت دانلود youtube-dl واقعا پایین است. روی سروری با دانلود عادی ده مگ، سرعت به زور میتوانست به چهل کیلوبایت برسد. پیشنهاد من به شما، نصب یک نسخه از RapidLeech است. سرعت و کاربرد بسیار بهتری دارد 😉
ویرایش ۱: بعد از مدتی استفاده از این دستور، فهمیدم که از اونجایی که توی آدرسهای Youtube امکان وجود آندرلاین هم هست، تعدادی از لینکها رو با دستور بالا از دست میدیم. به همین دلیل دنبال یه راه دیگه گشتم، و سرانجام به دستور زیر رسیدم که نتیجهی خیلی قابل قبولتری میده:
[bash]
grep -ohE «http://www.youtube.com/watch?v=%5B%5B:alnum:%5D(-|_)]{11}» * | uniq > list2
[/bash]
همچنین توی این دستور با استفاده از uniq از تکرار لینکها در صفحه خروجی جلوگیری میشه 😉
عالی بود. خیلی خیلی لذت بردم! ممنون آقا شاهین!
قابل نداشت دوست من 😉