cheerio ์ฌ์ฉํด๋ณด๊ธฐ
Node ๋ชจ๋๋ก ์น ์คํฌ๋ํ ํ๊ธฐ
Oct 29, 2023
์ต๊ทผ ๋ธ๋ก๊ทธ ์์ ์ ์งํํ๋ฉฐ ์๊ฒ๋ NodeJS์์ HTML์ ํ์ฑํ์ฌ ์น์ ์คํฌ๋ํ ํ ์์๋ NodeJS ๋ชจ๋์ ์๊ฒ๋์๋๋ฐ์
์ฌ์ฉ๋ฒ ๋ํ ์ฝ๊ณ ๊ฐ๋จํ ํธ์ด๋ผ ์น์คํฌ๋ํ์ ํด์ผํ ์์ ์ด ์๊ธด๋ค๋ฉด ์๋นํ ์๊ธดํ๊ฒ ์ฐ์ผ๊ฒ ๊ฐ์ ์ค๋ ํด๋น ๋ชจ๋์ ๋ํด์ ์๊ฐํด ๋ณด๋ ค๊ณ ํฉ๋๋ค.
์ฌ์ ์ค๋น
npm install cheerio // or yarn add cheerio
npm install axios// or yarn add axios
์ฐ์ npm ๋๋ yarn ์ ์ด์ฉํด cheerio์ axios(axios๋ ํธ์์ ๊ฐ์ด ์ฌ์ฉํ์๊ณ ํ์๋X)๋ฅผ ์ค์นํด ์ค๋๋ค.
import * as cheerio from 'cheerio';
import axios from 'axios';
๊ทธ๋ค์ ๋ ๋ชจ๋์ ์ฌ์ฉํ ๊ณณ์ import ํด์ค๋๋ค.
์ฌ์ฉํ๊ธฐ
const getHtml = async () => {
try {
const response = await axios.get('<https://example.com/list>');
const $ = cheerio.load(response.data);
} catch (error) {
console.error(error);
}
};
์ฐ์ axios๋ฅผ ์ฌ์ฉํด ์คํฌ๋ํ์ ์ํ๋ ๋ฐ์ดํฐ๊ฐ ์๋ ์น์ฌ์ดํธ ํ์ด์ง์ html์ ๊ฐ์ ธ์ต๋๋ค ๊ทธ๋ฆฌ๊ณ ๋ฐํ๋๋ html๊ฐ์ฒด ๋ฐ์ดํฐ๋ฅผ cheerio.load์ ๋ด์์ฃผ๋จผ cheerio ์ฌ์ฉ ์ค๋น๋ ๋์ ๋๋ค.


์ดํ ํด๋น ํ์ด์ง์์ ๊ฐ์ ธ์ค๊ณ ์ ํ๋ ๋ฐ์ดํฐ ๋ฆฌ์คํธ๊ฐ ์๋ DOM์์๋ฅผ ์์๊ฒ์ฌ์ฐฝ์ ํตํด ํ์ธํด์ค๋๋ค.
const getHtml = async () => {
try {
const response = await axios.get('https://example.com/list');
const $ = cheerio.load(response.data);
const dataList = $('.area_view .category_index_list')
.slice(0, 4)
.map((i, elm) => {
const title = String(
$(elm).find('.item_category > .link_category > .info > .name').text()
);
const link_url = String($(elm).find('.item_category > .link_category').attr('href'));
const thumbnailStyle: any = $(elm)
.find('.item_category > .link_category > .thumnail')
.prop('style');
const thumbnailUrl = thumbnailStyle['background-image'].split("'")[1];
return { title, link_url, thumbnailUrl };
})
.get();
setScrapList(dataList);
} catch (error) {
console.log(error);
}
};
์ด์ ๊ฐ์ ธ์จ html์ ํ์ํ ๋ฐ์ดํฐ๋ง ์ฌ์ฉํ ์์๋๋ก cheerio๋ฅผ ์ด์ฉํด ํ์ฑํด ์ฃผ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค.
์ฝ๋๋ฅผ ๋ณด๋ฉด ๋ฐ๋ก ๊ฐ์ด ์ค์๊ฒ ์ง๋ง cheerio๋ HTML์์ document.querySelector()์ฒ๋ผ HTML ์์๋ฅผ ๊ณจ๋ผ๋ผ ์ ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ๋๋ค cheerio.load()๋ฅผ ์ด์ฉํ์ฌ HTML ํ๊ทธ ์์๋ค์ $๋ผ๋ ๋ณ์์ ํ ๋น ํด์คํ ๊ทธ ํ css ์ ํ์๋ฅผ ์ด์ฉํ์ฌ ์ํ๋ HTML์์๋ฅผ ์ ํํ ํ text(), attr(), html() ๋ฑ์ ๋ฉ์๋๋ฅผ ์ ์ ํ ์ฌ์ฉํ๋ฉด ๋ด๊ฐ ์ํ๋ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค ๋ํ DOM์ ์ง๋ ๋ฐฉ์์ด jquery์ ๋น์ทํ์ฌ ์ด์ ์ jquery๋ฅผ ๋ค๋ค๋ณธ ๋ถ๋ค์ด๋ผ๋ฉด ์ฌ์ฉํ๋๋ฐ ์์ด ์น์ํ๊ฒ ๋๋ผ์ค ์๋ ์์๊ฒ ๊ฐ์ต๋๋ค.

ํ์ฑํด์ค ๋ฐ์ดํฐ๋ฅผ console์ ๋ก๊ทธ๋ฅผ ์ถ๋ ฅํด๋ณด๋ฉด ์ด๋ ๊ฒ ์์ฃผ ์ ์ ๋ ฌ๋์ด ๋์ค๊ฒ ๋ฉ๋๋ค.
๋ง์น๋ฉฐ
์ ๋ง ๊ฐ์ํ๊ฒ NodeJS์ cheerio๋ผ๋ ๋ชจ๋์ ํตํด ์นํ์ด์ง๋ฅผ ์คํฌ๋ํํ๋ ๋ฐฉ๋ฒ์ ๋ํด์ ์์ฑํด ๋ณด์๋๋ฐ์ ๊ทธ๋งํผ ์ฌ์ฉ๋ฒ ์์ฒด๋ ์ฝ๊ณ ๊ฐ๋จํฉ๋๋ค.
๋ค๋ฅธ ์น์ฌ์ดํธ ์นํ์ด์ง์ ๋ณด์ฌ์ง๋ ์ ๋ณด์์ญ์ ๋ฐ์ดํฐ๋ก ๊ฐ์ ธ์์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ์๊ธด๋ค๋ฉด ์ ๋ฒ ๊ด์ฐฎ์ ๋๊ตฌ๊ฐ ์๋๊น ์๊ฐํฉ๋๋ค.
์ด๊ฒ์ผ๋ก ์ด๋ง ์ด๋ฒ ํฌ์คํ ์ ๋ง์นฉ๋๋ค.