اليوم ، دعنا نتعلم البرنامج التعليمي للزاحف لـ Alsotang ونزحف ببساطة cnode.
إنشاء مشروع Craelr-Demo
نقوم أولاً بإنشاء مشروع Express ثم حذف جميع محتويات ملفات App.js ، لأننا لا نحتاج إلى عرض المحتوى على جانب الويب في الوقت الحالي. بالطبع ، يمكننا أيضًا استخدام وظيفة Express التي نحتاجها بواسطة npm install express مباشرة في مجلد فارغ.
تحليل الموقع المستهدف
كما هو موضح في الشكل ، هذا جزء من علامة DIV على الصفحة الرئيسية CNODE. نستخدم هذه السلسلة من المعرفات والفئات لتحديد الموقع الذي نحتاجه.
استخدم SuperAgent للحصول على بيانات المصدر
SuperAgent هي مكتبة HTTP المستخدمة من قبل API AJAX. يتم استخدامه بشكل مشابه مع jQuery ، والتي نبدأ من خلالها طلب الحصول على النتيجة في وظيفة رد الاتصال.
نسخة الكود كما يلي:
var express = require ('Express') ؛
var url = require ('url') ؛ // تحليل عنوان URL للعملية
var superagent = require ('superagent') ؛ // لا تنسَ تثبيت NPM
var cheeseio = require ('Cheerio') ؛
var eventproxy = require ('eventProxy') ؛
var targeturl = 'https://cnodejs.org/' ؛
superagent.get (Targeturl)
.end (وظيفة (err ، الدقة) {
console.log (res) ؛
}) ؛
نتيجة RES هي كائن يحتوي على معلومات عنوان URL الهدف ، ومحتوى موقع الويب موجود بشكل أساسي في نصه (السلسلة).
استخدم Cheatio لتحليل
يعمل Cheerio كدالة jQuery من جانب الخادم. نستخدم أولاً .Load () لتحميل HTML ، ثم تصفية العناصر من خلال محدد CSS.
نسخة الكود كما يلي:
var $ = cheeseio.load (res.text) ؛
// تصفية البيانات من خلال محدد CSS
$ ('#topic_list .topic_title'). كل (دالة (idx ، element) {
console.log (element) ؛
}) ؛
والنتيجة هي كائن ، ويتم استدعاء وظيفة .each(function(index, element)) للتكرار من خلال كل كائن ، ويتم إرجاع عناصر DOM HTML.
نتيجة الإخراج console.log($element.attr('title')); هو广州2014年12月06日NodeParty 之UC 场
بالنسبة للألقاب مثل هذا ، الإخراج console.log($element.attr('href')); والنتيجة هي عنوان URL مثل /topic/545c395becbcb78265856eb2 . ثم استخدم وظيفة url.resolve () من nodejs1 لإكمال عنوان URL الكامل.
نسخة الكود كما يلي:
superagent.get (Turl)
.end (وظيفة (err ، الدقة) {
إذا (خطأ) {
إرجاع console.error (err) ؛
}
var topicurls = [] ؛
var $ = cheeseio.load (res.text) ؛
// احصل على جميع الروابط على الصفحة الرئيسية
$ ('#topic_list .topic_title'). كل (دالة (idx ، element) {
var $ element = $ (element) ؛
var href = url.resolve (turl ، $ element.attr ('href')) ؛
console.log (HREF) ؛
//topicurls.push(href) ؛
}) ؛
}) ؛
استخدم eventproxy لتزحقل المحتوى بشكل متزامن من كل موضوع
يوضح البرنامج التعليمي أمثلة على الأساليب المتداخلة العميقة (المسلسل) وطرق المضادة. يستخدم EventProxy طرق الحدث (الموازي) لحل هذه المشكلة. بعد اكتمال كل الزحف ، سيقوم EventProxy تلقائيًا بالاتصال بوظيفة المعالجة عندما يتلقى رسالة الحدث.
نسخة الكود كما يلي:
// الخطوة 1: احصل على مثيل لـ EventProxy
var ep = new eventProxy () ؛
// الخطوة 2: تحديد وظيفة رد الاتصال التي تستمع إلى الأحداث.
// بعد أن يتم تكرار الطريقة
.
ep.after ('topic_html' ، topicurls.length ، function (touths) {
// الموضوعات عبارة عن صفيف يحتوي على 40 زوجًا في EP.emit ('topic_html' ، زوج) 40 مرة
//.رسم خريطة
الموضوعات = thispics.map (وظيفة (TopicPair) {
// استخدم Cheerio
var topicurl = topicPair [0] ؛
var topichtml = topicpair [1] ؛
var $ = cheeseio.load (topichtml) ؛
يعود ({
العنوان: $ ('. topic_full_title'). text (). trim () ،
HREF: Topicurl ،
Comment1: $ ('. reply_content'). Eq (0) .Text (). trim ()
}) ؛
}) ؛
//حصيلة
console.log ('النتيجة:') ؛
console.log (موضوعات) ؛
}) ؛
// الخطوة 3: تحديد إصدار رسائل الأحداث
Topicurls.foreach (وظيفة (topicurl) {
superagent.get (topicurl)
.end (وظيفة (err ، الدقة) {
console.log ('fetch' + topicurl + 'success') ؛
ep.emit ('topic_html' ، [topicurl ، res.Text]) ؛
}) ؛
}) ؛
النتائج كما يلي
تمارين ممتدة (التحديات)
احصل على اسم المستخدم والنقاط
ابحث عن اسم فئة المستخدم للتعليق في الكود المصدري لصفحة المقالة ، و ClassName هو الرد _author. console.log العنصر الأول $('.reply_author').get(0) أننا بحاجة إلى الحصول على الأشياء هنا.
أولاً ، يمكننا الزحف إلى مقال والحصول على كل ما نحتاجه في وقت واحد.
نسخة الكود كما يلي:
var userHref = url.Resolve (turl ، $ ('. reply_author'). get (0) .attribs.href) ؛
console.log (userHref) ؛
console.log ($ ('. reply_author'). get (0). children [0] .Data) ؛
يمكننا الحصول على معلومات النقاط من خلال https://cnodejs.org/user/username
نسخة الكود كما يلي:
$ ('. reply_author'). كل (دالة (idx ، عنصر) {
var $ element = $ (element) ؛
console.log ($ element.attr ('href')) ؛
}) ؛
في صفحة معلومات المستخدم $('.big').text().trim() هي معلومات النقاط.
استخدم وظيفة cheatio.get (0) للحصول على العنصر الأول.
نسخة الكود كما يلي:
var userHref = url.Resolve (turl ، $ ('. reply_author'). get (0) .attribs.href) ؛
console.log (userHref) ؛
هذا مجرد زحف لمقال واحد ، ولا يزال هناك بعض الأشياء التي يجب تعديلها لـ 40 مقالة.