الغرض الرئيسي من برامج الزحف هو جمع بعض البيانات المحددة المتاحة للجمهور على الإنترنت. باستخدام هذه البيانات، يمكننا تحليل بعض الاتجاهات ومقارنتها، أو تدريب النماذج على التعلم العميق، وما إلى ذلك. في هذه المشكلة، سنقدم حزمة node.js
المستخدمة خصيصًا للزحف على الويب - node-crawler
، وسنستخدمها لإكمال حالة زاحف بسيطة للزحف إلى الصور على صفحات الويب وتنزيلها محليًا.
node-crawler
عبارة عن أداة زاحف node.js
خفيفة الوزن تأخذ في الاعتبار الكفاءة والراحة، وهي تدعم أنظمة الزاحف الموزعة والتشفير الثابت ووكلاء الواجهة الأمامية http. علاوة على ذلك، فهو مكتوب بالكامل بلغة nodejs
ويدعم بطبيعته عمليات الإدخال والإخراج غير المتزامنة غير المحظورة، مما يوفر راحة كبيرة لآلية تشغيل خط أنابيب الزاحف. وفي الوقت نفسه، فهو يدعم الاختيار السريع لـ DOM
(يمكنك استخدام بناء جملة jQuery
)، والتي يمكن القول إنها ميزة رائعة لمهمة الزحف إلى أجزاء معينة من صفحات الويب، وليست هناك حاجة لكتابة التعبيرات العادية بخط اليد. مما يحسن كفاءة تطوير الزاحف.
، نقوم أولاً بإنشاء مشروع جديد وإنشاء ملف Index.js كملف إدخال.
ثم قم بتثبيت مكتبة الزاحف node-crawler
.
#PNPM إضافة الزاحف pnpm #NPM npm i -S الزاحف #غزل قم بإضافة الزاحف
ثم استخدمه require
.
//index.js const Crawler = require("crawler");
//index.js دع الزاحف = الزاحف الجديد({ المهلة: 10000، مسج: صحيح، }) وظيفة الحصول على الصور (أوري) { قائمة انتظار الزاحف({ أوري, رد الاتصال: (خطأ، دقة، تم) => { إذا (أخطأ) أخطأ؛ } }) }
من الآن فصاعدًا، سنبدأ في كتابة طريقة للحصول على صورة صفحة html بعد إنشاء crawler
، ويتم استخدامها بشكل أساسي لكتابة الروابط وطرق رد الاتصال في قائمة الانتظار الخاصة به. سيتم استدعاء وظيفة رد الاتصال هذه بعد معالجة كل طلب.
وتجدر الإشارة هنا أيضًا إلى أن Crawler
يستخدم مكتبة request
، لذا فإن قائمة المعلمات المتاحة لتكوين Crawler
هي مجموعة شاملة من معلمات مكتبة request
، أي أن جميع التكوينات في مكتبة request
قابلة للتطبيق على Crawler
.
ربما رأيت أيضًا معلمة jQuery
الآن، لقد خمنت ذلك بشكل صحيح، حيث يمكنها استخدام بناء جملة jQuery
لالتقاط عناصر DOM
.
//index.js السماح للبيانات = [] وظيفة الحصول على الصور (أوري) { قائمة انتظار الزاحف({ أوري, رد الاتصال: (خطأ، دقة، تم) => { إذا (أخطأ) أخطأ؛ دع $ = res.$; يحاول { دع $imgs = $("img"); Object.keys($imgs).forEach(index => { دع img = $imgs[index]; const { النوع، الاسم، السمات = {} } = img; Let src = attribs.src ||. إذا (اكتب === "علامة" && src && !data.includes(src)) { دع fileSrc = src.startsWith('http') ? دع اسم الملف = src.split("/")[src.split("/").length-1] downloadFile(fileSrc, fileName) // كيفية تنزيل الصور data.push(src) } }); } قبض (ه) { console.error(e); منتهي() } منتهي()؛ } }) }
يمكنك أن ترى أنك استخدمت $
للتو لالتقاط علامة img
في الطلب. ثم نستخدم المنطق التالي لمعالجة الرابط إلى الصورة المكتملة وإزالة الاسم بحيث يمكن حفظه وتسميته لاحقًا. يتم تعريف المصفوفة هنا أيضًا، والغرض منها هو حفظ عنوان الصورة الملتقطة. إذا تم العثور على نفس عنوان الصورة في الالتقاط التالي، فلن تتم معالجة التنزيل بشكل متكرر.
فيما يلي المعلومات المطبوعة باستخدام $("img")
لالتقاط HTML لصفحة Nuggets الرئيسية:
تنزيل الصورة،
نحتاج إلى تثبيت حزمة nodejs
- axios
. نعم، لقد قرأتها بشكل صحيح. لا يتم توفير axios
للواجهة الأمامية فحسب، بل يمكن استخدامه أيضًا للواجهة الخلفية. ولكن نظرًا لأن تنزيل الصور يحتاج إلى معالجته في دفق بيانات، فسيتم تعيين responseType
على stream
. ثم يمكنك استخدام طريقة pipe
لحفظ ملف تدفق البيانات.
const { default: axios } = require("axios"); const fs = require('fs'); وظيفة غير متزامنة downloadFile(uri, name) { دع دير = "./imgs" إذا (!fs.existsSync(دير)) { في انتظار fs.mkdirSync(دير) } دع filePath = `${dir}/${name}` دعونا الدقة = ننتظر أكسيوس({ عنوان URL: أوري، نوع الاستجابة: "دفق" }) دع ws = fs.createWriteStream(filePath) res.data.pipe(ws) res.data.on("إغلاق",()=>{ ws.Close(); }) }
لأنه قد يكون هناك الكثير من الصور، لذلك إذا كنت تريد وضعها في مجلد واحد، فأنت بحاجة إلى تحديد ما إذا كان هناك مثل هذا المجلد، وإذا لم يكن الأمر كذلك، فقم بإنشاء واحد. ثم استخدم طريقة createWriteStream
لحفظ دفق البيانات الذي تم الحصول عليه في المجلد في شكل ملف.
ثم يمكننا تجربتها، على سبيل المثال، نلتقط الصورة ضمن HTML لصفحة Nuggets الرئيسية:
//index.jsبعد تنفيذ
getImages("https://juejin.cn/")،
يمكنك أن تجد أن جميع الصور الموجودة في ملف HTML الثابت قد تم التقاطها.
عقدة الفهرس.js
الاستنتاج
في النهاية، يمكنك أيضًا أن ترى أن هذا الرمز قد لا يعمل مع SPA (تطبيق الصفحة الواحدة). نظرًا لوجود ملف HTML واحد فقط في تطبيق من صفحة واحدة، ويتم عرض كل المحتوى الموجود على صفحة الويب ديناميكيًا، فإنه يظل كما هو، بغض النظر عن ذلك، يمكنك التعامل مباشرة مع طلب البيانات الخاص به لجمع المعلومات التي تريدها .
شيء آخر يجب قوله هو أن العديد من الأصدقاء يستخدمون request.js
لمعالجة طلبات تنزيل الصور، وهذا ممكن بالطبع، وحتى كمية التعليمات البرمجية أصغر، ومع ذلك، ما أريد قوله هو أن هذه المكتبة قد تم استخدامها بالفعل في عام 2020. تم إهماله، ومن الأفضل التغيير إلى مكتبة يتم تحديثها وصيانتها باستمرار.