วัตถุประสงค์หลักของโปรแกรมรวบรวมข้อมูลคือการรวบรวมข้อมูลเฉพาะบางอย่างที่เปิดเผยต่อสาธารณะบนอินเทอร์เน็ต การใช้ข้อมูลนี้ทำให้เราสามารถวิเคราะห์แนวโน้มและเปรียบเทียบ หรือฝึกโมเดลสำหรับการเรียนรู้เชิงลึก ฯลฯ ในฉบับนี้ เราจะแนะนำแพ็กเกจ node.js
ที่ใช้สำหรับการรวบรวมข้อมูลเว็บโดยเฉพาะ - node-crawler
และเราจะใช้แพ็กเกจนี้เพื่อกรอกกรณีของโปรแกรมรวบรวมข้อมูลแบบง่ายๆ เพื่อรวบรวมข้อมูลรูปภาพบนหน้าเว็บและดาวน์โหลดในเครื่อง
node-crawler
เป็นเครื่องมือรวบรวมข้อมูล node.js
น้ำหนักเบาที่คำนึงถึงทั้งประสิทธิภาพและความสะดวก โดยรองรับระบบ crawler แบบกระจาย ฮาร์ดโค้ด และเอเจนต์ http ส่วนหน้า ยิ่งไปกว่านั้น มันถูกเขียนขึ้นทั้งหมดใน nodejs
และโดยธรรมชาติแล้วรองรับ IO แบบอะซิงโครนัสที่ไม่บล็อก ซึ่งให้ความสะดวกสบายอย่างมากสำหรับกลไกการทำงานของไปป์ไลน์ของซอฟต์แวร์รวบรวมข้อมูล ในเวลาเดียวกัน รองรับการเลือก DOM
อย่างรวดเร็ว (คุณสามารถใช้ไวยากรณ์ jQuery
) ซึ่งอาจกล่าวได้ว่าเป็นฟีเจอร์นักฆ่าสำหรับงานรวบรวมข้อมูลเฉพาะส่วนของหน้าเว็บ ไม่จำเป็นต้องเขียนนิพจน์ทั่วไปด้วยลายมือ ซึ่งช่วยเพิ่มประสิทธิภาพในการพัฒนาซอฟต์แวร์รวบรวมข้อมูล
ก่อนอื่นเราจะสร้างโปรเจ็กต์ใหม่และสร้าง index.js เป็นไฟล์รายการ
จากนั้นติดตั้งไลบรารี crawler node-crawler
#พน.น pnpm เพิ่มซอฟต์แวร์รวบรวมข้อมูล #นพม โปรแกรมรวบรวมข้อมูล npm i -S #เส้นด้าย เส้นด้ายเพิ่มซอฟต์แวร์รวบรวมข้อมูล
แล้วใช้ require
เพื่อแนะนำมัน
//index.js const Crawler = need("crawler");
// index.js ให้ crawler = crawler ใหม่ ({ หมดเวลา:10,000, jQuery: จริง, - ฟังก์ชั่น getImages (uri) { crawler.คิว({ ยูริ, โทรกลับ: (ผิดพลาด ตอบกลับ เสร็จแล้ว) => { ถ้า (ผิดพลาด) โยนผิดพลาด; - - }
จากนี้ไปเราจะเริ่มเขียนวิธีการรับรูปภาพของหน้า html หลังจากที่ crawler
ได้รับการสร้างอินสแตนซ์แล้ว ส่วนใหญ่จะใช้เพื่อเขียนลิงก์และวิธีการโทรกลับในคิว ฟังก์ชันการโทรกลับนี้จะถูกเรียกหลังจากแต่ละคำขอได้รับการประมวลผล
ควรสังเกตที่นี่ด้วยว่า Crawler
ใช้ไลบรารี request
ดังนั้นรายการพารามิเตอร์ที่พร้อมใช้งานสำหรับการกำหนดค่า Crawler
จึงเป็นชุดที่เหนือกว่าของพารามิเตอร์ของไลบรารี request
กล่าวคือ การกำหนดค่าทั้งหมดในไลบรารี request
ใช้ได้กับ Crawler
บางทีคุณอาจเห็นพารามิเตอร์ jQuery
เมื่อสักครู่นี้ คุณเดาถูกแล้ว มันสามารถใช้ไวยากรณ์ jQuery
เพื่อจับภาพองค์ประกอบ DOM
//index.js ให้ข้อมูล = [] ฟังก์ชั่น getImages (uri) { crawler.คิว({ ยูริ, โทรกลับ: (ผิดพลาด ตอบกลับ เสร็จแล้ว) => { ถ้า (ผิดพลาด) โยนผิดพลาด; ให้ $ = res.$; พยายาม { ให้ $imgs = $("img"); Object.keys($imgs).forEach(ดัชนี => { ให้ img = $imgs[index]; const { ประเภท ชื่อ คุณลักษณะ = {} } = img; ให้ src = attribs.src ||. ถ้า (ประเภท === "แท็ก" && src && !data.includes(src)) { ให้ fileSrc = src.startsWith('http') ? src : `https:${src}` ให้ fileName = src.split("/")[src.split("/").length-1] downloadFile(fileSrc, fileName) // วิธีดาวน์โหลดไฟล์รูปภาพ data.push(src) - - } จับ (e) { console.error(e); เสร็จแล้ว() - เสร็จแล้ว(); - - }
คุณจะเห็นว่าคุณเพิ่งใช้ $
เพื่อจับแท็ก img
ในคำขอ จากนั้นเราจะใช้ตรรกะต่อไปนี้เพื่อประมวลผลลิงก์ไปยังรูปภาพที่เสร็จสมบูรณ์ และตัดชื่อออกเพื่อให้สามารถบันทึกและตั้งชื่อในภายหลังได้ นอกจากนี้ อาร์เรย์ยังถูกกำหนดไว้ที่นี่ โดยมีวัตถุประสงค์เพื่อบันทึกที่อยู่รูปภาพที่บันทึกไว้ หากพบที่อยู่รูปภาพเดียวกันในการจับภาพครั้งถัดไป การดาวน์โหลดจะไม่ได้รับการประมวลผลซ้ำๆ
ต่อไปนี้เป็นข้อมูลที่พิมพ์โดยใช้ $("img")
เพื่อจับภาพ HTML หน้าแรกของนักเก็ต:
จะดาวน์โหลดอิมเมจ
เราจำเป็นต้องติดตั้งแพ็คเกจ nodejs
- axios
ใช่ คุณอ่านถูกต้องแล้ว axios
ไม่ได้มีไว้สำหรับส่วนหน้าเท่านั้น แต่ยังสามารถใช้งานได้ที่ส่วนหลังด้วย แต่เนื่องจากการดาวน์โหลดรูปภาพจำเป็นต้องได้รับการประมวลผลเป็นสตรีมข้อมูล responseType
จึงถูกตั้งค่าเป็น stream
จากนั้นคุณสามารถใช้วิธี pipe
เพื่อบันทึกไฟล์กระแสข้อมูลได้
const { ค่าเริ่มต้น: axios } = ต้องการ ("axios"); const fs = ต้องการ('fs'); ดาวน์โหลดไฟล์ฟังก์ชัน async (uri ชื่อ) { ให้ dir = "./imgs" ถ้า (!fs.existsSync(dir)) { รอ fs.mkdirSync (dir) - ให้ filePath = `${dir}/${name}` ให้ res = รอ axios({ URL: uri, ประเภทการตอบสนอง: 'สตรีม' - ให้ ws = fs.createWriteStream (filePath) res.data.pipe(ws) res.data.on("ปิด",()=>{ ws.ปิด(); - }
เนื่องจากอาจมีรูปภาพจำนวนมาก ดังนั้นหากคุณต้องการรวมไว้ในโฟลเดอร์เดียว คุณต้องพิจารณาว่ามีโฟลเดอร์ดังกล่าวหรือไม่ หากไม่มี ให้สร้างขึ้นใหม่ จากนั้นใช้เมธอด createWriteStream
เพื่อบันทึกสตรีมข้อมูลที่ได้รับไปยังโฟลเดอร์ในรูปแบบของไฟล์
จากนั้นเราก็ลองได้เลย ตัวอย่างเช่น เราจับภาพใต้ html ของหน้าแรกของนักเก็ต:
// index.jsหลังจากดำเนินการ
getImages("https://juejin.cn/")
คุณจะพบว่ารูปภาพทั้งหมดใน html แบบคงที่ได้รับการจับภาพแล้ว
โหนด index.jsใน
ตอน
ท้ายคุณจะเห็นว่าโค้ดนี้อาจใช้ไม่ได้กับ SPA (แอปพลิเคชันหน้าเดียว) เนื่องจากมีไฟล์ HTML เพียงไฟล์เดียวในแอปพลิเคชันหน้าเดียว และเนื้อหาทั้งหมดบนเว็บเพจจึงถูกเรนเดอร์แบบไดนามิก ดังนั้นคุณจึงสามารถจัดการคำขอข้อมูลของไฟล์นั้นได้โดยตรงเพื่อรวบรวมข้อมูลที่คุณต้องการ .
อีกประการหนึ่งคือเพื่อนหลายคนใช้ request.js
เพื่อประมวลผลคำขอดาวน์โหลดรูปภาพ แน่นอนว่าเป็นไปได้ และแม้แต่จำนวนโค้ดก็น้อยกว่า อย่างไรก็ตาม สิ่งที่ฉันต้องการจะพูดก็คือไลบรารีนี้ถูกใช้ไปแล้ว ในปี 2020 เลิกใช้แล้ว จะดีกว่าถ้าเปลี่ยนเป็นไลบรารี่ที่ได้รับการอัปเดตและบำรุงรักษาอยู่ตลอดเวลา