본문 바로가기
개발일지

HW. 3주차 숙제 해설

by 유안찡 2022. 10. 27.

Q. 지니뮤직의 1~50위 곡을 스크래핑 해보세요.

 

 

1. 순위, 제목, 아티스트 스크래핑(가져오기)

 

1) 순위 스크래핑

- 순위(1위) 우클릭 후 검사 들어가기

 

 

- 검사 -> copy selector 

 

 

 

- genie.py에 카피한 거 복붙 

 

 

- 2위도 똑같이 우클릭 후 copy selector 

 

 

- 1,2위 파이썬에 복붙하기 

- 드래그 한 부분들이 같음  

 

 

- 같은, 중복되는 부분들을 복사해서 trs(이름 임의로 정한 것이므로 다른 것으로 해도 됨)에 soup.select() 하기 

#body-content > div.newest-list > div > table > tbody > tr:nth-child(1) > td.number
#body-content > div.newest-list > div > table > tbody > tr:nth-child(2) > td.number

trs = soup.select('#body-content > div.newest-list > div > table > tbody > tr')

 

- #body-content부터 지우고,

- for문으로 돌리기 

trs = soup.select('#body-content > div.newest-list > div > table > tbody > tr')
for tr in trs:
    rank = tr.select_one('td.number')
    print(rank)

 

- 그냥 print(rank)를 누르면 결과값이 이렇게 복잡하게 나온다. 

 

 

- 하지만 랭크를 텍스트로 출력하라는 의미로 rank.text 출력하면 이런 식으로 나온다. 

 

 

- 0부터 2까지 끊어라는 의미

print(rank.text[0:2])

 

- rank.text 0부터 2까지 끊어라고 하면 숫자만 출력된다. 

 

-  strip()은 양쪽 여백 다 없애버려라 라는 의미 

print(rank.text[0:2].strip())

 

 

 

 

2) 제목 스크래핑 

 

- 위의 순위와 똑같이 제목도 지니에서 우클릭 후 검사 -> 복사 후 프로젝트에 복붙하기 

 

 

- #body ~ tr 까지 똑같다.

 

- #body ~ tr 를 제외한 뒷부분을 타이틀 셀렉트에 붙여준다. 

 

 

- text.strip() - 텍스트로 바꿔주고 공백을 없애는 strip()을 사용하기 

 

 

 

3) 아티스트 스크래핑 

 

- 위의 순위, 제목과 똑같이 제목도 지니에서 우클릭 후 검사 -> 복사 후 프로젝트에 복붙하기 

 

- 이것도 복사 후 뒷부분만 가져오면 된다. 

 

- 출력하면 rank, title, artist 셋다 출력이 잘 되는 것을 알 수 있다. 

 

 

 

- 최종 코드 전체 ! 

import requests
from bs4 import BeautifulSoup

headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}
data = requests.get('https://www.genie.co.kr/chart/top200?ditc=M&rtm=N&ymd=20210701',headers=headers)

soup = BeautifulSoup(data.text, 'html.parser')

trs = soup.select('#body-content > div.newest-list > div > table > tbody > tr')

for tr in trs:
    rank = tr.select_one('td.number').text[0:2].strip()
    title = tr.select_one('td.info > a.title.ellipsis').text.strip()
    artist = tr.select_one('td.info > a.artist.ellipsis').text
    print(rank, title, artist)