🎯지니뮤직의 1~50위 곡 스크래핑🎯

✅ 지니뮤직 사이트

https://www.genie.co.kr/chart/top200?ditc=D&ymd=20200403&hh=23&rtm=N&pg=1


✅ 순위/ 곡 제목/ 가수를 스크래핑 하기

  • 힌트: 순위와 곡제목이 깔끔하게 나오지 않을 때(EX) 옆에 여백이 있다던가, 다른 글씨도 나온다던가...), 파이썬 내장 함수인 scrip() 사용하기

📍 1st. 크롤링 기본 세팅

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=D&ymd=20200403&hh=23&rtm=N&pg=1',headers=headers)

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

# 코딩 시작

📍 2nd. select를 이용해서, trs을 불러오기

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

📍 3rd. trs 반복문 돌리기

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

📍 4th. 순위/ 곡 제목/ 가수 print 하기

for tr in trs:
    title = tr.select_one('td.info > a.title.ellipsis').text.strip()
    rank = tr.select_one('td.number').text[0:2].strip()
    artist = tr.select_one('td.info > a.artist.ellipsis').text
    print(rank, title, artist)
  • 태그 안의 텍스트를 찍고 싶을 땐 → 태그.text
  • 태그 안의 속성을 찍고 싶을 땐 → 태그.['속성']
  • .strip()은 '문자열' 또는 '공백'을 제거해준다.

<'문자열 인덱싱(슬라이싱)'>

  • 파이썬에서는 ‘슬라이싱(slice)’이라는 기능을 제공하는데, 다음과 같이 가져오고 싶은 문자열의 범위를 지정하면 된다.
  • 위 코드를 보면 [0:2]라는 표현을 사용했다.
  • [ ]는 슬라이싱할 범위를 지정할 때 사용하는 기호이다.
  • 0은 시작 위치를, 2는 끝 위치를 의미한다.
  • 시작과 끝을 구분하기 위해 그 사이에 콜론(:)을 사용한다.

🏆지니뮤직의 1~50위 곡 스크래핑 완성🏆

<완성 코드>
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=D&ymd=20200403&hh=23&rtm=N&pg=1',headers=headers)

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

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

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

0개의 댓글