2018-01-25 TIL WPS Homework 멜론 노래 상세정보 가져오기

def get_song_id():
    path_module = os.path.abspath(__name__)
    root_dir = os.path.dirname(path_module)
    path_data_dir = os.path.join(root_dir, 'data')

    file_path = os.path.join(path_data_dir, 'chart_realtime.html')
    with open(file_path, 'rt') as f:
        source = f.read()

    FIND_SONG_ID = re.compile(r'<a href="javascript:melon.link.goSongDetail\(\'(.*?)\'\)', re.S)



    for idx, i in enumerate(re.finditer(FIND_SONG_ID, source)):
        result = i.group(1)
        print('순위:' ,idx+1, 'ID:', result)



def get_song_detail(song_id):

    SONG_DETAIL = 'https://www.melon.com/song/detail.htm?songId='+str(song_id)
    response = requests.get(SONG_DETAIL)
    source = response.text

    soup = BeautifulSoup(source, 'lxml')
    result = []

    FIND_DATE = re.compile(r'.*(\d{4}\.\d{2}\.\d{2})')
    FIND_NAME = re.compile(r'\\t(\w+)\\r', re.S)
    FIND_GENRE = re.compile(r'<dt>장르</dt><dd>(\w+)*?</dd>\s*?', re.S)


    for tr in soup.find_all('div', id='conts'):
        find_song_name = tr.find('div', class_='song_name').text
        song_name = re.search(FIND_NAME, find_song_name)

        artist = tr.find('div', class_='artist').find('a').find('span').text
        album = tr.find('div', class_='meta').find('a').text
        meta_information = tr.find('div', class_='meta').find_all('dd')
        release_date = re.findall(FIND_DATE, str(meta_information))
        genre = re.search(FIND_GENRE, str(meta_information))
        lyric = tr.find('div', class_='lyric').text
        writer = tr.find('div', class_='ellipsis artist').find('a').text
        composer = tr.find('div', class_='ellipsis artist').find('a').text

        result.append({
            'song name': song_name,
            'artist': artist,
            'album': album,
            'release date' : release_date,
            'genre' : genre,
            'lyric' : lyric,
            'writer' : writer,
            'composer' : composer,
        })

    print(result)

출력 결과

순위: 1 ID: 30755375
순위: 2 ID: 30838076
순위: 3 ID: 30851703
순위: 4 ID: 30829858
순위: 5 ID: 30086173
.
.
.
순위: 96 ID: 30784303
순위: 97 ID: 8287788
순위: 98 ID: 30853156
순위: 99 ID: 30853157
순위: 100 ID: 30492276
[{'song name': None, 'artist': '장덕철', 'album': '그날처럼', 'release date': ['2017.11.28'], 'genre': None, 'lyric': '\r\n\t\t\t\t\t\t\t\t참 많은 시간이 흘러가고넌 어떻게 사는 ...아름답던 우리 그날\n', 'writer': '덕인', 'composer': '덕인'}]

각 차트에 있는 song_ID를 뽑고 그에 해당하는 상세페이지까지 들어가서 어느정도 정보를 긁어오는 것에 성공했다. 하지만 아직 깔끔하게 뽑아오기엔 부족한 실력이다.

아직 잘 못하는 것 :

  1. BeautifulSoup 메소드들의 인자들을 어떤 순서로 어떤 오브젝트를 넣어야하는지
  2. Group(), Group(1) 차이를 알고 적재적소에 사용하는 법
  3. 원하는 내용을 추려올 정규표현식

Comments