阅读 210

node轻松实现网页爬取功能

前言

node 借助第三方开源库轻松实现网站爬取功能。

第三方库介绍

  1. request 对网络请求的封装

  2. cheerio node 版本的 jQuery

  3. mkdirp 创建多层的文件夹目录

实现思路

  1. 通过request获取指定 url 内容

  2. 通过cheerio找到页面中跳转的路径(去重)

  3. 通过mkdirp创建目录

  4. 通过fs创建文件,将读取的内容写入

  5. 拿到没有访问的路径重复以上执行步骤

代码实现

const fs = require("fs"); const path = require("path"); const request = require("request"); const cheerio = require("cheerio"); const mkdirp = require("mkdirp"); // 定义入口url const 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;       // 解析url       let { host, origin, pathname } = new URL(url);       pathname = decodeURI(pathname);       // 通过cheerio解析html       const $ = 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改成自己想要爬取的网站试试。有疑问可以加我微信交流:rjjs1221


作者:赠前端
链接:https://juejin.cn/post/7041498451477004324

文章分类
代码人生
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐