امیرحسین دوزنده
امیرحسین دوزنده
خواندن ۳ دقیقه·۶ سال پیش

هر کاری یه اسکریپت پایتون داره - اینستاگرام

عکس از RealPython
عکس از RealPython

موقعی که پست "هرکاری یه اسکریپت پایتون داره - آرشیو فیلم" رو نوشتم اصلا فک نمیکردم که ازش اینقدر استقبال باشه نسبت به سایر پست‌هام واسه همین تصمیمی گرفتم ادامه‌اش بدم و اسکریپت‌های کوچیکی که به صورت روزمره یا برای کارهای کوچیک مینویسم رو باهاتون به اشتراک بذارم تا شما هم ازش استفاده کنید و در صورت نیاز بهبودشون، منم خوشحال میشم اگه تغییری تو کدها میدین از طریق Git بهم اطلاع بدید.

از اونجایی که شما هم اطلاع دارین اینستاگرام به هیچ وجه گزینه ای برای دانلود تصویر یا ویدئو پست‌ها نداره واسه همین منم با خودم فکر کردم چرا یکم سربه‌سر اینستاگرام نذاریم واسه همین گفتم چه بهتر که یه اسکریپت بنویسم و با گرفتن لینک اون پست، عکس یا ویدئو مربوط بهش رو دانلود کنم اینجوری دیگه لازم نیست تا بین اون همه تگ‌های HTML بگردم دنبال لینک عکس‌ها و ویدئوها


چالش‌های من چی بود:

  • اینستاگرام جز وب سایت‌هایی هست که از React برای Render گرفتن صفحه استفاده میکنه.
  • هیچ یک از Elementهای تولید شده توسط React در اینستاگرام از ID یا Class ثابت پشتیبانی نمیکنن تا اینجوری جلوی ربات‌هارو بگیرن.
  • هر پست به 3 نوع تقسیم میشه : عکس / ویدئو / گالری

از کجا شروع کردم:

  • تو قدم اول لازم بود تا بتونم به DOM دسترسی داشته باشم واسه همین به کتابخونه‌ای احتیاج داشتم تا بتونه با React یا هر کتابخونه دیگه‌ای که از js برای Render گرفتن استفاده میکنه، کار کنه بعد از یکم جستجو رسیدم به Selenium که حتی توانایی این رو داره تا مرورگر شما رو باز کنه و همه کارهایی که میخواد رو به صورت ویژوال روی مرورگر انجام بده.
  • قدم بعدی پیدا کردن الگو بود که به اجبار باید XPATH استفاده میکنم تا بتونم به Element که میخوام دسترسی داشته باشم.
  • قدم سوم تشخص نوع پست بود که با پیدا کردن الگو هر یکی از مدل تا حدودی میتونستم تشخیص بدم با چه نوع پستی روبه‌رو هستم
  • و اما قدم آخر دانلود اون فایل بود که متاسفانه اینستاگرام به ربات‌ها اجازه‌ی دسترسی و باز کردن آدرس فایل‌ها رو نمیده واسه همین مجبور شدم گولش بزنم و از UserAgent جعلی برای دسترسی به آدرس‌ها استفاده کنم.

یک گالری حرفه‌ای:

موقعی که داشتم رو بخش گالری کار میکردم تا بتونم فایل‌های این مدل پست هارو هم دانلود کنم یه چیز خیلی ناجوانمردانه دیدم و اونم این بود که تو نسخه وب اگه یک پس شامل 6 عکس باشه در Render اولیه فقط 2 عکس اول داخل DOM قرار داده میشن و باقی عکس‌ها یا ویدئو‌ها با جابه‌جا کردن اسلاید به DOM اضافه میشن و باقی مجدد پاک میشن در واقع در هر لحظه شما تنها با 3 Item دسترسی دارید. که خوشبختانه Selenium این قابلیت رو داره که عملکرد کلیک رو روی دکمه‌ها اعمال کنه پس کافی بود با یه الگوریتمی تو زمان‌های مشخص اسلاید رو جابه‌جا کنم تا به سایر Item ها هم دسترسی داشته باشم.

حرف آخر:

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

راستی به گیت‌هاب پروژه هم سر بزنید.

https://github.com/amirzenoozi/insta-downloader


برنامه نویسیپایتونpythonprogramming
برنامه نویس Front-End ، علاقه مند به جاوا اسکریپت و پایتون که گاهی وقتا هم طراحی میکنه.
شاید از این پست‌ها خوشتان بیاید