본문 바로가기
개발공부/NodeJS

NodeJS 크롤링 만들어보기 (cheerio)

by bzerome240 2023. 5. 27.

크롤링

웹페이지 안에 있는 필요한 데이터를 추출하는 것

크롤링에 필요한 모듈은 2가지가 있다.

 

axios

  • Promise API를 활용하는 HTTP 비동기 통신 라이브러리
  • 크롤링 할 웹페이지를 가져오는데 사용한다.

 

cheerio

  • HTML 문서를 파싱하여 필요한 정보만을 가져올 수 있도록 도와주는 모듈이다.
  • jQuery 문법과 유사하다.

 


 

1. 폴더 생성

 

2. npm 초기화

npm init -y

 

3. 필요한 패키지 설치

  • axios, cheerio, express
npm i axios cheerio express
  • nodemon
npm i -g nodemon

 

4. index.js 코드작성

  • 크롤링 할 사이트와 DOM 구조에 맞게 가져오도록 작성하기

나는 조만간 일본 여행을 갈 예정이라서 네이버에 “도쿄 여행” 이라고 검색했을때 나오는 URL과 게시물을 긁어와 보고 싶었다.

const axios = require("axios")
const cheerio = require("cheerio")
const express = require("express")

const log = console.log
const app = express()

const getHtml = async () => {
  try {
    return await axios.get("https://search.naver.com/search.naver?where=view&query=%EB%8F%84%EC%BF%84%20%EC%97%AC%ED%96%89&sm=tab_opt&nso=so%3Add%2Cp%3A&mode=normal&main_q=&st_coll=&topic_r_cat=");
  } catch (error) {
    console.error(error);
  }
};

app.get('/home', function(request, response) {
    getHtml().then(html => {
        let ulList = [];
        const $ = cheerio.load(html.data);
        const $bodyList = $(".lst_total li");
    
        $bodyList.each(function(i, elem) {
            ulList[i] = {
                title: $(this).find('.api_txt_lines').text(),
                url: $(this).find('.api_txt_lines').attr('href'),
                image_url: $(this).find('.api_get').attr('src'),
                date: $(this).find('.sub_time').text()
            };
        });
    
        const data = ulList.filter(n => n.title);
        return data;
    })
    .then(res => {
        // log(res)
        response.send(res)
    })
})

app.listen(8080, () => log('connected'))

 

5. 실행

  • 콘솔창
$ nodemon index.js
[
  {
    title: '[두티일상] 10월이 가고 있다구~ 내 20대도 가고 있다구 ~샀어오 ㅎㅎ 산뽀부모님께서 1월 중에 같이 일본에 놀러가자고 하셨어오 여행경비 내주신다고 파워 계획형은 가만히 있을수 없쥬 !! 삿포로랑 오사카랑 도쿄
중 고민고민 여행 가려면 아쥬 천천히 취업해야게따 키키',
    url: 'https://blog.naver.com/dooyein/222914987411',
    date: '1분 전'
  },
  {
    title: '아이랑 나트랑 여행 계획하기(나트랑 항공권, 나트랑 호텔 예약)여행하기하고 오려고 해요. 우리 부부가 정한 기준에 일단 추운 날씨가 아닌 나라는 빼고, 여름 옷을 싸서 짐도 가볍고, 한국이 추울 때 더운 나라에 
서 힐링하자가 목표였어요. 그래서 일본 등은 가까워도 제외되고, 도쿄...',
    url: 'https://blog.naver.com/k50284/222914978709',
    date: '11분 전'
  },
  {
    title: '블챌일기첫 혼자여행이 도쿄인데.. 복잡한걸 싫어해서 그런가. 흠, 비행기 보니까 jal이나 ana통해서 하네다 입국 생각하고 있는데.. 일단 월급 들어오면 예약할 예정이라 계속 보고있다. 일본스타벅스카드에 돈이  
남아서...',
    url: 'https://blog.naver.com/kkek09/222914978177',
    date: '11분 전'
  },
  {
    title: '주간일기 챌린지 20 (20221024-20221030)2022년 10월 25일 화요일 여행도서관 갔는데 광주 엽서를 무료로 받을 수 있었다눈? 생가고다 고퀄리티... 벌써 단풍이 들었어♥ 오랜만에 먹은 도쿄바나나 파이 완전 맛있던 
데? 아웅... 토익... 공부하는 게 힘든 게...',
    url: 'https://blog.naver.com/qotmf/222914976339',
    date: '13분 전'
  },
...
]
  • 웹서버

728x90
반응형

댓글