๋ณธ ๊ฒ์๊ธ์ PC๋ฒ์ ์ ์ต์ ํ ๋์ด์์ผ๋ฉฐ ํจ์คํธ์บ ํผ์ค ์ํฌํฐ์ฆ 3๊ธฐ๋ก ํ๋ํ๋ฉฐ
"ํ ๋ฒ์ ๋๋ด๋ Node.js ์น ํ๋ก๊ทธ๋๋ฐ ์ด๊ฒฉ์ฐจ ํจํค์ง Online"์ ๋ฌด๋ฃ๋ก ํ์ฐฌ๋ฐ์ ์์ฑํ ๊ฒ์๊ธ์ ๋๋ค.
๋
ธ๋ js ๋
ธ๋ js ๋
ธ๋ js ๋
ธ๋ js ๋
ธ๋ js
2์ฃผ์ฐจ ๋ฆฌ๋ทฐ๊ฐ ์ด์ง ๋ฆ์๋ฐ..ํ๊ต ์ํ ์๊ฐ๊ณผ ๊ฒน์น๋๋ผ ํ ์ฃผ๋ฅผ ๋ฏธ๋ค๋ฌ๊น...^^;;
์ด๋ฒ ์ฃผ๋ ์ง๋ ์ฃผ์ ๋ฐฐ์ ๋ ์คํฌ๋ํผ๋ฅผ ์ด์ฉํด์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒ์ ๋ฐฐ์ ๋ค.
์ฐ์ ๊ฐ์์์ ๋ฌดํ ์คํฌ๋กค์ ๋ํด์ ๋ฐฐ์ ๋๋ฐ ์ธ์คํ๊ทธ๋จ์ด๋ ํ์ด์ค๋ถ์ ๊ฒฝ์ฐ ๋ด์คํผ๋์์ ์ฌ์ฉ์๊ฐ ์คํฌ๋กค์ ๋ด๋ฆด ๊ฒฝ์ฐ ๋์ ์์ด ์คํฌ๋กค์ด ์์ฑ๋๋ ๊ฒ์ ๋ณผ ์ ์๋ค. ์ง๊ธ๊น์ง ์ด๊ฒ์ ๋ํด ๊ถ๊ธํดํ ์ ์ด ์์๋๋ฐ ๊ฐ์๋ฅผ ๋ฃ๊ณ ์ด๋ป๊ฒ ๊ตฌํํ๋ ๊ฑฐ์ง? ๋ผ๋ ์๊ฐ์ด ๋ค์๋ค. ๊ทธ๋์ ๋ ์๊ฐ์ ์ผ์ ์๊ฐ๋ง๋ค ์คํฌ๋กค์ ๋ด๋ ค์ฃผ๋ฉด ๋๋ค? ๋ผ๋ ์๊ฐ์ด์๋๋ฐ ์ค์ ๋ก ๋ง์๋ค. ๊ฐ์์์๋ ๋ ๊ฐ์ง ๊ฒฝ์ฐ๋ก ๋๋ ์ ์งํํ๋๋ฐ ์ฒซ ๋ฒ์งธ๋ API๋ฅผ ์ด์ฉํ์ง ์๊ณ ์ฝ๋๋ก ์ง์ ๊ตฌํํ๋ ๋ฐฉ์์ด์๊ณ ๋ ๋ฒ์งธ๋ API๋ฅผ ์ด์ฉํ๋ ๋ฐฉ์์ด์๋ค.
์ฐ์ ์ฒซ ๋ฒ ์งธ, API๋ฅผ ์ด์ฉํ์ง ์๊ณ ์ฝ๋๋ก ์ง์ ๊ตฌํํ๋ ๋ฐฉ์์ด๋ค.
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch({
headless: false,
});
const page = await browser.newPage();
await page.setViewport({
width: 1440,
height: 900,
})
await page.goto('https://brunch.co.kr/search');
await page.click("input.txt_search"); // ๊ฒ์์ฐฝ ํด๋
await page.keyboard.type("Hello World") // ๊ฒ์์ด ์
๋ ฅ
await page.keyboard.press("Enter");
await page.waitForNavigation(); // ์ผ์์ ๋๊ธฐ
let infinteScrollInterval = setInterval(async () => {
await page.evaluate(() => {
window.scrollBy(0, window.innerHeight);
});
}, 1000); // 1000 ms๋ง๋ค ์คํ
setTimeout(async () => {
clearInterval(infinteScrollInterval);
}, 1000 * 10); // 10000 ms๊ฐ ์ง๋๋ฉด ์ข
๋ฃ
// await browser.close();
})();
puppeteer๋ฅผ ์ด์ฉํ๋ค.
goto๋ฅผ ์ฌ์ฉํด์ ํ์ํ๊ณ ์ ํ๋ ์ฌ์ดํธ์ ์ฐ๊ฒฐํ๊ณ
click๋ฅผ ์ฌ์ฉํด์ ๊ฒ์์ฐฝ์ ํด๋ฆญํ๋๋ก ํ๋ค.
์ดํ keyboard.type๋ฅผ ์ฌ์ฉํด์ ๊ฒ์์ด๋ฅผ ์ ๋ ฅํ๊ณ
press๋ฅผ ์ฌ์ฉํด์ Enter๋ฅผ ์ ๋ ฅํ๋๋ก ํ๋ค.
์๊ฐ๋ณด๋ค ๊ฐ๋จํ๋ค. ์ฐ๋ฆฌ๊ฐ ๋ค์ด๋ฒ๋ ๊ตฌ๊ธ์์ ๋ฌด์ธ๊ฐ๋ฅผ ๊ฒ์ํ ๋ ์งํํ๋ ๋ฐฉ์์ ๊ทธ๋๋ก ์ฝ๋๋ก ๊ตฌํํ๋ฉด ๋๋ค.
puppeteer์ ๊ด๋ จ๋ ์ฌ๋ฌ ํจ์๋ค์ ๊ตฌ๊ธ์ ๊ฒ์ํ๋ฉด ์ฐพ์ ์ ์์๋ค.
https://github.com/puppeteer/puppeteer
๊ทธ ๋ค์ waitForNavigation์ ์ด์ฉํด์ ์ผ์์ ์ผ๋ก ๋๊ธฐ๋ฅผ ํ๋๋ฐ ๊ทธ ์ด์ ๋ ํ์ด์ง์ ๋ชจ๋ ์ ๋ณด๋ฅผ ๋ฐ์์ค๊ธฐ๊น์ง ์๊ฐ์ด ๊ฑธ๋ฆฌ๊ธฐ ๋๋ฌธ์ด๋ค.
1000ms, ์ฆ 1์ด๋ง๋ค ํ์ฌ ๋ณด์ด๋ ์ฐฝ์ ๋์ด๋งํผ ์คํฌ๋กค์ ์ด๋ํ๋ค.
10์ด๊ฐ ๋ ๋๊น์ง ๋ฐ๋ณต์ ์ผ๋ก ์งํํ๋ฏ๋ก ๊ฒฐ๊ตญ ์คํฌ๋กค์ด ๋ด๋ ค๊ฐ๊ฒ ๋๋ค.
์๋๋ ์ ์ฝ๋๋ฅผ ์คํํ์ ๋์ ๋ชจ์ต์ด๋ค.
์๊ฑด ๊ฐ์ ์์์ด๋๊น...
๋ ๋ฒ์งธ๋ API๋ฅผ ์ด์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๋ ๋ฐฉ์์ด๋ค.
์ฐ์ ์คํฌ๋กค์ ๋ด๋ฆด ๋ ํ์ด์ง์์ ์ด๋ค ์ผ์ด ์ผ์ด๋๋์ง๋ฅผ ์ ํ์๊ฐ ์๋ค.
์์์ ๊ตฌํํ ์ฝ๋๋ฅผ ์คํํ๊ณ F12๋ก ๊ฐ๋ฐ์๋ชจ๋๋ฅผ ์ด๋ฉด ์คํฌ๋กค์ ๋ด๋ฆด๋๋ง๋ค ํธ์ถ์ด ๋ฐ์ํ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
ํน์ ์ฝ๋์ ํธ์ถ์ด ๋ฐ์ํ๋๋ฐ ์ ๋ณด๋ฉด page number๋ง 1, 2, 3, 4... ์ด๋ ๊ฒ ๋ณํ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
์ฌ์ฉ์๊ฐ ์คํฌ๋กค์ ๋ด๋ฆด๋๋ง๋ค page number๋ง ๋ณํ๋ ๊ฒ์ด๋ค.
๊ทธ๋ผ ์ด ๋ถ๋ถ์ ์๋์ ์ผ๋ก ๋ฐ๋๊ฒ ์ฝ๋๋ฅผ ๊ตฌํํ๋ฉด ๊ฒฐ๊ตญ ๋ฌดํ ์คํฌ๋กค์ด ๋๋ ๊ฒ์ด๋ค.
const axios = require("axios"); // axios ํธ์ถ
const cheerio = require('cheerio'); // cheerio ํธ์ถ
let article = {};
const crawler = (pageNumber) => {
axios
.get(`https://api.brunch.co.kr/v1/search/article?q=Hello%20World&page${pageNumber}=&pageSize=20&highlighter=y&escape=y&sortBy=accu`
)
.then((response) => {
const data = response.data;
article[pageNumber] = data.data.list;
console.log("current page Number : ", pageNumber);
const nextNumber = pageNumber + 1;
if (nextNumber < 10) {
crawler(nextNumber);
return;
}
console.log(article);
});
};
crawler(1);
ํ์ด์ง ๋ด๋ถ์ ์ ๋ณด๋ฅผ ์ ์ฅํ ๋ณ์ article์ ์ ์ธํ๊ณ page number์ ๋ฐ๋ผ data๋ฅผ ์ ์ฅํ๋ ์ฝ๋์ด๋ค.
page number๊ฐ 10์ ๋์ด๊ฐ๋ ๊ฒฝ์ฐ ํจ์๋ ์ข ๋ฃ๋๋ค.
์ด๋ฒ ์ฃผ์ฐจ๋ ๊ฐ์ธ์ ์ผ๋ก ํฅ๋ฏธ๋ก์ ๋ค. ์์์ ๋งํ ๊ฒ์ฒ๋ผ ๋ฌดํ์คํฌ๋กค ์๋๋ฐฉ์์ ๋ํด ๋ฐ๋ก ์๊ฐํด๋ณธ ์ ์ ์์์ง๋ง ์ด๋ฒ ๊ฐ์๋ฅผ ๋ค์ผ๋ฉด์ ์๋ ๋ฐฉ์์ ๋ํด ์๊ฒ ๋๋ค. ์์ฌ์ ๋ ์ ์ js์ ๋ํ ์ค๋ช ์ด ์ ๋ค๋ ๊ฒ์ด๋ค. js๋ฅผ ๊ณต๋ถํด๋ณธ ์ ์ด ์๋ ์ฌ๋์ด๋ผ๋ฉด ๊ฐ์ ์๊ฐ์ ์์ด์ ํฐ ์ด๋ ค์์ด ์์ง๋ง ๋ ๊ฐ์ ๊ฒฝ์ฐ์๋ java, python, c, c++์ ๋ค ํด๋ดค์ง๋ง js๋ ์์ง ๋ค์ด๋ณธ ์ ์ด ์๋ ์ฌ๋์ด๋ผ ๋๊ธฐ, ๋น๋๊ธฐ ๊ฐ๋ ์์ฒด๋ ์์ง ์ ํํ๊ฒ ๋ชจ๋ฅด๋ ์ํ์๋ค. ๊ฐ์์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์๋ค๋? ๊ฐ์ ํ์ ์งํ์ ํ๊ณ ์๋ ๋๋์ด๋ค. ๋ฌผ๋ก ์ฝ๊ฐ์ ์ค๋ช ์ ํด์ฃผ๊ณ ์๊ธดํ์ง๋ง async, await๋ฅผ ์ฒ์ ์ ํ๋ ์ ์ฅ์์ ์ถ๊ฐ์ ์ธ ๊ตฌ๊ธ๋ง์ด ํ์ํ๋ค. ๊ทธ๋๋ ํ์คํ ๊ฐ์ ๋๋ถ์ js ๊ฐ์ ์์ด๋ js์ ๋ํ ์๋ชฉ์ด ์กฐ๊ธ์ฉ ๋์ด๋๋ ๋๋์ด๋ค. ์์ฆ์ Android๋ Spring ๊ณต๋ถ๋ฅผ ํ๊ณ ์์ด์ ์๊ฐ์ด ์๋๋ฐ ์๊ฐ ๋ ๋๋ง๋ค js๋ฅผ ๊ณต๋ถํด์ผ๊ฒ ๋ค๋ ์๊ฐ์ด ๋ค์๋ค. Spring๋ ๊ฒฐ๊ตญ์๋ ํ๋ก ํธ์๋์์ ์ด๋ป๊ฒ ํธ์ถํ๊ณ ๋ถ๋ฌ์ค๋์ง ์๋ ๋ฐฉ์์ ์ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ด๋ค. 2์ฃผ์ฐจ ๋!
node.js node.js node.js node.js node.js
"ํ ๋ฒ์ ๋๋ด๋ Node.js ์น ํ๋ก๊ทธ๋๋ฐ ์ด๊ฒฉ์ฐจ ํจํค์ง Online"์ ๋ฌด๋ฃ๋ก ํ์ฐฌ๋ฐ์ ์์ฑํ ๊ฒ์๊ธ์ ๋๋ค.