๋ณธ ๊ฒ์๊ธ์ PC๋ฒ์ ์ ์ต์ ํ ๋์ด์์ผ๋ฉฐ ํจ์คํธ์บ ํผ์ค ์ํฌํฐ์ฆ 3๊ธฐ๋ก ํ๋ํ๋ฉฐ
"ํ ๋ฒ์ ๋๋ด๋ Node.js ์น ํ๋ก๊ทธ๋๋ฐ ์ด๊ฒฉ์ฐจ ํจํค์ง Online"์ ๋ฌด๋ฃ๋ก ํ์ฐฌ๋ฐ์ ์์ฑํ ๊ฒ์๊ธ์ ๋๋ค.
ํจ์คํธ์บ ํผ์ค์์ ์ํฌํฐ์ฆ๋ฅผ ๋ชจ์งํ๋ค๊ธธ๋ ๊ณต์ง๋ก ๊ฐ์๋ฅผ ๋ค์ ์ ์๋ ๊ธฐํ์ฌ์ ๋ ๋ค ์ ์ฒญํ์. ์คํ๋ง ๊ด๋ จํด์ ๊ฐ์๋ฅผ ๋ฃ๊ณ ์ถ์ด์ ์ ์ฒญํ์ง๋ง ์ด๋ฒ ์ํฌํฐ์ฆ์ ์คํ๋ง์ด ์๋ค๋๊ฒ ํจ์ ... ๊ทธ๋๋ ๋ ธ๋๋ ๊ฒฐ๊ตญ์ ๋ฐฑ์๋ ์ชฝ์ด๊ณ ํ๊ต ๊ฐ์ข์์ ์ด์ง ์ฐ๋จนํ ์ ์ด ์์ด์ ์ข ๋ ๋ฐฐ์๋ณผ ๊ฒธ node.js ์ํฌํฐ์ฆ๋ฅผ ์ ์ฒญํ๋ค. ๋ญ ์๋ฌดํผ ์ํฌํฐ์ฆ๋ก ์ ์ ๋์ด์ ๋ฆฌ๋ทฐ๋ฅผ ํ ๋ฌ ์ ๋ ์จ์ผํ๊ฒ ๋์... ์ํ๊ธฐ๊ฐ์ด๋ผ ๋นก์ธ์ง๋ง ํ ๋ฒ ๋ฌ๋ ค๋ด ์๋ค! node.js! node.js!
์ ๋ง ์์งํ ๋ฆฌ๋ทฐ์ด๋ ๋ณธ ๊ฐ์๋ฅผ ์ง์ ๋ ๋ด๊ณ ๋ค์ผ์ค ๋ถ๋ค์ ์ฐธ๊ณ ํ์๋ฉด ๋ ๋ฏ ํฉ๋๋ค.
์ปด๊ณต์์ด๋ผ๋ฉด ์ต์ํ ํ ๋ฒ์ฏค์ ๋ค์ด๋ดค์ ๋ฒํ ๋จ์ด ์น ํฌ๋กค๋ง.
์นํ์ด์ง์์ ํน์ ๋ถ๋ถ๋ง ํ์ฑํด์ ์ด๋ฅผ ๋ณด์ฌ์ฃผ๋ ๊ธฐ์ ์ด๋ผ๊ณ ๋งํ ์ ์๋ค.
ํ์ง๋ง ์๋ชป ์๊ณ ์๋ ๊ฒ์ด ์๋๋ฐ ์ฐ๋ฆฌ๊ฐ ํํ ๋งํ๋ ์น ํฌ๋กค๋ฌ๋ ์ฌ์ค ์น ์คํฌ๋ํผ๊ฐ ์ ํํ ํํ์ด๋ค.
์ฌ์ค ๋๋ ์ง๊ธ๊น์ง ๋ชฐ๋์๋ค...ใ ใ ... ํฌ๋กค๋ง์ด๋ผ๊ณ ๊ทธ๋ฅ ์๊ธฐํ๊ณ ์์๋ค. ์ฌ์ง์ด ์ง๋์ฃผ ์ธํด ๋ฉด์ ์์๋ ๋ฉด์ ๊ด๋๊ป์ ๋ด ๊น์ ์๋ ํฌ๋กค๋ฌ๋ณด๊ณ ๋ญ๋๊ณ ์ฌ์ญค๋ณด์ ์ ๊ต๋ณด๋ฌธ๊ณ ๋ฒ ์คํธ์ ๋ฌ ๊ธ์ด์ค๋ ์น ํฌ๋กค๋ฌ๋ผ๊ณ ๋๋ตํ์...๐คฃ
์๋ฌดํผ ๊ฐ์์์๋ ์ด๋ฅผ ๋์ ๋ถ์์ ์ค๋ช ํด์ฃผ๊ณ ์๋ค.
ํ ๋ฒ ์ํคํผ๋์์ ์น ํฌ๋กค๋ฌ์ ์น ์คํฌ๋ํ์ ๊ดํ ๋ด์ฉ์ ์ดํด๋ณด์.
์น ํฌ๋กค๋ฌ : ์น ํฌ๋กค๋ฌ(web crawler)๋ ์กฐ์ง์ , ์๋ํ๋ ๋ฐฉ๋ฒ์ผ๋ก ์๋ ์์ด๋ ์น์ ํ์ํ๋ ์ปดํจํฐ ํ๋ก๊ทธ๋จ์ด๋ค. ์น ํฌ๋กค๋ฌ๊ฐ ํ๋ ์์ ์ '์น ํฌ๋กค๋ง'(web crawling) ํน์ '์คํ์ด๋๋ง'(spidering)์ด๋ผ ๋ถ๋ฅธ๋ค. ๊ฒ์ ์์ง๊ณผ ๊ฐ์ ์ฌ๋ฌ ์ฌ์ดํธ์์๋ ๋ฐ์ดํฐ์ ์ต์ ์ํ ์ ์ง๋ฅผ ์ํด ์น ํฌ๋กค๋งํ๋ค. ์น ํฌ๋กค๋ฌ๋ ๋์ฒด๋ก ๋ฐฉ๋ฌธํ ์ฌ์ดํธ์ ๋ชจ๋ ํ์ด์ง์ ๋ณต์ฌ๋ณธ์ ์์ฑํ๋ ๋ฐ ์ฌ์ฉ๋๋ฉฐ, ๊ฒ์ ์์ง์ ์ด๋ ๊ฒ ์์ฑ๋ ํ์ด์ง๋ฅผ ๋ณด๋ค ๋น ๋ฅธ ๊ฒ์์ ์ํด ์ธ๋ฑ์ฑํ๋ค. ๋ํ ํฌ๋กค๋ฌ๋ ๋งํฌ ์ฒดํฌ๋ HTML ์ฝ๋ ๊ฒ์ฆ๊ณผ ๊ฐ์ ์น ์ฌ์ดํธ์ ์๋ ์ ์ง ๊ด๋ฆฌ ์์ ์ ์ํด ์ฌ์ฉ๋๊ธฐ๋ ํ๋ฉฐ, ์๋ ์ด๋ฉ์ผ ์์ง๊ณผ ๊ฐ์ ์น ํ์ด์ง์ ํน์ ํํ์ ์ ๋ณด๋ฅผ ์์งํ๋ ๋ฐ๋ ์ฌ์ฉ๋๋ค. ์น ํฌ๋กค๋ฌ๋ ๋ด์ด๋ ์ํํธ์จ์ด ์์ด์ ํธ์ ํ ํํ์ด๋ค. ์น ํฌ๋กค๋ฌ๋ ๋๊ฐ ์๋(seeds)๋ผ๊ณ ๋ถ๋ฆฌ๋ URL ๋ฆฌ์คํธ์์๋ถํฐ ์์ํ๋๋ฐ, ํ์ด์ง์ ๋ชจ๋ ํ์ดํผ๋งํฌ๋ฅผ ์ธ์ํ์ฌ URL ๋ฆฌ์คํธ๋ฅผ ๊ฐฑ์ ํ๋ค. ๊ฐฑ์ ๋ URL ๋ฆฌ์คํธ๋ ์ฌ๊ท์ ์ผ๋ก ๋ค์ ๋ฐฉ๋ฌธํ๋ค.
์น ์คํฌ๋ํ : ์น ์คํฌ๋ํ , ์น ์์ง ๋๋ ์น ๋ฐ์ดํฐ ์ถ์ถ์ ์น ์ฌ์ดํธ ์์ ๋ฐ์ดํฐ ๋ฅผ ์ถ์ถํ๋ ๋ฐ ์ฌ์ฉ๋๋ ๋ฐ์ดํฐ ์คํฌ๋ํ์ด๋ค. ์น ์คํฌ๋ํ ์ํํธ์จ์ด๋ Hypertext Transfer Protocol ๋๋ ์น ๋ธ๋ผ์ฐ์ ๋ฅผ ์ฌ์ฉํ์ฌ World Wide Web์ ์ง์ ์ก์ธ์ค ํ ์ ์๋ค.
์ด์ฒ๋ผ ์น ํฌ๋กค๋ฌ๋ ์๋ํ ๋ด์ธ ์น ํฌ๋กค๋ฌ๊ฐ ์ ํด์ง ๊ท์น์ ๋ฐ๋ผ ์นํ์ด์ง๋ฅผ ๋ธ๋ผ์ฐ์ง(browsing)ํ๋ ํ์์ด๊ณ ์น ์คํฌ๋ํ์ ํน์ ์ฌ์ดํธ์์ ์ํ๋ ๋ถ๋ถ์ ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํ์ฌ ์์งํ๋ ๊ธฐ์ ์ด๋ค.
๋ ๊ฐ๋ ์ ๋ํด ์ ๋๋ก ์ ๋ฆฝํ ํ์๊ฐ ์๋ค๊ณ ๋ณธ๋ค.
๊ทธ๋ผ ์น ํฌ๋กค๋ฌ๊ฐ ์ ํด์ง ๊ท์น์ ๋ฐ๋ผ ๋ธ๋ผ์ฐ์งํ๋ค๊ณ ํ๋๋ฐ ์ ํด์ง ๊ท์น์ ๋ญ๊น?
์ด๋ ํฌ๋กค๋ฌ ์ ์ฑ ์ด๋ผ๊ณ ํ๋ฉฐ robot.txt์์ ํ์ธํ ์ ์๋ค.
https://www.google.com/robots.txt์ ๊ฐ์ด ์ฐ๋ฆฌ๊ฐ ์ ์ํ๋ ์นํ์ด์ง์ url์ robots.txt๋ฅผ ์ ๋ ฅํ๋ฉด ๋๋ค.
๊ตฌ๊ธ์ ์์๋ก ์ดํด๋ณด๋ฉด
User-agent์ ๋ค์ํ Allow, Disallow๋ฅผ ๋ณผ ์ ์๋ค.
์ด๋ ๊ฒ์๋ก๋ด์๊ฒ ์ฌ์ดํธ ๋ฐ ์นํ์ด์ง๋ฅผ ์์งํ ์ ์๋๋ก ํ์ฉํ๊ฑฐ๋ ์ ํํ๋ ๊ฒ์ด๋ค.
์ค์ ๋ก ์คํฌ๋ํผ๋ฅผ ๊ตฌํํด๋ณด์. ์คํฌ๋ํผ์ ์ฌ์ฉ๋๋ ๋ชจ๋์๋ ๋ฌด์์ด ์์๊น?
1. Axios + Cheerio
2. Selenium, beautifulsoup, scrapy
3. Puppeteer
์ค๋ ์ฌ์ฉํ ๊ฒ์ Axios + Cherrio + Puppeteer ์ด๋ค.
์ฒซ๋ฒ์งธ๋ก Axios + Cheerio๋ฅผ ์ฌ์ฉํ๋ค. ๊ฐ์์์๋ www.example.com ์ฌ์ดํธ๋ฅผ ํธ์ถํ๋ค.
๋๋ ๋ด ๊นํ๋ธ๋ฅผ ํธ์ถํด๋ดค๋ค. ๋ด ๊น์์ ์ ์ ์ด๋ฆ๊ณผ ์ ์ ์์ด๋, ์ ์ ๋ฉ์ธ์ง๋ฅผ ์คํฌ๋ํ ํด์ค๋ ์ฝ๋๋ฅผ ๊ตฌํํด๋ดค๋ค.
const axios = require("axios"); // axios ํธ์ถ
const cheerio = require('cheerio'); // cheerio ํธ์ถ
axios.get("https://github.com/k906506").then((response) => {
const htmlString = response.data;
const $ = cheerio.load(htmlString);
const userName = $('#js-pjax-container > div.container-xl.px-3.px-md-4.px-lg-5 > div > div.flex-shrink-0.col-12.col-md-3.mb-4.mb-md-0 > div > div.clearfix.d-flex.d-md-block.flex-items-center.mb-4.mb-md-0 > div.vcard-names-container.float-left.col-12.py-3.js-sticky.js-user-profile-sticky-fields > h1 > span.p-name.vcard-fullname.d-block.overflow-hidden').text();
const UserId = $('#js-pjax-container > div.container-xl.px-3.px-md-4.px-lg-5 > div > div.flex-shrink-0.col-12.col-md-3.mb-4.mb-md-0 > div > div.clearfix.d-flex.d-md-block.flex-items-center.mb-4.mb-md-0 > div.vcard-names-container.float-left.col-12.py-3.js-sticky.js-user-profile-sticky-fields > h1 > span.p-nickname.vcard-username.d-block').text();
const userMessage = $('#js-pjax-container > div.container-xl.px-3.px-md-4.px-lg-5 > div > div.flex-shrink-0.col-12.col-md-3.mb-4.mb-md-0 > div > div.d-flex.flex-column > div.js-profile-editable-area.d-flex.flex-column.d-md-block > div.p-note.user-profile-bio.mb-3.js-user-profile-bio.f4 > div').text();
console.log({
userName,
UserId,
userMessage,
});
});
์ฐ์ ๋ด ๊น ํ๋กํ
์ฝ๋ ์คํ ๊ฒฐ๊ณผ
์ ์์ ์ผ๋ก ์ถ๋ ฅ๋๋ค!
๋ค์์ Puppeteer๋ฅผ ํ์ฉํ์ฌ https://www.tistory.com/category/life ์ฌ์ดํธ๋ฅผ ํธ์ถํ๋ค.
ํ์ง๋ง ์ญ์ ๋๋ ๋ค๋ฅธ ์ฌ์ดํธ๋ฅผ ์ด์ฉํ๋ค. ๊ต๋ณด๋ฌธ๊ณ ์ ๋ฒ ์คํธ์ ๋ฌ๋ฅผ ๊ธ์ด์๋ดค๋ค.
const puppeteer = require('puppeteer');
const cheerio = require('cheerio');
(async () => {
const browser = await puppeteer.launch({
headless: false
});
const page = await browser.newPage();
await page.setViewport({
width: 1440,
height: 1080,
});
await page.goto('http://www.kyobobook.co.kr/bestSellerNew/bestseller.laf?mallGb=KOR&range=0&kind=0&orderClick=s11');
const html = await page.content();
const $ = cheerio.load(html);
let coinArray = [];
$('#main_contents > ul > li').each((index, element) => {
const bookName = $(element).find('div.detail > div.title > a > strong').text();
const bookPrice = $(element).find(' div.detail > div.price > strong').text();
coinArray.push({
bookName,
bookPrice
});
});
console.log(coinArray);
await browser.close();
})();
์ฝ๋๋ฅผ ์คํํด๋ณด๋ฉด
์ฌ์ค ์๊ฐ๋ ์ถ๋ ฅํ๊ณ ์ถ์๋๋ฐ ์ด์ํ๊ฒ ์ถ๋ ฅ๋ผ์ ๊ทธ๋ฅ ํจ์ค...
์ด๋ฒ ์ฃผ๋ ์ฌ๊ธฐ๊น์ง๋ง ์๊ฐํ๋ค.
1์ฃผ์ฐจ ๋๋ ์ : ํจ์บ ์์ ์ด๋ฏธ ์๋๋ก์ด๋ ๊ฐ์๋ฅผ ํ๋ ์๊ฐํ๊ณ ์๋๋ฐ ๊ฐ์ ๋๋์ ๋ ๋ค ๋น์ทํ๋ค. (์ฝ๊ฐ ์ฐ๋ฆฌ ํ๊ต ์ค์ฝ๋๋) ๊ฐ์ธ์ ์ผ๋ก js์ชฝ์ผ๋ก๋ ๋ฌธ์ธํ์ด๋ผ์ ์ด์ง ๋ต๋ตํ๊ธด ํ๋ฐ ๋ญ ์ด๋ ค์ด ์ธ์ด๋ ์๋๋๊น... ์คํฌ๋ํผ ๊ตฌํํ๋ ๋ถ๋ถ๋ ํ์ด์ฌ ์ ๋ ๋์์ ์จ๋ณธ ์ ์ด ์์ด์ ์ดํดํ๋๋ฐ๋ ์ด๋ ต์ง ์์๋ค. ์์ฌ์ ๋ ๊ฑด ์ค์ต ์ฝ๋ ๋์ด๋๋ฅผ ์ข ๋ ์ฌ๋ ค์คฌ์ผ๋ฉด ํ๋ ๋๋. ๋ฌผ๋ก ๋์ด๋๋ฅผ ์ฌ๋ฆฐ๋ค๋ฉด ์ดํดํ๊ธฐ ์ด๋ ค์ธ ์๋ ์์ง๋ง ๊ทธ๋งํผ ๋ฐฐ์๊ฐ๋ ๋ถ๋ถ์ด ๋ง์ ๊ฑฐ๋ผ ์๊ฐํ๋ค. ์ด๋ฒ ์ค์ต๋ ์์งํ ๊ตฌ๊ธ๋ง์ ํตํด์ ์ถ๊ฐ์ ์ผ๋ก ๊ถ๊ธํ ๊ฒ๋ค์ ํด๊ฒฐํ๋ฉด์ ์งํํ๋ค. ์ปด๊ณต ํน์ฑ์ ๊ตฌ๊ธ๋ง์ ํตํด ๋ฐฐ์๊ฐ๋ ๊ฒ์ด์ง๋ง ๊ฐ์์์๋ ๋๋ฌด ๊ธฐ๋ณธ์ ์ธ ๋ถ๋ถ์ผ๋ก ์งํํด์ ์ด์ง ์์ฌ์ ๋ค. ๊ทธ๋๋ ๊ธฐ๋ณธ์ ์ธ ๊ฑด ๋ค ์๋ ค์ค๋ค. ๋ ๋ค์ด๋ด์ผ ์๊ฒ ์ง๋ง ๋๋ฆ ๊ด์ฐฎ์ ๊ฒ ๊ฐ๋ค...? ๊ทผ๋ฐ ๊ฐ์ ์ด๋ฆ๋ง ๋ค์ผ๋ฉด node.js๋ฅผ ๋ฐ๋ก ํ์ตํ ๊ฒ ๊ฐ์ง๋ง 4๊ฐ์ ์ฑํฐ, 2๊ฐ๋ ํ๋ก ํธ, 2๊ฐ๋ ๋ฐฑ์๋ ์๋ ๊ฒ ๊ฐ์๊ฐ ์งํ๋๋ค. ๊ฐ์ ์ฌ๋ผ์จ ๊ฒ๋ ํ๋ก ํธ๋ง ์ฌ๋ผ์์๋ ์ํ์ด๋ค.
์์์ ํ ๋ฒ ์ผ์ง๋ง ๋งํฌ๋ฅผ ์ฒจ๋ถํด์ผํด์ ํ ๋ฒ ๋ ์ฐ๊ฒ ...
์ ๊ทธ๋ฆฌ๊ณ ์ํฌํฐ์ฆ๋ผ๊ณ ํด์ ๋ง ๋ ๋ฐ๊ณ ๊ทธ๋ฐ ๊ฑด ์๋๋๊น ์คํด ๋ ธ๋ ธ.. ๊ฐ์๋ง ๋ฌด๋ฃ๋ก ์ ๊ณตํด์ค! ๋ ธ๋js ๋ ธ๋js ๋ ธ๋js ๋ ธ๋js
"ํ ๋ฒ์ ๋๋ด๋ Node.js ์น ํ๋ก๊ทธ๋๋ฐ ์ด๊ฒฉ์ฐจ ํจํค์ง Online"์ ๋ฌด๋ฃ๋ก ํ์ฐฌ๋ฐ์ ์์ฑํ ๊ฒ์๊ธ์ ๋๋ค.