الأفكار الأساسية
الأصل: Master: بدءًا من فئة معينة من Wikipedia (مثل صفحة حامل الطائرات (المفتاح) ، واكتشف جميع الأهداف التي تحتوي على مفتاح (حامل الطائرات) في سمة عنوان الرابط ، وإضافتها إلى قائمة الانتظار المراد زحفها. اجتياز اتساع الفصل لإكمال هذه المهمة.
الفكرة 2 (الأصل: القط): الزحف حسب التصنيف. لاحظ أنه على ويكيبيديا ، تبدأ الفئات بالفئة:. نظرًا لأن Wikipedia لديها هيكل مستند جيد ، فمن السهل البدء بأي فئة ودائمًا يزحف جميع الفئات الموجودة أسفله. تستخرج هذه الخوارزمية التصنيفات الفرعية لصفحات التصنيف والاستيلاء على جميع الصفحات الموجودة أسفلها بالتوازي. إنه سريع ويمكنه حفظ بنية التصنيف ، ولكن في الواقع هناك العديد من الصفحات المكررة ، ولكن يمكن معالجتها بسهولة عن طريق كتابة نص في المرحلة اللاحقة.
اختيار المكتبة
بدأت أرغب في استخدام jsdom. على الرغم من أنني شعرت أنها كانت قوية ، إلا أنها كانت "ثقيلة" أيضًا. أخطر شيء هو أن وثيقة التفسير لم تكن جيدة بما فيه الكفاية. لقد ذكرت فقط مزاياه ، لكن لم يكن لدي تفسير شامل. لذلك ، إذا تغيرت إلى Cheerio ، فهي خفيفة الوزن ولديها وظائف كاملة نسبيا. على الأقل يمكنك الحصول على مفهوم شامل في لمحة. في الواقع ، بعد القيام بذلك ، أدركت أنه لا توجد حاجة للمكتبات على الإطلاق ، ويمكنك أن تفعل كل شيء مع تعبيرات منتظمة! لقد كتبت للتو القليل من الانتظام في المكتبة.
النقاط الرئيسية
إعدادات المتغير العالمي:
var regkey = ['' Aircraft Carrier "،" Carrier Aircraft "،" Carrier Aircraft "] ؛ // إذا تم تضمين الكلمات الرئيسية في الرابط ، فهو الهدف var allkeys = [] ؛ . // في انتظار قائمة الانتظار ، ابدأ الصفحة
تنزيل الصورة
استخدم عملية دفق مكتبة الطلب لجعل كل عملية تنزيل تشكل إغلاقًا. انتبه إلى الآثار الجانبية المحتملة للعمليات غير المتزامنة. بالإضافة إلى ذلك ، يجب إعادة تعيين اسم الصورة. في البداية ، أخذت الاسم الأصلي. لبعض الأسباب ، توجد بعض الصور بوضوح ، لكن لا يمكن عرضها ؛ ويجب مسح سمة SRCSET ، وإلا لا يمكن عرض السطح الأصلي.
$ = cheer.load (downhtml) ؛ var rshtml = $ .html () ؛ var imgs = $ ('#bodycontent .image') ؛ // يتم تعديل الصور من خلال هذا النمط لـ (IMG في IMGs) {if (typeof imgs [img] .attribs === 'undefined' || typeof imgs [img] .attribs.href === 'undefined') {} IMGs [IMG]. // عنوان الصورة var dirs = picurl.split ('.') ؛ VAR FILENAME = riledir+uuid.v1 ()+'.'+dirs [dir.length -1] ؛ // request request ("https:"+picurl) .pipe (fs.createwRiteStream ('pages/'+filename)) ؛ // download rshtml = rshtml.replace (picurl ، filename) ؛ // استبدال المسار المحلي // console.log (picurl) ؛ }}اتساع أولوية اجتياز
في البداية ، لم أفهم تمامًا مفهوم التزامن وفعلت ذلك في حلقة. اعتقدت أنه تم تحويل استخدام الوعد بالفعل إلى تزامن ، ولكن في الواقع ، يضمن فقط أن يتم تنفيذ العمليات التي تم تسليمها للوعد بطريقة منظمة ، ولا يمكن طلب هذه العمليات مع عمليات أخرى! على سبيل المثال ، الرمز التالي غير صحيح.
مفاتيح var = ['' Aircraft Carrier '] ؛ var key = keys.shift () ؛ بينما (مفتاح) {data.get.get ({url: encodeuri (key) ، qs: null}). // (2)}العملية أعلاه طبيعية ، ولكن في الواقع (2) سيتم تشغيل بين (1)! ما يجب القيام به؟
لقد استخدمت عودة لحل هذه المشكلة. رمز المثال التالي:
var key = keys.shift () ؛ (function denxt (key) {data.get ({url: key ، qs: null}). })})(مفتاح)؛تنظيف منتظم
استخدم تعبيرات منتظمة لتنظيف رمز الصفحة عديمة الفائدة ، لأن هناك العديد من الأنماط التي يجب معالجتها ، لذلك كتبت حلقة لمعالجةها بشكل موحد.
var regs = [/<link rel =/"stylesheet/" href =/"؟ [^/"]*/">/g ،/<script>؟ regs.foreach (function (rs) {var mactches = rshtml.match (rs) ؛ for (var i = 0 ؛ i <mactches.length ؛ i ++) {rshtml = rshtml.replace (mactches [i] ، mactches [i] href = "wiki '+(i+1)+'. css": '') ؛تأثير الجري
أحتاج إلى FQ على ويكي الصينية. جربته وأمسكت بتصنيف حاملة الطائرات. أثناء العملية ، وجدت حوالي 300 رابط مرتبط (بما في ذلك صفحات التصنيف. لقد أخذت روابط صالحة فقط ولم أقم بتنزيلها). أخيرًا ، قمت بتنزيل 209 بشكل صحيح. لقد اختبرت يدويًا بعض روابط الأخطاء ووجدت أنها كانت روابط غير صالحة. وأظهرت أن الدخول لم يتم تأسيسه بعد. استغرقت العملية برمتها حوالي خمسة عشر دقيقة. بعد الضغط ، كان ما يقرب من ثلاثين م وشعرت أن التأثير كان جيدًا.
رمز المصدر
https://github.com/zhoutk/wikispider
ملخص
بحلول الوقت الذي أكملت فيه المهمة بشكل أساسي الليلة الماضية ، يمكن لـ Idea 1 أن يزحف صفحات بمحتوى دقيق نسبيًا ، ولا تتكرر الصفحات ، لكن كفاءة الزحف ليست عالية ، ولا يمكن الحصول على المعلومات المصنفة بدقة ؛ يمكن لـ Idea 2 أن يزحف وتخزين الملفات محليًا في الفئات وفقًا لـ Wikipedia ، وهو أمر فعال للغاية (القياس الفعلي ، والزحف [الحربية] ، والزحف ما يقرب من 6000 صفحة في المجموع ، والذي يستغرق حوالي 50 دقيقة ، ويمكن أن يزحف أكثر من 100 صفحة في الدقيقة في الدقيقة) ، ويمكن أن ينقذ بدقة المعلومات المبوبة.
أكبر مكسب هو فهم عميق للتحكم العام للعملية للبرمجة غير المتزامنة.