cheerio ์‚ฌ์šฉํ•ด๋ณด๊ธฐ

Node ๋ชจ๋“ˆ๋กœ ์›น ์Šคํฌ๋ž˜ํ•‘ ํ•˜๊ธฐ

Oct 29, 2023

๊ฐ•์˜๋ฏผ

#ETC

์ตœ๊ทผ ๋ธ”๋กœ๊ทธ ์ž‘์—…์„ ์ง„ํ–‰ํ•˜๋ฉฐ ์•Œ๊ฒŒ๋œ 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 ์‚ฌ์šฉ ์ค€๋น„๋Š” ๋์ž…๋‹ˆ๋‹ค.

image1
image2

์ดํ›„ ํ•ด๋‹น ํŽ˜์ด์ง€์—์„œ ๊ฐ€์ ธ์˜ค๊ณ ์ž ํ•˜๋Š” ๋ฐ์ดํ„ฐ ๋ฆฌ์ŠคํŠธ๊ฐ€ ์žˆ๋Š” 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๋ฅผ ๋‹ค๋ค„๋ณธ ๋ถ„๋“ค์ด๋ผ๋ฉด ์‚ฌ์šฉํ•˜๋Š”๋ฐ ์žˆ์–ด ์นœ์ˆ™ํ•˜๊ฒŒ ๋А๋ผ์‹ค ์ˆ˜๋„ ์žˆ์„๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

image3

ํŒŒ์‹ฑํ•ด์ค€ ๋ฐ์ดํ„ฐ๋ฅผ console์— ๋กœ๊ทธ๋ฅผ ์ถœ๋ ฅํ•ด๋ณด๋ฉด ์ด๋ ‡๊ฒŒ ์•„์ฃผ ์ž˜ ์ •๋ ฌ๋˜์–ด ๋‚˜์˜ค๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๋งˆ์น˜๋ฉฐ

์ •๋ง ๊ฐ„์†Œํ•˜๊ฒŒ NodeJS์˜ cheerio๋ผ๋Š” ๋ชจ๋“ˆ์„ ํ†ตํ•ด ์›นํŽ˜์ด์ง€๋ฅผ ์Šคํฌ๋ž˜ํ•‘ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ ์ž‘์„ฑํ•ด ๋ณด์•˜๋Š”๋ฐ์š” ๊ทธ๋งŒํผ ์‚ฌ์šฉ๋ฒ• ์ž์ฒด๋Š” ์‰ฝ๊ณ  ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ์›น์‚ฌ์ดํŠธ ์›นํŽ˜์ด์ง€์— ๋ณด์—ฌ์ง€๋Š” ์ •๋ณด์˜์—ญ์„ ๋ฐ์ดํ„ฐ๋กœ ๊ฐ€์ ธ์™€์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ƒ๊ธด๋‹ค๋ฉด ์ œ๋ฒ• ๊ดœ์ฐฎ์€ ๋„๊ตฌ๊ฐ€ ์•„๋‹๊นŒ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์œผ๋กœ ์ด๋งŒ ์ด๋ฒˆ ํฌ์ŠคํŒ…์„ ๋งˆ์นฉ๋‹ˆ๋‹ค.

Grow & Glow ยฉ 2025

Banner images by undraw.co