Melon (멜론)이 언제부터인지 신규 API의 신청을 받지 않고 있다. 개인적으로 진행하고 있는 프로젝트에 멜론 실시간 순위 데이터를 가져오고 싶어서 알아보던 중 데이터 크롤링을 할 수 있는 npm package을 알게되어 소개하고자 한다.

Intro

준비

  • Node.js
  • npm

Project 준비

원하는 디렉토리에 프로젝트 폴더 하나 생성후 js파일 생성
필자는 crawling_test/melonchart.js

Terminal에서 프로젝트 폴더 진입

Package 생성

npm 설치

Cheerio

Node.js에서 HTML 데이터 파싱을 하기 위해 Cheerio를 사용.

Fast, flexible, and lean implementation of core jQuery designed specifically for the server
https://www.npmjs.com/package/cheerio

Request

Cheerio에서 파싱할 데이터를 가져오는 역할을 Request가 합니다.

Request is designed to be the simplest way possible to make http calls. It supports HTTPS and follows redirects by default.
https://www.npmjs.com/package/request

npm 설치 확인

crawling_test/package.json

위와 같이 dependencies 밑에 cheerio와 request가 있으면 성공.

멜론 데이터 가져오기

두 패키지를 불러옵니다.

request 이용하여 웹페이지 load.

데이터 확인

class = "ellipsis rank01"spana 에서 곡명 확인.

class = "checkEllipsis"a 에서 아티스트명 확인.

데이터 파싱

HTML script를 읽어가며 지정해준 클래스의 정보를 가져옵니다.

결과 #1

이렇게 마지막 결과 (100위) 만 가져오게 됩니다.

결과 #1 수정

배열을 이용하여 지나간 값을 저장합니다.

결과 #2

무언가 이상합니다..
아티스트가 두명 이상일 경우 아티스트가 밀립니다

다시 수정합니다.

결과 #2 수정

> a를 지워줍니다. checkEllipsis 밑에 여러 아티스트가 모두 있기 때문에 한번에 가져오기 위해서 a태그까지 내려가면 안됩니다.

결과 #3

완성

번외

날짜, 업데이트 시간 등도 모두 웹페이지에서 가져올 수 있습니다.

최종 코드 및 결과

코드

 

결과

 

마무리

모든게 독학이라 코드도 지저분하고 정신 없습니다.. 자유로운 지적 부탁드리며, 모든 파일은 github에 올려놓았습니다.

Melon 홈페이지의 HTML 구성이 변경되면 다시 데이터를 가져와야 한다는 단접이 있지만, 웬만해서는 잘 바꾸지 않는거 같으니 당분간은 괜찮을듯 싶다.

This Post Has 10 Comments

  1. 안녕하세요, 노드js연습하던중 유익한글 잘 보았습니다. 저도 해보던중 궁금한 부분이있는데 라우팅을하고 특정url로 들어왔을때 멜론리스트를 보여주려면 어떤식으로 해야하나요..? 그냥 할때는 정상적으로 html을 가져오지만 라우팅안에서 의 동작이 정상적이지 않네요
    예를들어

    app.get(‘/list’,function(){
    request(url,function(){
    // code
    });
    })
    위와같이 한다고할때 내용이 나오지 않던데 어떻게 해야할지 궁금합니다.

    1. 그 상황이 어떤 상황인지 확실히 모르겠는데, request 할때 header도 추가해 보세요

  2. 개발도구 뭐 사용하세요?
    윈도우 콘솔, 비주얼 코드 콘솔 전부 한글이 깨지네요
    값을 받아오는 사이트 문제일까요?

      1. 이전에 iconv를 사용할려고 했을때 각종 오류를 뿜어내서 설치조차 못했었는데
        iconv-lite라는 자바스크립트로만 만들어진 모듈도 있었군요..
        답변 감사합니다!

  3. 비전공자라 어려워서 눈이 돌아가지만 한줄기 빛을 보고 갑니다^^
    “Parsing” 이라는 단어도 몰라서 검색도 못해보다가 도움을 얻어가네요~

    1. 도움이 되셨다니 다행입니다! 저도 비전공자입니다 우리도 할수있어요!

  4. 노드도공부하는겸.. 때마침 파싱도 해보고싶었는데 이렇게 좋은 글 올려주셔서 감사합니다.^^
    많이 배워갑니다.!

    1. 예전포스팅이라 정상작동 안할수도있어서.. 민망하네요.. 오류있으면 조만간 수정하도록 할게요ㅎㅎ

  5. 앞에 변수 선언문은 왜 안쓰세요? 그거때문에 한시간동안 해멨네요
    하지만 감사합니다. 좋은공부하고갑니다 ^.^

댓글 남기기

Close Menu