در این پست با استفاده از nightmare.js یک اسکریپر که آموزشش رو در اینترنت دیدم و برام جالب بود رو گذاشتم. قرار هست که سایت imdb و لیست صد تا فیلم که بالاترین امتیاز رو دارند رو استخراج کنیم:
اطلاعاتی که قرار هست بگیریم: title,rank, rating, descriptionUrl, posterUrl
برای گرفتن عنوان ها، با استفاده از inspect روی عنوان کلیک میکنیم و با استفاده از copy selector به این میرسیم:
#main > div > span > div > div > div.lister > table > tbody > tr:nth-child(1) > td.titleColumn > a
برای گرفتن همه عنوانها از دو قسمت آخر "td.titleColumn > a" استفاده میکنیم:
حالا نوبت گرفتن rank هست:
#main > div > span > div > div > div.lister > table > tbody > tr:nth-child(1) > td.ratingColumn.imdbRating > strong
که td.ratingColumn.imdbRating کفایت میکنه. تو console هم میتونید نتیجه رو ببینید:
کد اولیه رو تغییر میدیم که از tr شروع کنیم به جای td.title.column چون rank بیرونتر هست و باید یک سطح بالاتر بریم (خط ۸) :
برای rank همون ایندکس i و برای urlDescription هم به روش مشابه بدست می آید:
حالا نوبت به باز کردن لینکهای descrptionUrl هست و استخراج لینک عکسهای مربوطه. یک فانکشن دیگه داریم که خروجی فانکشن قبلی رو که یک آرایه از آبجکتهای هر فیلم هست رو میگیره، بعد لینک های هر فیلم رو میگیره و لینک عکس رو استخراج میکنه و به آبجکت مربوط به اون فیلم اضافه میکنه:
حالا نوبت میرسه به nightmare.js که محتوای لینک عکس که در postUrl داریم، و محتواش کد جاوااسکریپت هست رو با اون رندر کنیم و بعد لینک مورد نظر رو بدست بیاریم:
حال میتونیم فانکشن savePosterImageToDisk رو اضافه کنیم که عکس ها رو دانلود و روی دیسک در فولدر posters ذخیره کنه که در خط ۵۹ استفاده شده:
همینطور که در قسمت سمت چپ میشه دید، عکسها در فولدر posters ذخیره میشوند.
قصدم از این پست نشان دادن یک نمونه از کار اسکریپینگ با جاوااسکریپت بود. کدهای این پست را میتوانید از اینجا پیدا کنید.
تا پست بعدی...