الدليل النهائي لكشط الويب باستخدام Node.js

إذن ما هو تجريف الويب على أي حال؟ إنه ينطوي على أتمتة المهمة الشاقة المتمثلة في جمع المعلومات من مواقع الويب.

هناك الكثير من حالات الاستخدام لكشط الويب: قد ترغب في جمع الأسعار من مواقع التجارة الإلكترونية المختلفة لموقع مقارنة الأسعار. أو ربما تحتاج إلى أوقات الرحلات وقوائم الفنادق / AirBNB لموقع السفر. ربما ترغب في جمع رسائل البريد الإلكتروني من أدلة مختلفة لعملاء المبيعات المحتملين ، أو استخدام البيانات من الإنترنت لتدريب نماذج التعلم الآلي / الذكاء الاصطناعي. أو قد ترغب في إنشاء محرك بحث مثل Google!

يعد البدء في تجريف الويب أمرًا سهلاً ، ويمكن تقسيم العملية إلى قسمين رئيسيين:

  • الحصول على البيانات باستخدام مكتبة طلبات HTML أو متصفح بدون رأس ،
  • وتحليل البيانات للحصول على المعلومات الدقيقة التي تريدها.

سيرشدك هذا الدليل خلال العملية باستخدام وحدة الوعد بالطلب Node.js الشهيرة و CheerioJS و Puppeteer. من خلال العمل من خلال الأمثلة الواردة في هذا الدليل ، ستتعلم جميع النصائح والحيل التي تحتاجها لتصبح محترفًا في جمع أي بيانات تحتاجها مع Node.js!

سنجمع قائمة بجميع أسماء وأعياد ميلاد رؤساء الولايات المتحدة من ويكيبيديا وعناوين جميع المنشورات على الصفحة الأولى من Reddit.

أول الأشياء أولاً: لنقم بتثبيت المكتبات التي سنستخدمها في هذا الدليل (سيستغرق تثبيت Puppeteer بعض الوقت لأنه يحتاج إلى تنزيل Chromium أيضًا).

تقديم طلبك الأول

بعد ذلك ، لنفتح ملفًا نصيًا جديدًا (قم بتسمية الملف potusScraper.js) ، واكتب وظيفة سريعة للحصول على HTML لصفحة "قائمة الرؤساء" في ويكيبيديا.

انتاج:

باستخدام Chrome DevTools

رائع ، لقد حصلنا على HTML الخام من صفحة الويب! لكننا الآن بحاجة إلى فهم هذه النقطة العملاقة من النص. للقيام بذلك ، سنحتاج إلى استخدام Chrome DevTools للسماح لنا بالبحث بسهولة عبر HTML لصفحة الويب.

يعد استخدام Chrome DevTools أمرًا سهلاً: ما عليك سوى فتح Google Chrome ، والنقر بزر الماوس الأيمن على العنصر الذي ترغب في كشطه (في هذه الحالة ، أقوم بالنقر بزر الماوس الأيمن على George Washington ، لأننا نريد الحصول على روابط لجميع صفحات ويكيبيديا الخاصة بالرؤساء الفرديين) :

الآن ، ما عليك سوى النقر فوق فحص ، وسيقوم Chrome بعرض جزء DevTools الخاص به ، مما يتيح لك فحص مصدر HTML للصفحة بسهولة.

تحليل HTML باستخدام Cheerio.js

رائع ، Chrome DevTools يعرض لنا الآن النمط الدقيق الذي يجب أن نبحث عنه في الكود (علامة "كبيرة" مع ارتباط تشعبي بداخلها). دعنا نستخدم Cheerio.js لتحليل HTML الذي تلقيناه سابقًا لإعادة قائمة الروابط لصفحات ويكيبيديا الفردية لرؤساء الولايات المتحدة.

انتاج:

نتحقق للتأكد من أنه تم إرجاع 45 عنصرًا بالضبط (عدد رؤساء الولايات المتحدة) ، مما يعني عدم وجود أي علامات "كبيرة" مخفية إضافية في أي مكان آخر على الصفحة. الآن ، يمكننا الانتقال والحصول على قائمة روابط لجميع صفحات ويكيبيديا الرئاسية البالغ عددها 45 صفحة عن طريق الحصول عليها من قسم "السمات" لكل عنصر.

انتاج:

الآن لدينا قائمة بجميع صفحات ويكيبيديا الرئاسية البالغ عددها 45 صفحة. لنقم بإنشاء ملف جديد (يسمى potusParse.js) ، والذي سيحتوي على وظيفة لأخذ صفحة رئاسية على Wikipedia وإرجاع اسم الرئيس وتاريخ ميلاده. أول الأشياء أولاً ، دعنا نحصل على HTML الخام من صفحة جورج واشنطن في ويكيبيديا.

انتاج:

دعنا نستخدم Chrome DevTools مرة أخرى للعثور على بنية الكود الذي نريد تحليله ، حتى نتمكن من استخراج الاسم وتاريخ الميلاد باستخدام Cheerio.js.

لذلك نرى أن الاسم موجود في فصل دراسي يسمى "FirstHeading" وأن عيد الميلاد موجود في فصل دراسي يسمى "bday". دعونا نعدل الكود الخاص بنا لاستخدام Cheerio.js لاستخراج هاتين الفئتين.

انتاج:

ضع كل شيء معا

في احسن الاحوال! الآن دعنا نختتم هذا في دالة ونصدرها من هذه الوحدة.

لنعد الآن إلى ملف potusScraper.js الأصلي ونطلب الوحدة potusParse.js. سنقوم بعد ذلك بتطبيقه على قائمة wikiUrls التي جمعناها سابقًا.

انتاج:

تقديم صفحات JavaScript

هاهو! قائمة بأسماء وأعياد ميلاد جميع الرؤساء الخمسة والأربعين للولايات المتحدة. يجب أن يسمح لك استخدام وحدة طلب-وعد و Cheerio.js بكشط الغالبية العظمى من المواقع على الإنترنت.

ومع ذلك ، بدأت العديد من المواقع مؤخرًا في استخدام JavaScript لإنشاء محتوى ديناميكي على مواقع الويب الخاصة بهم. يتسبب هذا في حدوث مشكلة في طلب الوعد ومكتبات طلبات HTTP الأخرى المماثلة (مثل axios و fetch) ، لأنهم يحصلون فقط على الاستجابة من الطلب الأولي ، لكنهم لا يستطيعون تنفيذ JavaScript بالطريقة التي يستطيع بها متصفح الويب.

وبالتالي ، لكشط المواقع التي تتطلب تنفيذ JavaScript ، نحتاج إلى حل آخر. في مثالنا التالي ، سنحصل على عناوين جميع المنشورات على الصفحة الأولى من Reddit. دعونا نرى ما يحدث عندما نحاول استخدام وعد -طلب كما فعلنا في المثال السابق.

انتاج:

إليك ما يبدو عليه الإخراج:

هممم ... ليس تمامًا ما نريده. ذلك لأن الحصول على المحتوى الفعلي يتطلب منك تشغيل JavaScript على الصفحة! مع محرك الدمى ، هذه ليست مشكلة.

Puppeteer هي وحدة جديدة شائعة للغاية يقدمها لك فريق Google Chrome والتي تتيح لك التحكم في متصفح بدون رأس. هذا مثالي لكشط الصفحات التي تتطلب تنفيذ JavaScript برمجيًا. دعنا نحصل على HTML من الصفحة الأولى لـ Reddit باستخدام Puppeteer بدلاً من وعد الطلب.

انتاج:

لطيف! الصفحة مليئة بالمحتوى الصحيح!

الآن يمكننا استخدام Chrome DevTools كما فعلنا في المثال السابق.

يبدو أن Reddit يضع العناوين داخل علامات "h2". دعنا نستخدم Cheerio.js لاستخراج علامات h2 من الصفحة.

انتاج:

مصادر إضافية

وهذه القائمة! في هذه المرحلة ، يجب أن تشعر بالراحة في كتابة أول مكشطة ويب لجمع البيانات من أي موقع ويب. إليك بعض الموارد الإضافية التي قد تجدها مفيدة أثناء رحلة تجريف الويب:

  • قائمة بخدمات بروكسي تجريف الويب
  • قائمة أدوات تجريف الويب اليدوية
  • قائمة نصائح تجريف الويب
  • مقارنة بروكسيات تجريف الويب
  • توثيق Cheerio
  • وثائق محرك العرائس