
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
- 위 코드는 라이브러리 엑셀 파일에 데이터를 넣는 함수이다.


'서버 > 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 |