خزیدن در یک وب‌سایت و شروع به استخراج اطلاعات اون، یکی از کارهای ساده و جذابیه که می‌شه با استفاده از Node . js انجام داد. من توی یکی از پروژه‌های خودم، نیاز به دانلود تلفظ صحیح کلمات انگلیسی از سایت دیکشنری آنلاین داشتم، تصمیم گرفتم که این ابزار کوچک رو تحت عنوان یک پروژه آموزشی در اختیار بقیه قرار بدم. این پروژه از طریق مخزن در دسترس هست و اگر فکر می‌کنید این آموزش برای شما ساده هست، می‌تونید کد نهایی رو در اختیار داشته باشید. کتابخانه‌های استفاده شده برای توسعه این ابزار، نیاز به دو کتابخانه اساسی جهت خزیدن در وب‌سایت و دانلود محتوا خواهیم داشت که هریک به شرح زیر هستند: با استفاده از این کتابخانه، می‌تونیم درخواست‌های HTTP ارسال کنیم و جوابی که از سمت سرور ارسال می‌شه رو دریافت کنیم پس حتما متوجه شدید که این کتابخانه به ما کمک می‌کنه که سورس HTML سایت رو دریافت کنیم تا بتونیم محتوای داخل یک صفحه رو بخونیم. این کتابخانه که API هایی شبیه به jQuery داره به شما کمک می‌کنه تا به المنت‌های مختلف در صفحه با استفاده از Selector هایی شبیه به آنچه که در jQuery داشتیم، دست پیدا کنیم. دست به عمل بشیم. در ابتدا و طبق عادت خودم، ترمینال رو باز می‌کنیم و دستور ایجاد یک پروژه npm رو می‌زنیم: با استفاده از دستور فوق، یک فایل در پوشه‌ای که هستید ایجاد می‌شه باید دو کتابخانه‌ای که قبلا اسم بردم رو نصب کنیم، پس در ادامه در محیط ترمینال می‌نویسم: کمی صبر می‌کنیم تا کتابخانه‌ها نصب بشه. یک فایل با اسم (یا هر اسمی که خودتون دوست دارید) بسازید و کدهای زیر رو کپی و پیست کنید: خب جای هیچ نگرانی‌ای برای گیج شدن نیست! قسمت به قسمت کدها رو توضیح می‌دیم تا ببینیم هر قسمت چه کاری رو انجام می‌ده! خب، به این قسمت از کد توجه کنید که در حال تعریف چندین متغیر هستیم: متغیرهای، و هرکدام برای فراخوانی کتابخانه‌های خودشون هستند. با استفاده از کتابخانه‌های path و fs که همراه با Node . js هست، مسیر ذخیره فایل و خود عملیات ذخیره‌سازی فایل‌های دانلود شده را - به‌ترتیب - انجام می‌دیم. متغیرهای و هم در واقع selector های المانی‌هایی هستند که قرار است فایل تلفظ لغت را از آن‌ها استخراج کنیم. در ادامه بیشتر توضیح خواهم داد. اینکه چطور می‌خوایم دیتایی که لازم داریم را از سایت لانگمن استخراج کنیم، به این شکل هست: فرض کنیم می‌خوایم تلفظ لغت را دانلود کنیم. اگر این لغت داخل سایت جستجو بشه، می‌بینید که URL به این شکل هست: چند نکته باید در رابطه با URL لغات توجه کنیم اول اینکه لغت‌های ترکیبی با خط تیره جدا شده و دوم، تمامی حروف لغت‌ها بصورت کوچک ( lowercase ) نوشته شده‌اند. پس باید در ابتدا یک فانکشنی رو تعریف کنیم که کار استاندارسازی (یا اصطلاحا normalize کردن) را برای ما انجام بده، پس به این صورت تعریف می‌کنیم: حالا اگر URL بالا را باز کنید و کمی به پایین اسکرول کنید، می‌بینید که دو تا آیکون بلندگو (استقلالی و پرسپولیسی) هست که استقلالی تلفظ آمریکایی و پرسپولیسی تلفظ بریتانیایی هر لغت رو نشون می‌ده. اگر از ابزار inspect element مرورگر استفاده کنید، می‌بینید که هر کدام از این‌ها یک تگ به شکل زیر هستند: دو attribute مهم در این تگ وجود داره یکی و دیگری class . با استفاده از اولی می‌تونیم URL فایل صوتی رو بدست بیاریم و با استفاده از دومی می‌شه حین خزیدن در داخل سایت بهش اشاره کنیم و اون رو به اصطلاح select کنیم. پس باید متوجه شده باشید که دو متغیر و برای چی تعریف شدند! قسمت بعد کار، نیاز داریم تا یک دانلودر برای URL فایل صوتی ما بنویسیم در واقع، یک فانکشن که لینک و اسم فایل بعنوان ورودی بگیره، و فایل رو برای ما ذخیره کنه. پس قسمت بعدی از کد به این شکل تعریف شده: در ابتدای این کد، ابتدا چک می‌کنیم که اگر مسیری که قرار هست فایل اونجا ذخیره بشه وجود نداره (فولدرش موجود نباشه) اول فولدر رو ایجاد کنه. بعد از اون، با استفاده از ماژول، درخواست به URL ارسال می‌کنیم و محتوا رو دانلود می‌کنیم. آخرین فانکشن مورد نیاز ما، فانکشن هست که کارهای اصلی قرار هست در اینجا رخ بده به این شکل تعریف می‌کنیم: در این فانکشن، ابتدا درخواست به سایت لانگمن ارسال می‌کنیم تا محتوای سایت (سورس HTML ) رو دریافت کنیم این کار رو با استفاده از ماژول انجام می‌دیم. پس از آن، از ماژول استفاده می‌کنیم تا سورس HTML رو داخل متغیر $ لود کنیم و class هایی که قبل‌تر در متغیرهای و ذخیره کردیم را با استفاده از پیدا و به محتوای دسترسی پیدا کنیم. در نهایت، با استفاده از فانکشن، فایل‌ها را دانلود می‌کنیم. حالا که همه چیز آماده هست، با استفاده از محیط CLI ، لغت کاربر را دریافت و اقدام به دانلود تلفظ صوتی می‌کنیم، پس کافیه از این به بعد دستور پایین رو بزنیم تا فایل‌ها دانلود بشه: به جای کلمه می‌تونید کلمه مورد نظر خودتون رو قرار بدید.