Amirali Yaghoutiمهندس ارشد نرم‌افزار

مطالعه موردی مهندسی

اتوماسیون موجودی Excel دیجی‌کالا

چک‌کردن دستیِ چند هزار محصول با آگهی‌هایشان در مارکت‌پلیس، کاری است که هیچ‌کس بار دوم تمامش نمی‌کند. بخش جالب مهندسی‌اش هم اسکرپینگ نیست؛ این است که یک اجرای طولانی را دوام‌پذیر کنی: کش می‌کند، پیشرفت را همان لحظه لاگ می‌کند، و می‌شود وسط کار متوقفش کرد و بعد ادامه داد.

مسئله تجاری

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

آنچه تحویل دادم

  • یک پایپ‌لاین پایتون که فایل موجودی را با pandas می‌خواند و یک فایل وضعیت بیرون می‌دهد؛ ورودی و خروجی هر دو همان فرمتی‌اند که تیم عملیات با آن کار می‌کند.
  • یک کش JSON ماندگار از هر جست‌وجو. همین است که اجرا را ادامه‌پذیر می‌کند، نه از-اول-شروع‌شدنی.
  • یک CSV پیشرفت فقط-افزودنی که در حین اجرا نوشته می‌شود؛ نتیجه‌ی ناقص از وقفه سالم بیرون می‌آید و می‌شود اجرا را همان وسط پایید.
  • مسیر مرورگر با Playwright برای آگهی‌هایی که رندر لازم دارند، و requests و BeautifulSoup برای بقیه.
  • راهبرد جست‌وجو و تأیید: اول تطبیق دقیق اسلاگ، بعد فالبک جست‌وجو، به‌جای اعتماد به یک مسیر واحد.
  • فاصله‌ی تصادفی بین درخواست‌ها؛ اسکرپری که به مارکت‌پلیس فشار بیاورد بلاک می‌شود و آن‌وقت کل اجرا هدر رفته.
  • یک مهر نسخه در سورس، تا هر فایل خروجی به همان منطقی که ساختش وصل بماند.

رویکرد فنی

  • کش، تصمیم اصلی طراحی است. هر محصول حل‌شده بلافاصله روی دیسک نوشته می‌شود و همین، یک اجرای شکننده‌ی چندساعته را به چیزی تبدیل می‌کند که هر وقت خواستی قطعش کنی.
  • پیشرفت به فایل افزوده می‌شود، نه اینکه در حافظه جمع شود و آخر کار یک‌جا نوشته شود. کرش در ۹۰ درصد باید فقط آخرین محصول را ببرد، نه کل اجرا را.
  • دو راه دریافت، نه یکی: اول مسیر ارزان HTTP و مرورگر فقط جایی که واقعاً لازم است. بالاآوردن مرورگر برای تک‌تک محصول‌ها اجرا را غیرممکن می‌کرد.
  • تطبیق فرض نمی‌شود، تأیید می‌شود. اول اسلاگ دقیق و اگر نشد فالبک جست‌وجو؛ تطبیق غلطی که مطمئن به نظر برسد از نبودِ تطبیق بدتر است.
  • تأخیرهای تصادفی اینجا شرط درستی‌اند نه ادب. اجرای بلاک‌شده داده‌ی بد می‌دهد، نه داده‌ی کند.

نتیجه و شواهد

تطبیق از یک پروژه تبدیل به یک اجرا شد. خروجی یک فایل وضعیت است که تیم عملیات مستقیم بازش می‌کند، و به‌لطف کش، اجرای دوباره بعد از یک شکست نیمه‌کاره چند دقیقه خرج دارد نه چند ساعت.

اهمیت برای کارفرما

فرق اینجاست: بررسی‌ای که چون دردسر دارد فصلی انجام می‌شود، و بررسی‌ای که هر وقت لازم شد انجام می‌شود.

خلاصه-اجرایی-پروژه

خلاصه اجرایی خوانا

خلاصه_اجرایی {
  پروژه: "Digikala Excel Inventory Automation"
  پشته: "Python، pandas، requests، BeautifulSoup، Playwright"
  ورودی_خروجی: "اکسل موجودی می‌آید، اکسل وضعیت بیرون می‌رود"
  ادامه‌پذیری: "کش JSON ماندگار + CSV پیشرفت فقط-افزودنی،
             نوشته‌شده در حین اجرا"
  دریافت: "اول HTTP؛ مرورگر headless فقط جایی که لازم است"
  تطبیق: "اول اسلاگ دقیق، بعد فالبک جست‌وجو، با تأیید"
  فاصله‌گذاری: "تأخیر تصادفی؛ اجرای بلاک‌شده داده‌ی بد است"
  ردیابی: "نسخه‌ی وصله در سورس مهر خورده"
}

ارزش حرفه‌ای این پروژه

چیزی که دوست دارم دیده شود، ادامه‌پذیری است. اسکرپینگ را هر کسی می‌نویسد؛ طراحی یک جاب طولانی طوری که وقفه ارزان تمام شود، تعیین می‌کند این ابزار بار دوم هم استفاده می‌شود یا نه.

ترجیح‌دادن مسیر ارزان دریافت و رفتن سراغ مرورگر فقط در صورت نیاز، همان منطق است که روی هزینه پیاده شده.