วันนี้มาเรียนรู้การสอนตัวรวบรวมข้อมูลของ Alsotang และคลาน cnode
สร้างโครงการ Craelr-Demo
ก่อนอื่นเราสร้างโครงการด่วนจากนั้นลบเนื้อหาทั้งหมดของไฟล์ App.js เพราะเราไม่จำเป็นต้องแสดงเนื้อหาบนเว็บในช่วงเวลานั้น แน่นอนเรายังสามารถใช้ฟังก์ชั่นด่วนที่เราต้องการโดย npm install express โดยตรงในโฟลเดอร์ว่าง
การวิเคราะห์เว็บไซต์เป้าหมาย
ดังที่แสดงในรูปนี้เป็นส่วนหนึ่งของแท็ก div ในหน้าแรกของ Cnode เราใช้รหัสและคลาสนี้เพื่อค้นหาข้อมูลที่เราต้องการ
ใช้ superagent เพื่อรับข้อมูลต้นฉบับ
SuperAgent เป็นไลบรารี HTTP ที่ AJAX API ใช้ มันถูกใช้เช่นเดียวกันกับ jQuery ซึ่งเราเริ่มร้องขอ GET ส่งออกผลลัพธ์ในฟังก์ชั่นการโทรกลับ
การคัดลอกรหัสมีดังนี้:
var express = ต้องการ ('ด่วน');
var url = ต้องการ ('url'); // แยกวิเคราะห์ URL การดำเนินการ
var superagent = ต้องการ ('superagent'); // อย่าลืมการติดตั้ง NPM
var cheeseio = ต้องการ ('cheerio');
var eventProxy = ต้องการ ('eventProxy');
var targetUrl = 'https://cnodejs.org/';
superagent.get (TargetUrl)
.end (ฟังก์ชั่น (err, res) {
console.log (res);
-
ผลลัพธ์ RES เป็นวัตถุที่มีข้อมูล URL เป้าหมายและเนื้อหาเว็บไซต์ส่วนใหญ่อยู่ในข้อความ (สตริง)
ใช้ Cheatio เพื่อแยกวิเคราะห์
Cheerio ทำหน้าที่เป็นฟังก์ชั่น jQuery ฝั่งเซิร์ฟเวอร์ ก่อนอื่นเราใช้. load () เพื่อโหลด HTML จากนั้นกรององค์ประกอบผ่านตัวเลือก CSS
การคัดลอกรหัสมีดังนี้:
var $ = cheeseio.load (res.text);
// ตัวกรองข้อมูลผ่านตัวเลือก CSS
$ ('#topic_list .topic_title'). แต่ละ (ฟังก์ชั่น (idx, องค์ประกอบ) {
console.log (องค์ประกอบ);
-
ผลลัพธ์คือวัตถุและฟังก์ชั่ .each(function(index, element)) ถูกเรียกไปที่ซ้ำผ่านแต่ละวัตถุและองค์ประกอบ HTML DOM จะถูกส่งกลับ
ผลลัพธ์ของ Output 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, res) {
ถ้า (err) {
return console.error (err);
-
var topicurls = [];
var $ = cheeseio.load (res.text);
// รับลิงก์ทั้งหมดในหน้าแรก
$ ('#topic_list .topic_title'). แต่ละ (ฟังก์ชั่น (idx, องค์ประกอบ) {
var $ 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: กำหนดฟังก์ชั่นการโทรกลับที่รับฟังเหตุการณ์
// หลังจากวิธีการฟังซ้ำแล้วซ้ำอีก
// params: EventName (String) ชื่อเหตุการณ์, เวลา (หมายเลข) จำนวนฟัง, ฟังก์ชันการโทรกลับ
ep.after ('topic_html', topicurls.length, function (หัวข้อ) {
// หัวข้อคืออาร์เรย์ที่มี 40 คู่ใน ep.emit ('topic_html', pair) 40 ครั้ง
//.แผนที่
หัวข้อ = topic.map (ฟังก์ชั่น (Topicpair) {
// ใช้ Cheerio
var topicurl = topicpair [0];
var topichtml = topicpair [1];
var $ = cheeseio.load (topichtml);
กลับ ({
ชื่อเรื่อง: $ ('. topic_full_title'). text (). trim (),
Href: หัวข้อ
ความคิดเห็น 1: $ ('. Reply_content'). eq (0) .Text (). trim ()
-
-
// ผลลัพธ์
console.log ('ผลลัพธ์:');
console.log (หัวข้อ);
-
// ขั้นตอนที่ 3: กำหนดรีลีสของข้อความเหตุการณ์
Topicurls.foreach (ฟังก์ชั่น (topicurl) {
superagent.get (topicurl)
.end (ฟังก์ชั่น (err, res) {
console.log ('fetch' + topicurl + 'ประสบความสำเร็จ');
EP.EMIT ('topic_html', [topicurl, res.text]);
-
-
ผลลัพธ์มีดังนี้
แบบฝึกหัดขยาย (ความท้าทาย)
รับชื่อผู้ใช้และคะแนน
ค้นหาชื่อคลาสผู้ใช้ของความคิดเห็นในซอร์สโค้ดของหน้าบทความและชื่อคลาสคือ Reply_author console.log องค์ประกอบแรก $('.reply_author').get(0) สามารถเห็นได้ว่าเราต้องได้รับสิ่งต่าง ๆ ทั้งหมดที่นี่
ก่อนอื่นเราสามารถรวบรวมข้อมูลบทความและรับทุกสิ่งที่เราต้องการในครั้งเดียว
การคัดลอกรหัสมีดังนี้:
var userhref = url.resolve (turl, $ ('. Reply_author'). รับ (0) .attribs.href);
console.log (userhref);
console.log ($ ('. Reply_author') รับ (0). เด็ก [0] .data);
เราสามารถคว้าคะแนนคะแนนผ่าน https://cnodejs.org/user/username
การคัดลอกรหัสมีดังนี้:
$ ('. Reply_author') แต่ละ (ฟังก์ชั่น (idx, องค์ประกอบ) {
var $ element = $ (องค์ประกอบ);
console.log ($ element.attr ('href'));
-
ในหน้าข้อมูลผู้ใช้ $('.big').text().trim() เป็นข้อมูลคะแนน
ใช้ฟังก์ชั่นของ Cheatio Get (0) เพื่อรับองค์ประกอบแรก
การคัดลอกรหัสมีดังนี้:
var userhref = url.resolve (turl, $ ('. Reply_author'). รับ (0) .attribs.href);
console.log (userhref);
นี่เป็นเพียงการรวบรวมข้อมูลบทความเดียวและยังมีบางสิ่งที่ต้องแก้ไขสำหรับ 40 บทความ