کراولر چیست و چگونه یک نمونه از آن بسازیم

سلام دوستان، در این آموزش کوتاه قصد دارم بخشی از تجربه خودمو در ساخت یک کراولر به عنوان بخشی از برنامه ام به اشتراک بگذارم...

پروژه من بخشی در داشبورد برای مشتریان داره که لینک مطالب مرتبط با کارشون رو ازشون دریافت میکنه و باز سمتی به دیگر افراد خلاصه ای از لینک وارد شده رو نشون میده.

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

خوب حالا برای جاوا اسکریپت و NodeJS ساخت یک کرولر ساده رو بررسی میکنیم:

«بنظر نویسنده یکی بودن زبان جی اس و سی اس اس با زبانی که در ساخت ساخت سایت ها استفاده میشه و ویژگی اسنکرون بودن مزیت خوبی برای کار با نود جی اس در این بخشه»

کتابخانه CHEERIO قوی و انعطاف پذیر برای کراولر هست که میتونید از NPM دریافتش کنید. این کتابخانه با دریافت یک سورس سایت «HTML» بهتون اجازه میده تا با سلکتور های جی کوئری - سی اس اس بخشی از سایت رو انتخاب کنید.

const cheerio = require('cheerio')
const $ = cheerio.load('<h2 >Hello world</h2>')'

در قطعه کد بالا ابتدا کتابخانه به پروژه اضافه شده و در خط بعد سورس HTML رو در کتابخانه لود کرده است.

خوب ما نمیخوایم که سورس رو به صورت دستی به کتابخانه بدیم...! پس باید از کتابخانه request که در NodeJS به صورت پیش فرض وجود داره استفاده کنیم. شما میتونید از Axios یا کتابخانه های مشابه هم استفاده کنید.

const request = require('request');
request(url, (err, res, body) => {
 const $ = cheerio.load(body);
 let post = {};
 post.title = $('title').text();
 post.image = $("meta[property='og:image']").attr("content");
 post.text = $("meta[property='description']").attr("content");
});

در مثال بالا پس از اینکه آدرس متغیر url دریافت میشه، محتوی اون در متد load قرار میگیره. و با استفاده از سلکتور های جی کوئری-سی اس اس خلاصه ای از محتوی پست موجود در صفحه در ابجکت post قرار میگیره.

پ.ن: اگه یکم خلاقیت به خرج بدید با کراول کردن مرحله به مرحله «برای اماده کردن لیست آدرس ها»، یا پیدا کردن الگو در آدرس های سایت مورد نظر محتوی خوبی رو جمع آوری کنید.

پ.ن2: کراول کردن وبسایت ها معمولا محدودیت داره و پس از یک تعداد خاصی درخواست دیگه نمیتونید درخواست بفرستید که اونجا پراکسی ها خیلی کمکتون خواهد کرد.

امیدوارم فرصتی بشه و درمورد مباحث پیشرفته تر هم صحبت کنیم... موفق باشید.