์ธํฐ๋ท์ด ๋ณดํธํ ๋๋ฉด์ ์ฐ๋ฆฌ๋ ์์ ๋ณด๋ค ๋ ๋ง์ ์ ๋ณด๋ฅผ ์ฝ๊ฒ ์ ํ๊ณ , ์์ฐํ๋ค. ๊ทธ๋ฆฌ๊ณ ์์ฐ๋ ์ ๋ณด๋ค์ ๋ค๋ฅธ ์ด๋ค๊ณผ ๊ณต์ ํ๋ค. ์ ๋ณด๋ฅผ ์์ฐํ๊ณ , ๋ณด๋ด๊ณ , ์ ์ฅํ๋ ๋ฐ ํธํด์ง๊ธฐ ์ํด ํด๋ผ์ฐ๋ ๊ธฐ์ ์ด ๋ง์ด ๋ฐ๋ฌํ๊ฒ ๋์๋ค. ๊ทธ๋ฆฌ๊ณ ๋ ๋์๊ฐ ์ค์น๊ฐ ํ์ ์๋, ํด๋ผ์ฐ๋๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ์น ๊ธฐ๋ฐ์ ํ๋ก๊ทธ๋จ๋ค์ด ํํ ์ฐ์ด๊ฒ ๋์๋ค. ํด๋ผ์ฐ๋ ๊ธฐ๋ฐ์ ํ๋ก๊ทธ๋จ์ ์ผ์์ ์์ญ์์ ์ ๋ฌด์ ์์ญ๊น์ง ๋ค๋ฐฉ๋ฉด์ผ๋ก ์ฐ์ธ๋ค.
์ด๋ฐ ํด๋ผ์ฐ๋ ๊ธฐ๋ฐ์ ํ๋ก๊ทธ๋จ๋ค์ ๋ชจ๋ ๋งํฌ๋ฅผ ํตํด ํ์ํ ์ฌ๋๋ค์๊ฒ ์ ๋ฌ๋๋ค. ์ผ์์์ ์ฐ๋ฆฌ๊ฐ ํฅ๋ฏธ๋ก์ด ์น์ฌ์ดํธ๋ฅผ ๊ณต์ ํ๋ฏ ์ด์ ๋ ๋งํฌ๋ฅผ ํตํด ํ์ํ ์ ๋ณด์ ํ๋ก๊ทธ๋จ ๊ทธ ์์ฒด๊ฐ ๊ณต์ ๋๋ค. ํธํ๊ฒ ํฐ ๋ฆฌ์์ค ๋ญ๋น ์์ด ๊ณต์ ๊ฐ ๊ฐ๋ฅํ๊ณ ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ค. ํ์ง๋ง, ์ด๋ฐ ์ค์ํ ๋งํฌ๋ ๋ง์ด ๊ณต์ ๋์ง๋ง, ๋ง๋ ํ ๋ชจ์์ ์ ์ฅํ์ฌ ๊ด๋ฆฌํ ๊ณณ์ด ์์ด, ๋ถ์ฐ๋์ด ์ ์ฅ๋๊ณ ์ด๋ก ์ธํด ์ฝ๊ฒ ์ํ๊ฒ ๋๋ค.

๋ธ๋ผ์ฐ์ ์ ๋ถ๋งํฌ๋ ๋ฉ๋ชจ์ฅ ๋ฑ์ ๊ธฐ๋ฅ์ ์ด์ฉํ๋ฉด ์ฝ๊ฒ ๋งํฌ๋ฅผ ์ ์ฅํ ์ ์๋ค. ํ์ง๋ง ํ์ํ ๋งํฌ๋ฅผ ๋ค์ ์ฐพ์๋ณผ ๋ ๋ถ๋งํฌ๋ ๋ฉ๋ชจ์ฅ์ ๊ฒฝ์ฐ ๋งํฌ์ ๊ดํ ์ ๋ณด๊ฐ ํ๋์ ๋ค์ด์ค์ง ์๋ ๋ฌธ์ ์ ์ด ์๋ค. ์ด๋ก ์ธํด, ๋งํฌ๋ฅผ ์ฐพ๋ ๋ฐ ์๊ฐ์ด ๋ ๊ฑธ๋ ค ๋งํฌ๋ฅผ ์ ์ฅํ ์๋ฏธ๊ฐ ํด์๋๋ค.
.png)
.png)
์ด๋ฌํ ๋ฌธ์ ์์ ์ฐฉ์ํ์ฌ ๋งํฌ๋ฅผ ๋ณด๋ค ๋ณด๊ธฐ ์ฝ๊ณ , ์ ์ฅํ๊ธฐ ์ฌ์ฐ๋ฉฐ, ๋ค์ ์ฐพ์๋ณด๊ธฐ ์ฝ๊ฒ ๋ง๋ค ์ ์๋ Linking์ด๋ผ๋ ์๋น์ค๋ฅผ ๊ฐ๋ฐํ์ฌ ํด๊ฒฐํ๊ณ ์ ํ๋ค. Linking์ ํตํด ์ฌ์ฉ์๋ ๋งํฌ๋ฅผ ์ฃผ์ ์ ๋ง๊ฒ ํ ์ ์ฅ์์ ๋ชจ์ ๋ณด๊ธฐ ํธํ๊ฒ ๋ง๋ค๊ณ , ์ฝ๊ฒ ๊ด๋ฆฌํ ์ ์๋ค. Linking์ 'Link all in one workspace' ๋ผ๋ ์ฌ๋ก๊ฑด ์๋, ๋ณธ์ธ์ด ๊ด์ฌ ์๋ ๋ถ์ผ์ ๊ด๋ จ๋ ์ฝํ ์ธ ์ ๋งํฌ๋ฅผ ๋ชจ์ ํ๋์ ๋ณผ ์ ์๊ณ ๊ด๋ฆฌํ ์ ์๋ ์๋น์ค๋ค.
์ด๋ฒ ํ๋ก์ ํธ์์๋ ๊ตฌํํ๊ณ ์ ํ๋ ์๋น์ค๊ฐ ๋งํฌ ๊ณต์ ์๋น์ค ์ด์ฉ์๋ฅผ ์ํ ์์ฐ์ฑ ๋๊ตฌ์ธ ๋งํผ, ํด๋น ์๋น์ค ๊ตฌํ์ ํตํด๋ค๋ฅธ Stakeholder์ ๋ฌธ์ ๋ค๋ ํจ๊ป ํด๊ฒฐํ๊ณ ์ ํ๋ค.
๋งํฌ ๊ณต์ ์๋น์ค ์ด์ฉ์์ ๋ฌธ์ ์ธ, ๋งํฌ ์ ์ฅ, ํ์ ๋ฐ ๊ณต์ ์ ์ด๋ ค์์ ๊ฐ์ฅ ํฐ ๋ชฉํ๋ก ๋๊ณ ํ๋ก์ ํธ๋ฅผ ์งํํ๋ ค ํ๋ค.
| ๋งํฌ ๊ณต์ ์๋น์ค ์ด์ฉ์ ๋ฌธ์ | ํด๊ฒฐ |
|---|---|
| ์ ์ฅ๋ ๋งํฌ์ ์ ๋ณด๋ฅผ ์๊ธฐ ์ด๋ ค์ | ๋ฉํ ๋ฐ์ดํฐ ํฌ๋กค๋ง์ ํตํ ๋งํฌ์ ๋ํ ์ ๋ชฉ๊ณผ ์ค๋ช ํฌ๋กค๋ง |
| ์ ์ฅ๋ ๋งํฌ๋ฅผ ํ์์ ์ํด ํ์์ ํ๋ ค ํ ๋, ํ์ํ ๋ฐ์ดํฐ ์ฐพ๊ธฐ ์ด๋ ค์ | ์ ์ฅ๋ ๋ฉํ ๋ฐ์ดํฐ, ํ๊ทธ, ์ ์ ์ค๋ช ๋ชจ๋์์ ์ ์ฒด ํ์ |
| ๋งํฌ๋ฅผ ํ ๋ฒ์ ๊ณต์ ํ๊ธฐ ์ด๋ ค์ | ๋งํฌ๋ฅผ ๋ชจ์ ์ ์ฅ์๋ฅผ ์ ์ ๊ฐ์ ํ๊บผ๋ฒ์ ๊ณต์ |
semantic ui๋ UI ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์นดํ ๊ณ ๋ฆฌ์ ์ํ๋ ์ ํ์ด๋ค. ์ด ๋๊ตฌ๋ ์ ๋ง๋ค์ด์ง ๊ธฐ๋ณธ component๋ฅผ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์ react ์์์ ํ์ฉํ์ฌ ๋น ๋ฅด๊ฒ ์๋น์ค๋ฅผ ๊ตฌํํ ์ ์๊ณ ํ์์ ๋ฐ๋ผ์๋ ๊ฐ์กฐํด์ ์ฌ์ฉํ ์ ์๋ค. ๋งค๋ฒ component๋ฅผ ์๋กญ๊ฒ ๊ตฌํํ๋ ๊ฒ์ ์์ฐ์ฑ์ด ๋จ์ด์ง๊ณ ํ๋ก์ ํธ ํน์ฑ์ ์๊ฐ์ด ๋ง์ด ๋ถ์กฑํ ์ํฉ์์ ๋น ๋ฅด๊ฒ ๊ฐ๋ฐํ๊ธฐ ์ํด ์ฌ์ฉํ์๋ค.
React.js์ ํจ๊ป ์ฌ์ฉ๋๋ ์ํ์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ด๋ฆฌํ๋ ์๋ก์ด ๋ฐฉ๋ฒ์ด๋ค. ๊ธฐ์กด์ ํจ์ํ ์ปดํฌ๋ํธ์์ ๋ชปํ๋ ์ํ๊ฐ ๊ด๋ฆฌ, ์ปดํฌ๋ํธ์ ์๋ช ์ฃผ๊ธฐ ํจ์๋ฅผ ์ด์ฉํ๊ธฐ ์ํด ์ฌ์ฉํ๋ค. ์์ง์ฑ๊ณผ ์กฐ๋ฆฝ ๊ฐ๋ฅ์ฑ์ ์ป๊ณ ํ์ฌ ๋ผ์ดํ์ฌ์ดํด ๋ฉ์๋๋ณด๋ค ๋จ์ํ๊ธฐ ๋๋ฌธ์ ์ฌ์ฉํ์๋ค.
Cheerio๋ ์น ์คํฌ๋ํ์ ์ํ ๋ชจ๋์ด๋ค. ์น ์คํฌ๋ํ์ ์นํ์ด์ง์ ์ ๋ณด๋ฅผ ํ๋ก๊ทธ๋จ์ ํตํด์ ๊ฐ์ ธ์ค๋ ๊ฒ์ ๋ปํ๋ค. Linking ์๋น์ค๋ ์ฌ์ฉ์๊ฐ ์ ์ฅํ๊ณ ์ ํ๋ ๋งํฌ์์ meta data๋ฅผ ์ถ์ถํ์ฌ ์นด๋๋ทฐ ํํ๋ก ์ถ๋ ฅํด์ผํ๋ค. ๋ฐ๋ผ์ ์ฌ์ฉ์๊ฐ ์ ์ฅํ URL์์ ์ถ์ถ์ ํ์ํ HTML ํ๊ทธ๋ฅผ ์ฌ์ ์ ์ค์ ํด๋๊ณ meta data๋ฅผ ์ถ์ถํด ๋ธ๋ค. ์ ์์ ์ผ๋ก meta data์ ์ถ์ถ์ด ์ด๋ ค์ด ๊ฒฝ์ฐ์๋ ์์ธ ์ฒ๋ฆฌ๋ฅผ ํ์ฌ ์ฌ์ฉ์์๊ฒ ์นด๋๋ทฐ ํํ๋ก ์ถ๋ ฅ๋๋๋ก ์์ฑํ์๋ค.
Node์์ fetch๋ฅผ ํตํด ์ ์ฒด HTML์ ๋ถ๋ฌ์ Cheerio ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ฉํ์ฌ Meta๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ณตํ์ฌ ๊ฐ์ฒด๋ก ๋ด๋ณด๋ด๋ ๋ชจ๋์ ๊ตฌํํ์๋ค.
const axios = require("axios");
const cheerio = require("cheerio");
class Scraper {
constructor(url) {
this.url = url;
}
async getResponse() {
const { data } = await axios.get(this.url);
return data;
}
filterByTarget({ data, target }) {
return data.filter(elem => {
const itemprop = elem.itemprop ? elem.itemprop : "";
const property = elem.property ? elem.property : "";
const name = elem.name ? elem.name : "";
return (
itemprop.includes(target) ||
property.includes(target) ||
name.includes(target)
);
});
}
getData(html) {
const $ = cheerio.load(html);
let data = [];
$("meta").each((i, elem) => {
const attrib = elem.attribs;
if (attrib.itemprop || attrib.property || attrib.name)
data = [...data, attrib];
});
const pageTitle = $("title").text();
const [title, ...titleArg] = this.filterByTarget({
data,
target: "title"
});
const [desc, ...descArg] = this.filterByTarget({
data,
target: "description"
});
const [imgUrl, ...imgUrlArg] = this.filterByTarget({
data,
target: "image"
});
return {
title: title ? title.content : pageTitle ? pageTitle : this.url,
desc: desc ? desc.content : "",
imgUrl: imgUrl ? imgUrl.content : ""
};
}
}
module.exports = Scraper;๋ณ๋์ ๋ก๊ทธ์ธ ์์ด ๊ตฌ๊ธ ๋ก๊ทธ์ธ ๋ง์ ์ ๊ณตํ๊ณ ์๋ค.
์ฆ๊ฒจ์ฐพ๊ธฐ, ์์ , ์ญ์ ์ ๊ธฐ๋ฅ ์ ๊ณต
๋งํฌ๋ฅผ ๋ถ์ฌ๋ฃ๊ธฐํ๊ณ ์ ์ฅํ๋ฉด ๋ณ๋์ ์คํฌ๋ํผ๊ฐ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ ํจ๊ป ์ ์ฅํ๋ค.


















