320x100
#1 멜론 뮤직
import chromedriver_autoinstaller
from selenium import webdriver
chromedriver_autoinstaller.install()
url = 'https://www.melon.com/chart/'
driver = webdriver.Chrome('드라이버경로')
driver.get(url)
from bs4 import BeautifulSoup
html = driver.page_source
soup = BeautifulSoup(html,'html.parser')
songs = soup.select('tr.lst50')
len(songs)
new_songs = soup.select('table > tbody > tr')
len(new_songs)
# 가수 찾기
new_songs[0].select('div.ellipsis.rank02 > a')[0].text
song_data = []
rank = 1
for song in new_songs:
title = song.select('div.ellipsis.rank01 > span > a')[0].text
singer = song.select('div.ellipsis.rank02 > a')[0].text
song_data.append(['Melon' ,rank, title, singer])
rank += 1
import pandas as pd
columns = ['서비스', '순위', '타이틀', '가수']
df = pd.DataFrame(song_data, columns= columns)
df.head()
df.to_excel('melon.xlsx', index=False)
#2 벅스 뮤직
url = 'https://music.bugs.co.kr/'
driver = webdriver.Chrome('드라이버 경로')
driver.get(url)
html = driver.page_source
soup = BeautifulSoup(html, 'html.parser')
main = soup.select('table.list.trackList.byChart > tbody')
main = main[0]
len(main)
# 가수
main[0].select('p.artist > a')[0].text
data_list = []
for i in main:
try:
# 순위
rank = i.select('strong')[0].text
# 타이틀
title = i.select('p.title > a')[0].text
# 가수
singer = i.select('p.artist > a')[0].text
data_list.append(['Bugs', rank, title, singer])
except:
pass
import pandas as pd
column = ['서비스', '순위','타이틀', '가수']
df = pd.DataFrame(data_list, columns= column)
df.tail(2)
df.to_excel('bugs.xlsx', index=False)
===========================================
# 벅스 뮤직 복기
# 이게 답안 메인 뼈대가 되는 태그잡이고
soup.select('table.byChart > tbody > tr')
# 100
# 이게 내가 쓴 태그잡이다.
soup.select('table.list.trackList.byChart > tbody')
# 1
복기를 해보자면, 답안 코드는 len 값이 100개고,
내 코드의 len 값은 1개다.
이는 매우 중요한데, 차후에 반복문 돌리면서 작업을 하기에 용이하기 때문이다.
코드의 생김새는 다르지만 tbody까지의 적용은 같다.
하지만 답안 코드가 좀 더 세부적으로 들어가서 길이가 100이 될 수 있었다.
즉, 태그로 반복문을 돌리려면 이 예제의 경우에 랭킹, 제목, 가수를 모두 포함하고 있지만,
그것이 또한 묶음별로 떨어져서 반복문을 하기에 용이한 태그를 처음으로 지정해 주는 것이 좋다.
물론 결과적으로 내 코드도 해결은 하였지만, 답안 코드가 훨씬 유의하다는 것을 느꼈다.
#3 지니 뮤직
url = 'https://www.genie.co.kr/chart/top200'
driver = webdriver.Chrome('드라이버경로')
driver.get(url)
html = driver.page_source
soup = BeautifulSoup(html, 'html.parser')
driver.maximize_window()
# 메인요소 지정
main = soup.select('tr.list')
# 데이터 담을 그릇
gini_list = []
# 요소 추적
for i in main:
# 랭킹
rank = i.select('td.number')[0].text.split()[0]
# 제목
# 이게 내 코드이고 \n의 굴레에서 헤어나오기 위해 split을 해줬는데, 이거는 또 문제가 띄어쓰기까지 모두
# 분할된다는 것이였다.
# print(i.select('a.title.ellipsis')[0].text.split())
# 다행히 답안 코드는 strip()으로 알려주셨고, 유의미한 텍스트 와 텍스트간의 부분은 제거하지 않고, 그 외적 부분을
# 제거하는 느낌인듯 하다.
title = i.select('a.title.ellipsis')[0].text.strip()
# 가수
singer = i.select('a.artist.ellipsis')[0].text
gini_list.append(['Genie', rank, title, singer])
len(gini_list)
# 컬럼에 대한 옵션은 판다스로 변환할때 지정해 줘야한다는것을 이번을 통해서 다시금 알게되었다.
column = ['서비스', '순위', '타이틀', '가수']
df = pd.DataFrame(gini_list, columns=column)
df.head(2)
# 엑셀로 보낼때의 옵션은 index = False
# 그래야, 데이터프레임에 담겨있던 행 넘버가 없어진다.(인덱스넘버)
df.to_excel('genie.xlsx', index=False)
#4 3개사의 뮤직 랭킹정보 통합하기
# 윈도우는 경로처리가 쉬운데, 맥은 아직 잘 모르겠다. 이건 더 배워야겠다.
excel_names = ['melon.xlsx', 'bugs.xlsx', 'genie.xlsx']
len(excel_names)
# 이 운용방식을 처음본다.
append_datas = pd.DataFrame()
for i in excel_names:
pd_data = pd.read_excel(i)
append_datas = append_datas.append(pd_data)
append_datas.info()
append_datas.to_excel('total.xlsx', index=False)
마지막에 랭킹정보를 통합하는 것은 사실 운용방식을 전혀 생각지도 못한 방법이여서 신선했다.
내가 썼다면 저 코드의 2배정도는 써서 해결했을 것 같다.
짜임새 있게 연구하며 써보도록 노력해야겠다.
300x250
'개발일지 > 임시카테고리' 카테고리의 다른 글
SQL Scalar Functions (0) | 2022.07.02 |
---|---|
SQL group by 결과값 이상하다... 이건 아닌데 (0) | 2022.07.02 |
SQL 루틴 첫번째(내가 일하기 쉽게하기 위해만든) (0) | 2022.07.01 |
제로베이스 SQL 과제중 (0) | 2022.07.01 |
sql 쿼리 문제 (0) | 2022.07.01 |