구글에서 노드 크롤링을 검색하면 의외로 자료가 없다.
그나마 검색되는 내용중에 'cheerio', 'cheerio-httpcli'를 사용하라고 한다.
하지만 'puppeteer'에 관련된 내용은 없더라.
어쨌든간에 노드크롤링에 대한 해당 내용을 찾아보았다.
위 내용은 내가 'cheerio' 라이브러리로 해당 내용을 접근했을 참고했던 내용이다.
하지만 결론적으로는 성공했으나 실패했다.
해당 사이트를 복제, html을 죄다 가져오는 것은 성공했다.
하지만 스크래핑으로 내가 필요한 해당 태그로 접근이 불가능..
커뮤니티에 접근해서 물어보니 axios로 해당 데이터를 가져올때
문제점이 해당 태그들이 생성되지 않은 상태에서 접근하다보니 발생하는 문제라고 한다.
요즘 같이 CSR 페이지들이 늘어나는데 렌더링이 늦게 되는 사이트에서 Tag를 접근하려고 하다보니 생기는 문제였다.
이를 해결하기위한 것이 퍼핏티어라고 하길래 퍼핏티어를 찾다가 발견했다.
이유는 경로문제를 해결하지 못 했다.
const axios = require("axios");
const cheerio = require("cheerio");
const getHtml = async () => {
try {
return await axios.get("https://www.starbucks.co.kr/menu/drink_list.do?CATE_CD=product_cold_brew");
} catch (error) {
console.error(error);
}
};
getHtml()
.then(html => {
const $ = cheerio.load(html.data); // 정상 작동구간.
const $bodyList = $('div.product_list').children('dd').children('ul.product_cold_brew').children('a');
for (let i = 0; i < $bodyList.length; i++) {
console.log($(this).find('img').attr("src"));
}
});
정상적으로 복제해서 '$' 담겨지나 해당 태그로 접근이 불가능했다.
이에 다른 방법을 찾아보려고, 퍼핏티어를 이용해보았다.
const puppeteer = require('puppeteer');
const fs = require('fs');
const main = async() => {
const browser = await puppeteer.launch(); // 브라우저 작동시작
const page = await browser.newPage(); // 해당 페이지를 복제.
await page.goto("https://www.starbucks.co.kr/menu/drink_list.do", {waitUntil: 'networkidle2'}) // 접속
await page.waitFor(1000) // 대기시간
const html = await page.content(); // 해당 페이지 데이터
fs.writeFileSync('./starbucks.html', html); // 동기로 파일작성
await browser.close(); // 브라우저 종료
}
main();
이때 크롤링을 하려면 중요한 내용이 있다.
바로 대기시간을 주어 본 서버에서 크롤링을 할 경우 부하를 주지 않아야하는 것이다.
왜냐하면 크롤링을 막아둔 사이트에서 크롤링시에 100% 문제가 있고,
그나마 열어둔 곳 서버에서는 영업방해에 해당되는 행위기때문에 서버에 부하를 주지 않도록
대기시간을 주어 일부러 해당 사이트 공격하는 행위가 되지 않도록 해야한다.
보통 해당 회사의 정책을 보려면 robots.text에 해당 내용이 적혀있다.
이제 해당 내용은 html에 정상적으로 저장이 되었다.
해당 html에 저장된 내용을 내가 필요한 내용으로 스크래핑해보자.
솔직히 스크래핑이 제일 어렵다.
그외에는 뭐 ㅎㅎ
'코딩 > Node.js' 카테고리의 다른 글
Koa 웹프레임워크 (0) | 2021.02.14 |
---|---|
[Node] 노드를 공부하면서 이해했는데, 의문점이 생겼다. (0) | 2021.01.25 |
[Node] TIL-2'Express Generator' 사용하기. (0) | 2021.01.14 |
[node] TIL 노드를 배우고 있다. Express를 배움 (0) | 2021.01.11 |
[node]노드 -Today I'm Learned (1)"node의 기능" (0) | 2020.10.27 |