
วัตถุประสงค์หลักของโปรแกรมรวบรวมข้อมูลคือการรวบรวมข้อมูลเฉพาะบางอย่างที่เปิดเผยต่อสาธารณะบนอินเทอร์เน็ต การใช้ข้อมูลนี้ทำให้เราสามารถวิเคราะห์แนวโน้มและเปรียบเทียบ หรือฝึกโมเดลสำหรับการเรียนรู้เชิงลึก ฯลฯ ในฉบับนี้ เราจะแนะนำแพ็กเกจ 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 เลิกใช้แล้ว จะดีกว่าถ้าเปลี่ยนเป็นไลบรารี่ที่ได้รับการอัปเดตและบำรุงรักษาอยู่ตลอดเวลา
