本篇文章給大家介紹一下node中借助第三方開(kāi)源庫(kù)輕松實(shí)現(xiàn)網(wǎng)站爬取功能的方法,希望對(duì)大家有所幫助!
十多年的同心網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開(kāi)發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。成都營(yíng)銷網(wǎng)站建設(shè)的優(yōu)勢(shì)是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整同心建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無(wú)論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。成都創(chuàng)新互聯(lián)從事“同心網(wǎng)站設(shè)計(jì)”,“同心網(wǎng)站推廣”以來(lái),每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。nodejs實(shí)現(xiàn)網(wǎng)站爬取功能第三方庫(kù)介紹
request 對(duì)網(wǎng)絡(luò)請(qǐng)求的封裝
cheerio node 版本的 jQuery
mkdirp 創(chuàng)建多層的文件夾目錄
實(shí)現(xiàn)思路
通過(guò)request獲取指定 url 內(nèi)容
通過(guò)cheerio找到頁(yè)面中跳轉(zhuǎn)的路徑(去重)
通過(guò)mkdirp創(chuàng)建目錄
通過(guò)fs創(chuàng)建文件,將讀取的內(nèi)容寫(xiě)入
拿到?jīng)]有訪問(wèn)的路徑重復(fù)以上執(zhí)行步驟
代碼實(shí)現(xiàn)
const fs = require("fs");const path = require("path");const request = require("request");const cheerio = require("cheerio");const mkdirp = require("mkdirp");// 定義入口urlconst homeUrl = "https://www.baidu.com";// 定義set存儲(chǔ)已經(jīng)訪問(wèn)過(guò)的路徑,避免重復(fù)訪問(wèn)const set = new Set([homeUrl]);function grab(url) { // 校驗(yàn)url規(guī)范性 if (!url) return; // 去空格 url = url.trim(); // 自動(dòng)補(bǔ)全url路徑 if (url.endsWith("/")) { url += "index.html"; } const chunks = []; // url可能存在一些符號(hào)或者中文,可以通過(guò)encodeURI編碼 request(encodeURI(url)) .on("error", (e) => { // 打印錯(cuò)誤信息 console.log(e); }) .on("data", (chunk) => { // 接收響應(yīng)內(nèi)容 chunks.push(chunk); }) .on("end", () => { // 將相應(yīng)內(nèi)容轉(zhuǎn)換成文本 const html = Buffer.concat(chunks).toString(); // 沒(méi)有獲取到內(nèi)容 if (!html) return; // 解析url let { host, origin, pathname } = new URL(url); pathname = decodeURI(pathname); // 通過(guò)cheerio解析html const $ = cheerio.load(html); // 將路徑作為目錄 const dir = path.dirname(pathname); // 創(chuàng)建目錄 mkdirp.sync(path.join(__dirname, dir)); // 往文件寫(xiě)入內(nèi)容 fs.writeFile(path.join(__dirname, pathname), html, "utf-8", (err) => { // 打印錯(cuò)誤信息 if (err) { console.log(err); return; } console.log(`[${url}]保存成功`); }); // 獲取到頁(yè)面中所有a元素 const aTags = $("a"); Array.from(aTags).forEach((aTag) => { // 獲取到a標(biāo)簽中的路徑 const href = $(aTag).attr("href"); // 此處可以校驗(yàn)href的合法或者控制爬去的網(wǎng)站范圍,比如必須都是某個(gè)域名下的 // 排除空標(biāo)簽 if (!href) return; // 排除錨點(diǎn)連接 if (href.startsWith("#")) return; if (href.startsWith("mailto:")) return; // 如果不想要保存圖片可以過(guò)濾掉 // if (/\\.(jpg|jpeg|png|gif|bit)$/.test(href)) return; // href必須是入口url域名 let reg = new RegExp(`^https?:\\/\\/${host}`); if (/^https?:\\/\\//.test(href) && !reg.test(href)) return; // 可以根據(jù)情況增加更多邏輯 let newUrl = ""; if (/^https?:\\/\\//.test(href)) { // 處理絕對(duì)路徑 newUrl = href; } else { // 處理相對(duì)路徑 newUrl = origin + path.join(dir, href); } // 判斷是否訪問(wèn)過(guò) if (set.has(newUrl)) return; if (newUrl.endsWith("/") && set.has(newUrl + "index.html")) return; if (newUrl.endsWith("/")) newUrl += "index.html"; set.add(newUrl); grab(newUrl); }); });}// 開(kāi)始抓取grab(homeUrl);總結(jié)
簡(jiǎn)單的網(wǎng)頁(yè)爬蟲(chóng)就完成了,可以把homeUrl改成自己想要爬取的網(wǎng)站試試。
更多node相關(guān)知識(shí),請(qǐng)?jiān)L問(wèn):nodejs 教程??!
網(wǎng)站欄目:聊聊node中怎么借助第三方開(kāi)源庫(kù)實(shí)現(xiàn)網(wǎng)站爬取功能
鏈接URL:http://www.rwnh.cn/article32/cpecpc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站導(dǎo)航、小程序開(kāi)發(fā)、品牌網(wǎng)站設(shè)計(jì)、品牌網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)公司、企業(yè)建站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容