코딩/Node.js

[Node] TIL 크롤링을 배워보자.

카슈밀 2021. 1. 15. 23:23
반응형

구글에서 노드 크롤링을 검색하면 의외로 자료가 없다.

그나마 검색되는 내용중에 'cheerio', 'cheerio-httpcli'를 사용하라고 한다.

하지만 'puppeteer'에 관련된 내용은 없더라.

어쨌든간에 노드크롤링에 대한 해당 내용을 찾아보았다.


data-make.tistory.com/436

 

[Node.js] cheerio module 로 크롤링하기

.Install cheerio module - Install Cheerio from npm  npm i cheerio .Using cheerio 달러 환율의 일별 시세를 크롤링 해보려고 한다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 c..

data-make.tistory.com

 

velog.io/@yesdoing/Node.js-%EC%97%90%EC%84%9C-%EC%9B%B9-%ED%81%AC%EB%A1%A4%EB%A7%81%ED%95%98%EA%B8%B0-wtjugync1m

 

Node.js 에서 웹 크롤링하기

이번에 회사에 입사를 하게 되면서 사내 토이 프로젝트로 뉴스 게시판을 만들기로 하였습니다. 그에 따른 준비로 뉴스 데이터를 가지고 올 웹 크롤러를 Node 기반으로 만들었는데 이 경험을 공유

velog.io

jsonobject.tistory.com/340

 

Node.js, cheerio로 HTML DOM 파씽하기

라이브러리 설치 예제에 사용할 라이브러리를 아래와 같이 프로젝트 루트에서 설치한다. # 프로젝트 초기화 $ npm init -y # request, cheerio, voca 라이브러리 설치 및 적용 $ npm i request request-promise ch..

jsonobject.tistory.com


위 내용은 내가 'cheerio' 라이브러리로 해당 내용을 접근했을 참고했던 내용이다.

 

하지만 결론적으로는 성공했으나 실패했다.

해당 사이트를 복제, html을 죄다 가져오는 것은 성공했다.

하지만 스크래핑으로 내가 필요한 해당 태그로 접근이 불가능..

 

 


커뮤니티에 접근해서 물어보니 axios로 해당 데이터를 가져올때

문제점이 해당 태그들이 생성되지 않은 상태에서 접근하다보니 발생하는 문제라고 한다.

요즘 같이 CSR 페이지들이 늘어나는데 렌더링이 늦게 되는 사이트에서 Tag를 접근하려고 하다보니 생기는 문제였다.

 

이를 해결하기위한 것이 퍼핏티어라고 하길래 퍼핏티어를 찾다가 발견했다.

velog.io/@filoscoder/%EC%9C%A0%EC%9A%A9%ED%95%9C-Js-%EC%9B%B9-%EC%8A%A4%ED%81%AC%EB%9E%98%ED%8D%BC-Puppeteer-rdk49nmlyc

 

유용한 Javascript 웹 스크래퍼: Puppeteer

🎯 필자는 Plating의 소프트웨어 엔지니어로 근무 중이며 사내 커뮤니케이션 툴로 telegram을 이용한다. 저희 고객사는 미리 제공된 페이지를 통해 매일 메뉴를 선택하고 주문을 한다. 마감시간이

velog.io


이유는 경로문제를 해결하지 못 했다.

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에 저장된 내용을 내가 필요한 내용으로 스크래핑해보자.

 

솔직히 스크래핑이 제일 어렵다.

그외에는 뭐 ㅎㅎ

728x90