ไอเดียพื้นฐาน
Origin: Master: เริ่มต้นจากหน้าหนึ่งของ Wikipedia (เช่นหน้าเรือบรรทุกเครื่องบิน (คีย์) ค้นหาเป้าหมายทั้งหมดที่มีคีย์ (เรือบรรทุกเครื่องบิน) ในแอตทริบิวต์ชื่อของลิงค์และเพิ่มลงในคิวที่จะรวบรวมข้อมูลในขณะนี้ Traversal ของความกว้างของชั้นเรียนเพื่อให้งานนี้เสร็จสมบูรณ์
IDEA 2 (Origin: Cat): รวบรวมข้อมูลโดยการจำแนกประเภท โปรดทราบว่าใน Wikipedia หมวดหมู่เริ่มต้นด้วยหมวดหมู่: เนื่องจาก Wikipedia มีโครงสร้างเอกสารที่ดีจึงเป็นเรื่องง่ายที่จะเริ่มต้นด้วยหมวดหมู่ใด ๆ และรวบรวมข้อมูลทุกหมวดหมู่ด้านล่างเสมอ อัลกอริทึมนี้แยกหมวดหมู่ย่อยสำหรับหน้าการจำแนกและคว้าหน้าทั้งหมดด้านล่างแบบขนาน มันเร็วและสามารถบันทึกโครงสร้างการจำแนกประเภทได้ แต่ในความเป็นจริงมีหน้าซ้ำหลายหน้า แต่สามารถประมวลผลได้ง่ายโดยการเขียนสคริปต์ในระยะต่อมา
การเลือกห้องสมุด
ฉันเริ่มต้องการใช้ JSDOM แม้ว่าฉันจะรู้สึกว่ามันมีพลัง แต่ก็ค่อนข้าง "หนัก" สิ่งที่ร้ายแรงที่สุดคือเอกสารคำอธิบายไม่ดีพอ ฉันพูดถึงข้อดีของมันเท่านั้น แต่ไม่มีคำอธิบายที่ครอบคลุม ดังนั้นหากคุณเปลี่ยนเป็น Cheerio มันมีน้ำหนักเบาและมีฟังก์ชั่นที่ค่อนข้างสมบูรณ์ อย่างน้อยคุณก็สามารถมีแนวคิดที่ครอบคลุมได้อย่างรวดเร็ว ในความเป็นจริงหลังจากทำมันฉันรู้ว่าไม่จำเป็นต้องมีห้องสมุดเลยและคุณสามารถทำทุกอย่างด้วยการแสดงออกปกติ! ฉันเพิ่งเขียนความสม่ำเสมอเล็กน้อยในห้องสมุด
ประเด็นสำคัญ
การตั้งค่าตัวแปรส่วนกลาง:
var regkey = ['เรือบรรทุกเครื่องบิน', 'เรือบรรทุกเครื่องบิน', 'เรือบรรทุกเครื่องบิน']; // หากคำหลักรวมอยู่ในลิงค์มันเป็นเป้าหมาย var allkeys = []; // ชื่อของลิงค์ยังเป็นตัวระบุหน้าเว็บหลีกเลี่ยงการรวบรวมข้อมูลซ้ำ ๆ ของคีย์ var = ['หมวดหมู่:%e8%88%aa%e7%a9%ba%e6%af%8d%e8%88%b0']; // รอคิวหน้าเริ่มต้น
ดาวน์โหลดรูปภาพ
ใช้การดำเนินการสตรีมมิ่งของไลบรารีคำขอเพื่อให้การดำเนินการดาวน์โหลดแต่ละครั้งเป็นการปิด ให้ความสนใจกับผลข้างเคียงที่เป็นไปได้ของการดำเนินงานแบบอะซิงโครนัส นอกจากนี้ชื่อภาพจะต้องรีเซ็ต ในตอนแรกฉันใช้ชื่อเดิม ด้วยเหตุผลบางอย่างภาพบางภาพมีอยู่อย่างชัดเจน แต่ไม่สามารถแสดงได้ และแอตทริบิวต์ SRCSET จะต้องถูกล้างมิฉะนั้นจะไม่สามารถแสดงพื้นผิวดั้งเดิมได้
$ = cheer.load (downhtml); var rshtml = $ .html (); var imgs = $ ('#bodycontent .image'); // รูปภาพได้รับการแก้ไขโดยสไตล์นี้สำหรับ (img ใน imgs) {ถ้า (typeof imgs [img] .attribs === 'undefined' || typeof imgs [img] .attribs.href === 'ไม่ได้กำหนด') imgs [img]. เด็ก [0] .attribs.src; // ที่อยู่รูปภาพ var dirs = picurl.split ('.'); var filename = achedir+uuid.v1 ()+'.'+dirs [dir.length -1]; // เปลี่ยนชื่อคำขอ ("https:"+picurl) .pipe (fs.createwritestream ('หน้า/'+ชื่อไฟล์)); // ดาวน์โหลด rshtml = rshtml.replace (picurl, ชื่อไฟล์); // แทนที่เส้นทางท้องถิ่น // console.log (picurl); -ลำดับความสำคัญที่กว้าง
ในตอนแรกฉันไม่เข้าใจแนวคิดเรื่องการเกิดแบบอะซิงโครนัสอย่างเต็มที่และทำมันในวง ฉันคิดว่าการใช้คำสัญญาได้ถูกแปลงเป็นซิงโครไนซ์แล้ว แต่ในความเป็นจริงมันทำให้มั่นใจได้ว่าการดำเนินการที่มอบให้กับสัญญาจะดำเนินการอย่างเป็นระเบียบและการดำเนินการเหล่านี้ไม่สามารถสั่งการดำเนินการอื่น ๆ ได้! ตัวอย่างเช่นรหัสต่อไปนี้ไม่ถูกต้อง
var keys = ['Aircraft Carrier']; var key = keys.shift (); ในขณะที่ (key) {data.get ({url: encodeuri (key), qs: null}) จากนั้น (ฟังก์ชั่น (downhtml) {... keys.push (key); // (1)}); // (2)}การดำเนินการข้างต้นเป็นเรื่องปกติ แต่ในความเป็นจริง (2) จะทำงานระหว่าง (1)! จะทำอย่างไร?
ฉันใช้การเรียกซ้ำเพื่อแก้ปัญหานี้ รหัสตัวอย่างต่อไปนี้:
var key = keys.shift (); (ฟังก์ชั่น Donext (key) {data.get ({url: key, qs: null}). จากนั้น (ฟังก์ชั่น (downhtml) {... keys.push (href); ... keys.shift () {donext (keys) })})(สำคัญ);การทำความสะอาดเป็นประจำ
ใช้นิพจน์ทั่วไปเพื่อทำความสะอาดรหัสหน้าไร้ประโยชน์เนื่องจากมีรูปแบบมากมายที่จะประมวลผลดังนั้นฉันจึงเขียนลูปเพื่อประมวลผลอย่างสม่ำเสมอ
var regs = [/<link rel =/"stylesheet/" href =/"? [^/"]*/">/g,/<script> regs.foreach (ฟังก์ชั่น (rs) {var mactches = rshtml.match (rs); สำหรับ (var i = 0; i <mactches.length; i ++) {rshtml = rshtml.replace (mactches [i], mactches [i] href = "wiki '+(i+1)+'. css" ':' ');}})เอฟเฟกต์การทำงาน
ฉันต้องการ FQ ใน Wiki Chinese ฉันลองและคว้าการจำแนกประเภทเรือบรรทุกเครื่องบิน ในระหว่างการดำเนินการฉันพบลิงก์ที่เกี่ยวข้องประมาณ 300 ลิงก์ (รวมถึงหน้าการจำแนกประเภทฉันใช้ลิงก์ที่ถูกต้องเท่านั้นและไม่ได้ดาวน์โหลด) ในที่สุดฉันก็ดาวน์โหลด 209 อย่างถูกต้อง ฉันทดสอบลิงก์ข้อผิดพลาดด้วยตนเองและพบว่าพวกเขาเป็นลิงค์ที่ไม่ถูกต้อง มันแสดงให้เห็นว่ารายการยังไม่ได้รับการจัดตั้งขึ้น กระบวนการทั้งหมดใช้เวลาน้อยกว่าสิบห้านาที หลังจากการบีบอัดมันเกือบสามสิบม. และรู้สึกว่าเอฟเฟกต์นั้นค่อนข้างดี
รหัสต้นฉบับ
https://github.com/zhoutk/wikispider
สรุป
เมื่อถึงเวลาที่ฉันทำภารกิจให้เสร็จเมื่อคืนนี้ Idea 1 สามารถรวบรวมข้อมูลหน้าเว็บด้วยเนื้อหาที่ค่อนข้างแม่นยำและหน้าไม่ได้ทำซ้ำ แต่ประสิทธิภาพการรวบรวมข้อมูลไม่สูงและไม่สามารถรับข้อมูลลับได้อย่างถูกต้อง Idea 2 สามารถรวบรวมข้อมูลและจัดเก็บไฟล์โดยอัตโนมัติในหมวดหมู่ตาม Wikipedia ซึ่งมีประสิทธิภาพสูง (การวัดจริงการคลาน [เรือรบ] และการรวบรวมข้อมูลทั้งหมดเกือบ 6,000 หน้าซึ่งใช้เวลาประมาณ 50 นาทีและสามารถรวบรวมข้อมูลได้อย่างแม่นยำ
กำไรที่ยิ่งใหญ่ที่สุดคือความเข้าใจอย่างลึกซึ้งเกี่ยวกับการควบคุมกระบวนการโดยรวมของการเขียนโปรแกรมแบบอะซิงโครนัส