[업무 자동화]/파이썬

[파이썬] 음원 차트 수집하기(feat. 코드 포함)

시간 확보러 2024. 9. 22. 08:00
728x90

나의 경쟁력을 키우기 위해 파이썬을 공부하고 있는 직장인입니다.

 

파이썬의 문법을 공부하기 보다는, 활용에 치중을 두고 있습니다.

(저는 전문가가 아니기 때문에..)

 

이런 사유로 책을 고를 때도 실용위주로 선정하곤 합니다.

그래서 이번에 선정한 책은 "커리어 스킬업 파이썬 업무 자동화"입니다.

 

 

책은 크게 3단계로 구분되어 있다.

1단계 : 파이썬 기초

2단계 : 파이썬 크롤링

3단계 : 파이썬 업무 자동화

 

1단계 파이썬 기초에서는 기초적인 문법을 알 수 있다.

해당 내용은 알고있었지만, 저자가 쉽게 설명을 해줘서 좀 더 깊게 이해를 할 수 있었다.

 

2단계부터는 실제로 사용할 수 있는 코드를 작성한다.

 

처음에는 맛보기로 음원 차트 수집 코드를 실행해 본다.

(코드는 저자가 올려놓은 깃허브에서 다운받을 수 있다.)

 

코드를 실행하면 아래와 같이 순위가 나오고, 엑셀이 만들어 진다.

 

멜론_크롤링.xlsx
0.49MB

 

※ 파이썬 코드

(사전에 bs4, requests, openpyxl, pillow는 설치를 해야한다.)

 

import requests
import urllib.request as req
from bs4 import BeautifulSoup
import os
import openpyxl
import datetime
from openpyxl.drawing.image import Image
from openpyxl.styles import Font, Alignment, PatternFill, Color, Border, Side

# 기존 엑셀 파일 삭제
if os.path.exists("./멜론_크롤링.xlsx"):
    os.remove("./멜론_크롤링.xlsx")

code = requests.get("https://www.melon.com/chart/index.htm", headers={"User-Agent":"Mozilla/5.0"})
soup = BeautifulSoup(code.text, "html.parser")
title = soup.select("div.ellipsis.rank01 > span > a")
name = soup.select("div.ellipsis.rank02 > span")
album = soup.select("div.ellipsis.rank03 > a")
img = soup.select("a.image_typeAll > img")

# 이미지 저장할 폴더 생성
if not os.path.exists("./멜론이미지"):
    os.mkdir("./멜론이미지")

# 엑셀 파일 생성
if not os.path.exists("./멜론_크롤링.xlsx"):
    openpyxl.Workbook().save("./멜론_크롤링.xlsx")

# 엑셀 파일 불러오기
book = openpyxl.load_workbook("./멜론_크롤링.xlsx")

# 쓸데 없는 시트 지우기
if "Sheet" in book.sheetnames:
    book.remove(book["Sheet"])
sheet = book.create_sheet()
now = datetime.datetime.now()
sheet.title = f"{now.year}년 {now.month}월 {now.day}일 {now.hour}시 {now.minute}분 {now.second}초"

# 열 너비 조절
sheet.cell(row=1, column=1).value = "앨범 이미지"
sheet.cell(row=1, column=2).value = "곡 이름"
sheet.cell(row=1, column=3).value = "가수 이름"
sheet.cell(row=1, column=4).value = "앨범 이름"
sheet.column_dimensions["A"].width = 15
sheet.column_dimensions["B"].width = 50
sheet.column_dimensions["C"].width = 30
sheet.column_dimensions["D"].width = 50

for i in range(len(title)):
    img_file_name = f"./멜론이미지/{i+1}.png"
    req.urlretrieve(img[i].attrs["src"], img_file_name)
    print(f"{i+1}위. {title[i].text} - {name[i].text}")
    img_for_excel = Image(img_file_name)
    sheet.add_image(img_for_excel, f"A{i+2}")
    sheet.cell(row=i + 2, column=2).value = title[i].text
    sheet.cell(row=i + 2, column=3).value = name[i].text
    sheet.cell(row=i + 2, column=4).value = album[i].text
    sheet.row_dimensions[i+2].height = 90

# 폰트
bold_font = Font(size=12, bold=True)
font = Font(size=12)

# 가운데 정렬
alignment_center = Alignment(horizontal="center", vertical="center")

# 셀 배경색
color_green = PatternFill(patternType="solid", fgColor=Color("4FC142"))

# 테두리
border = Border(left=Side(style="thin"), right=Side(style="thin"), top=Side(style="thin"), bottom=Side(style="thin"))

# 첫 행에 서식 지정
for row in sheet["A1:D1"]:
    for cell in row:
        cell.font = bold_font
        cell.alignment = alignment_center
        cell.fill = color_green
        cell.border = border

# 데이터 부분에 서식 지정
for row in sheet["A2:D101"]:
    for cell in row:
        cell.font = font
        cell.alignment = alignment_center
        cell.border = border

book.save("./멜론_크롤링.xlsx")

 

 

코드를 포함해서 공유드리니,

파이썬에 해당 코드만 넣어서 실행하면 된다.

728x90