서버/Node

NodeJS axios cheerio xlsx

realtrynna 2022. 4. 18. 15:03

NodeJS axios cheerio xlsx

- 실무에서 간혹 기획자가 엑셀 파일에 데이터를 담아 크롤링을 요청할 경우가 있다.

- 웹 사이트마다 보안이 다르지만 봇을 검사하지 않는 경우 axios/cheerio 조합으로 크롤링 할 수 있다.

- axios로 요청을 보내고 결과를 cheerio로 받아 xlsx로 데이터를 넣는다.

 

사용 라이브러리

 

const xlsx = require("xlsx");
const axios = require("axios");
const cheerio = require("cheerio");
const add_to_sheet = require("./xlsx");

const workData = xlsx.readFile("./data/data.xlsx");
const workSheet = workData.Sheets.movieList;
const workResult = xlsx.utils.sheet_to_json(workSheet);

// 배열안에 객체가 들어있음
// 배열.entries()를 사용하면 내부 배열이 [인덱스, 값]으로 이터레이터로 변경됨
// for (const [i, e] of workResult.entries()) {
//   console.log(e);
// }

const crawlerBot = async () => {
  add_to_sheet(workSheet, "B1", "s", "제목");
  try {
    await Promise.allSettled(workResult.map(async (e, i) => {
      const response = await axios.get(e.url);
      if (response.status === 200) {
        const data = response.data;
        const $ = cheerio.load(data);
        const movieTitle = $(".mv_info_area .mv_info h3 a").text();
        const bestScript = $(".lines_area .tx_top strong").text();
        const star = $(".score.score_left .star_score").text();
        const newCell = "B" + (i + 2);
        add_to_sheet(workSheet, newCell, "n", movieTitle.trim());
      } else {
        console.log("실패");
      }
    }));
    xlsx.writeFile(workData, "./data/result.xlsx");
  } catch (err) {
    console.error(err);
  }
}
crawlerBot();

app.js

 

  • xlsx.readFile 메서드로 작업할 엑셀 파일을 읽는다.
  • 엑셀 파일의 시트의 제목을 Sheets 메서드로 가져온다.
  •  xlsx.utils.sheet_to_json 메서드로 자바스크립트가 해석할 수 있는 객체로 바꿔준다.
  • add_to_sheet 함수의 인자로 시트 셀위치 데이터 타입 데이터를 넣어준다.
  • axios는 비동기 요청이므로 Promise.allSettled로 엑셀 파일의 반복문을 처리한다.
  • 요청 결과는 response에 담기고 데이터는 response.data 상태 코드는 response.status 담긴다.
  • cheerio.load 메서드로 response.data의 HTML 파일을 해석한다.
  • cheerio는 제이쿼리의 메서드를 그대로 사용할 수 있다.
  • HTML 파일의 태그를 바탕으로 원하는 데이터를 찾는다.
  • xlsx.writeFile 메서드로 읽은 엑셀 파일과 저장할 경로를 넣어준다.

 

const xlsx = require('xlsx');

function range_add_cell(range, cell) {
  var rng = xlsx.utils.decode_range(range);
  var c = typeof cell === 'string' ? xlsx.utils.decode_cell(cell) : cell;
  if (rng.s.r > c.r) rng.s.r = c.r;
  if (rng.s.c > c.c) rng.s.c = c.c;

  if (rng.e.r < c.r) rng.e.r = c.r;
  if (rng.e.c < c.c) rng.e.c = c.c;
  return xlsx.utils.encode_range(rng);
}

module.exports = function add_to_sheet(sheet, cell, type, raw) {
  sheet['!ref'] = range_add_cell(sheet['!ref'], cell);
  sheet[cell] = { t: type, v: raw };
};

add_to_sheet

 

  • 위 코드는 라이브러리 엑셀 파일에 데이터를 넣는 함수이다.

 

기존 data.xlsx 파일
결과 result.xlsx

 

'서버 > Node' 카테고리의 다른 글

NodeJS  (0) 2022.07.23
NodeJS Crawling Puppeteer  (0) 2022.04.18
NodeJS dotenv  (0) 2022.01.20
NodeJS NPM semver package.json  (0) 2022.01.19
NodeJS fs  (0) 2022.01.18