يستمر الكتاب في المرة الأخيرة ، نحتاج إلى تعديل البرنامج لزحف محتوى 40 صفحة على التوالي. وهذا يعني ، نحن بحاجة إلى إخراج العنوان ، والرابط ، والتعليق الأول ، والتعليق نقاط المستخدم والمنتدى لكل مقالة.
كما هو موضح في الشكل ، القيمة التي تم الحصول عليها $('.reply_author').eq(0).text().trim(); هو مستخدم التعليق الأول الصحيح.
{<1>}
بعد الحصول على التعليقات ومحتوى اسم المستخدم في EventProxy ، نحتاج إلى القفز إلى واجهة المستخدم من خلال اسم المستخدم لمواصلة زحف نقاط المستخدم
نسخة الكود كما يلي:
var $ = cheeseio.load (topichtml) ؛
// عنوان URL هذا هو الخطوة التالية لزحف عنوان URL المستهدف
var userHref = 'https://cnodejs.org' + $ ('. reply_author'). Eq (0) .Attr ('href') ؛
userHref = url.resolve (turl ، userHref) ؛
var title = $ ('. topic_full_title'). text (). trim (). استبدال (// n/g ، "") ؛؛
var href = topicurl ؛
var comment1 = $ ('. reply_content'). Eq (0) .Text (). trim () ؛
var uptor1 = $ ('. reply_author'). eq (0) .Text (). trim () ؛
// تمرير المعلمات إلى الزحف المتزامن التالي
ep.emit ('user_html' ، [userhref ، title ، href ، comment1 ، uplud1]) ؛
في EventProxy هذه المرة ، نريد العثور على مكان وضع النتيجة (class = "big").
{<2>}
فقط ابحث عن اسم الفصل ، دعنا نحاول إخراج النتيجة أولاً
نسخة الكود كما يلي:
VAR النتيجة = superagent.get (userurl)
.end (وظيفة (err ، الدقة) {
إذا (خطأ) {
إرجاع console.error (err) ؛
}
var $ = cheeseio.load (res.text) ؛
var score = $ ('. big'). text (). trim () ؛
console.log (المستخدم [1]) ؛
console.log (user [2]) ؛
console.log (المستخدم [3]) ؛
console.log (المستخدم [4]) ؛
console.log ($ ('. big'). text (). trim ()) ؛
يعود ({
العنوان: المستخدم [1] ،
HREF: المستخدم [2] ،
تعليق 1: المستخدم [3] ،
المؤلف 1: المستخدم [4] ،
SCORE1: النتيجة
}) ؛
}) ؛
}) ؛
قم بتشغيل البرنامج ويتم الحصول على النتيجة بواسطة هذا الرمز.
{<3>}
لكن المشكلة هي أنه يمكننا إخراج النتيجة بشكل صحيح في وظيفة رد الاتصال لـ .end () ، لكن لا يمكننا إخراج النتيجة بشكل صحيح. إذا نظرت عن كثب ، فإن الإخراج الذي يحتاج إلى الإخراج هو كائن طلب. هذا بسبب الأخطاء الإهمال. لا تمر الدالة .end () قيمة الإرجاع إلى كائن الطلب ، وتحتاج إلى إرجاع النتيجة إلى الطبقة السابقة (المستخدمين).
نسخة الكود كما يلي:
// العثور على userDetails
ep.after ('user_html' ، topicurls.length ، function (users) {
المستخدمون = user.map (function (user) {
var userurl = user [0] ؛
درجة var ؛
superagent.get (userurl)
.end (وظيفة (err ، الدقة) {
إذا (خطأ) {
إرجاع console.error (err) ؛
}
//console.log(res.text) ؛
var $ = cheeseio.load (res.text) ؛
النتيجة = $ ('. big'). text (). trim () ؛
}) ؛
يعود ({
العنوان: المستخدم [1] ،
HREF: المستخدم [2] ،
تعليق 1: المستخدم [3] ،
المؤلف 1: المستخدم [4] ،
SCORE1: النتيجة
}) ؛
}) ؛
تصدير المستخدمين بشكل جيد وتجد أنه بخلاف Score1 هي القيم الصحيحة. بعد تصحيح الأخطاء الدقيقة ، وجدت أن البرنامج قام أولاً بإجراء Console.log () ثم يؤدي .map (). بتعبير أدق ، ضمن دالة .map () ، لا تكمل وظيفة رد الاتصال .get () درجة المهمة ، ويتم تنفيذ قيمة الإرجاع. هذه هي وظيفة رد الاتصال غير المتزامن ، ولن تنتظر العملية المتزامنة الخارجية وظيفة رد الاتصال لإكمال العملية.
{<4>}
تتمثل مقاربي في إصدار طبقة أخرى من الرسائل ، وتمرير البيانات المطلوبة إلى عملية الاستقبال إلى جانب الرسالة. بعد () ، فقط عند استلام جميع الرسائل ، سيتم طباعة المعلمات التي تم تمريرها (النتيجة).
نسخة الكود كما يلي:
Score = $ ('. big') text (). trim () ؛
// أضيفت حديثا
ep.emit ('got_score' ، [user [1] ، user [2] ، user [3] ، user [4] ، score]) ؛
.....
ep.after ('got_score' ، 10 ، وظيفة (المستخدمين) {
console.log (المستخدمين) ؛
}) ؛
{<6>}
تم حل هذه المشكلة ، ولكن يبدو أن قيمة Score1 كبيرة جدًا. بعد البحث مرة أخرى ، اتضح أن هناك فئة = "كبيرة" ، ومجموعة موضوع المستخدم تنتمي أيضًا إلى هذه الفئة. يتعين علينا قطع العنصر الأول من خلال Cheerio's .slice (start ، [end]) وتعديل النتيجة إلى تسجيل = $ ('. big'). شريحة (0) .eq (0) .Text (). trim () ؛. وتظهر النتيجة الصحيحة في الشكل.
{<7>}