CRMEB开源商城系统,开源无加密+免费商用+文档齐全+二开便捷:免费下载
系统采用前后端分离技术,基于TP6+Uni-app框架开发;
客户移动端采用uni-app开发,管理后台前端使用iviewUI开发;
系统支持微信公众号端、微信小程序端、H5端、PC端多端账号同步,可快速打包生成APP;
nodejs实现网站爬取功能
第三方库介绍
request 对网络请求的封装
cheerio node 版本的 jQuery
mkdirp 创建多层的文件夹目录
实现思路
通过
request
获取指定 url 内容通过
cheerio
找到页面中跳转的路径(去重)通过
mkdirp
创建目录通过
fs
创建文件,将读取的内容写入拿到没有访问的路径重复以上执行步骤
代码实现
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存储已经访问过的路径,避免重复访问const set = new Set([homeUrl]);function grab(url) {// 校验url规范性if (!url) return;// 去空格url = url.trim();// 自动补全url路径if (url.endsWith("/")) {url += "index.html";}const chunks = [];// url可能存在一些符号或者中文,可以通过encodeURI编码request(encodeURI(url)).on("error", (e) => {// 打印错误信息console.log(e);}).on("data", (chunk) => {// 接收响应内容chunks.push(chunk);}).on("end", () => {// 将相应内容转换成文本const html = Buffer.concat(chunks).toString();// 没有获取到内容if (!html) return;// 解析urllet { host, origin, pathname } = new URL(url);pathname = decodeURI(pathname);// 通过cheerio解析htmlconst $ = cheerio.load(html);// 将路径作为目录const dir = path.dirname(pathname);// 创建目录mkdirp.sync(path.join(__dirname, dir));// 往文件写入内容fs.writeFile(path.join(__dirname, pathname), html, "utf-8", (err) => {// 打印错误信息if (err) {console.log(err);return;}console.log(`[${url}]保存成功`);});// 获取到页面中所有a元素const aTags = $("a");Array.from(aTags).forEach((aTag) => {// 获取到a标签中的路径const href = $(aTag).attr("href");// 此处可以校验href的合法或者控制爬去的网站范围,比如必须都是某个域名下的// 排除空标签if (!href) return;// 排除锚点连接if (href.startsWith("#")) return;if (href.startsWith("mailto:")) return;// 如果不想要保存图片可以过滤掉// 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;// 可以根据情况增加更多逻辑let newUrl = "";if (/^https?:\/\//.test(href)) {// 处理绝对路径newUrl = href;} else {// 处理相对路径newUrl = origin + path.join(dir, href);}// 判断是否访问过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);});});}// 开始抓取grab(homeUrl);
登录后复制
总结
简单的网页爬虫就完成了,可以把homeUrl改成自己想要爬取的网站试试。
更多node相关知识,请访问:nodejs 教程!!
以上就是聊聊node中怎么借助第三方开源库实现网站爬取功能的详细内容,更多请关注php中文网其它相关文章!