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를 뽑고 그에 해당하는 상세페이지까지 들어가서 어느정도 정보를 긁어오는 것에 성공했다. 하지만 아직 깔끔하게 뽑아오기엔 부족한 실력이다.
아직 잘 못하는 것 :
- BeautifulSoup 메소드들의 인자들을 어떤 순서로 어떤 오브젝트를 넣어야하는지
- Group(), Group(1) 차이를 알고 적재적소에 사용하는 법
- 원하는 내용을 추려올 정규표현식
Comments