개인공부/Python
웹 스크레이핑(Web scraping)
lsc99
2023. 9. 10. 16:24
웹 스크레이핑 : 컴퓨터 소프트웨어 기술을 활용해 웹 사이트 내에 있는 정보를 추출하는 것
실습 : 음악 서비스 제공 사이트 벅스(Bugs)에서 음악 순위 정보(곡명&아티스트)를 가져오기
import requests
from bs4 import BeautifulSoup
# bugs 사이트의 url 가져오기
url = "https://music.bugs.co.kr/chart/track/week/total?chartdate=20230902" # chartdate=날짜 -> 날짜 지정
html_music = requests.get(url).text
soup_music = BeautifulSoup(html_music, "lxml")
# p 태그의 요소 중에서 class 속성값이 "title"인 것을 찾고 그 안에서 a 태그의 요소를 추출
titles = soup_music.select('p.title a')
titles[0:7]
가져온 요소에서 곡명 뽑아내기
music_titles = [title.get_text() for title in titles]
music_titles[0:7]
아티스트명 가져오기
# p 태그의 요소 중에서 class 속성값이 "artist"인 것을 찾고 그 안에서 a 태그의 요소를 추출
artists = soup_music.select('p.artist a')
# artists = soup_music.select('p.artist a:not(.more)') # -> class 속성값이 more인 항목 제외
artists[0:7]
가져온 요소에서 아티스트명 뽑아내기
music_artists = [artist.get_text() for artist in artists]
music_artists[0:7]
곡명과 아티스트 데이터 추출 및 출력
for k in range(7):
print("{0}: {1} / {2}".format(k+1, music_titles[k], music_artists[k]))
곡명과 아티스트를 묶어서 순위별로 딕셔너리 변수에 할당하는 코드
music_titles_artists = {}
order = 0
for(music_title, music_artist) in zip(music_titles, music_artists):
order = order + 1
music_titles_artists[order] = [music_title, music_artist]
딕셔너리 변수 music_titles_artists의 키(key)에는 순위에 해당하는 숫자를 넣고 값(value)에는 곡명과 아티스트를 리스트로 만들어서 넣었다. 따라서 딕셔너리의 키에 순위를 입력하면 곡명과 아티스트가 나온다.
music_titles_artists[1] # 1위 알아보기 -> key로 1 입력
앞에서 작성한 코드를 이용해 연도, 월, 일을 인자로 받는 함수로 만들기.
연도, 월, 일을 인자로 받아 지정한 날짜를 기준으로 가져온 주간 뮤직 차트의 곡명과 아티스트를 리스트 형식으로 반환
import requests
from bs4 import BeautifulSoup
# 날짜를 입력하면 벅스 차트에서 주간 음악 순위(1~100위)의 곡명과 아티스트를 반환
def bugs_music_week_top100(year, month, day):
# 월과 일의 경우는 항상 두 자리로 맞춤
month = "{0:02d}".format(month)
day = "{0:02d}".format(day)
base_url = 'https://music.bugs.co.kr/chart/track/week/total?'
url = base_url + 'chartdate={0}{1}{2}'.format(year, month, day)
html_music = requests.get(url).text
soup_music = BeautifulSoup(html_music, "lxml")
titles = soup_music.select('p.title a')
artists = soup_music.select('p.artist a:not(.more)')
music_titles = [title.get_text() for title in titles]
music_artists = [artist.get_text() for artist in artists]
return music_titles, music_artists
연도, 월, 일을 지정해 위 함수를 호출하고 반환된 주간 음악 순위의 곡명과 아티스트를 텍스트 파일로 저장하는 코드
import glob
# 날짜를 지정해 bugs_music_week_top100() 함수를 호출
bugs_music_titles, bugs_music_artists = bugs_music_week_top100(2023, 9, 10)
# 곡명과 아티스트를 저장할 파일 이름을 폴더와 함께 지정
file_name = r'C:\Users\user\Desktop\파이썬 필기자료\bugs_week_top100.txt'
f = open(file_name, 'w') # 파일 열기
# 추출된 노래 제목과 아티스트를 파일에 저장
for k in range(len(bugs_music_titles)):
f.write("{0:2d}: {1}/{2}\n".format(k+1, bugs_music_titles[k], bugs_music_artists[k]))
f.close() # 파일 닫기
glob.glob(file_name) # 생성된 파일 확인