>  기사  >  웹 프론트엔드  >  타사 오픈 소스 라이브러리를 사용하여 노드에서 웹사이트 크롤링 기능을 구현하는 방법에 대해 이야기해 보겠습니다.

타사 오픈 소스 라이브러리를 사용하여 노드에서 웹사이트 크롤링 기능을 구현하는 방법에 대해 이야기해 보겠습니다.

青灯夜游
青灯夜游앞으로
2021-12-17 19:11:152169검색

이 글에서는 타사 오픈 소스 라이브러리를 사용하여 node에서 웹사이트 크롤링 기능을 쉽게 구현하는 방법을 소개하겠습니다.

타사 오픈 소스 라이브러리를 사용하여 노드에서 웹사이트 크롤링 기능을 구현하는 방법에 대해 이야기해 보겠습니다.

nodejs웹사이트 크롤링 기능 구현

타사 라이브러리 소개

  • 네트워크 요청 캡슐화 요청

  • jQuery의 Cheerio 노드 버전

  • mkdirp는 여러 레이어를 생성합니다. 폴더 디렉터리

구현 아이디어

  • 요청을 통해 지정된 URL의 콘텐츠를 가져옵니다request获取指定 url 内容

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

  • 通过mkdirp创建目录

  • 通过fs

  • cheerio를 통해 페이지에서 점프 찾기 > 경로(삭제)

mkdirp를 통해 디렉터리 생성

fs를 통해 파일 생성하고 읽은 내용을

Get it? 액세스 경로에 대해 위 단계를 반복하세요코드 구현

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);

Summary

🎜🎜🎜homeUrl을 크롤링하려는 웹사이트로 변경해 보세요. 🎜🎜노드 관련 지식을 더 보려면 🎜nodejs 튜토리얼🎜을 방문하세요! ! 🎜

위 내용은 타사 오픈 소스 라이브러리를 사용하여 노드에서 웹사이트 크롤링 기능을 구현하는 방법에 대해 이야기해 보겠습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 juejin.cn에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제