웹개발 종합반_homework_3주차

Hyeyeong·2022년 8월 1일
0

웹개발 종합반

목록 보기
9/13
post-thumbnail

🛠 지니뮤직 사이트 순위/곡제목/가수명 크롤링하기

👉 input

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)

# HTML을 BeautifulSoup이라는 라이브러리를 활용해 검색하기 용이한 상태로 만듦
soup = BeautifulSoup(data.text, 'html.parser')


# 전체 반복되는 부분 인덱스
musics = soup.select('#body-content > div.newest-list > div > table > tbody > tr')

for music in musics:
    # rank 값을 예시로 반복되는 부분에서 뒤에 부분 인덱스 / 앞에 두 자리만 표시 / 여백 제거
    a = music.select_one('td.number').text[0:2].strip()

    if a is not None:
        rank = a

        # 텍스트로 변환 / 여백 제거 / 왼쪽에 있는 '19금' 글씨 제거 / 여백 제거
        title = music.select_one('td.info > a.title.ellipsis').text.strip().lstrip('19금').strip()

        # 가수명 텍스트로 변환
        artist = music.select_one('td.info > a.artist.ellipsis').text

        print(rank, title, artist)

📍 습관적으로 if를 써서 값이 없는 데이터를 제거하도록 적었다. 오류는 나지 않았지만, 이 예시는 none제거 조건을 안 썼어도 되는 환경이라 결론적으로는 쓸데없이 두어줄 코드가 길어졌다.

👇 if 조건문 생략 ver.

for music in musics:
    # 반복되는 부분에서 뒷 부분 인덱스 / 앞에 두 자리만 텍스트로 표시 / 여백 제거
    rank = music.select_one('td.number').text[0:2].strip()

    # 텍스트로 변환 / 여백 제거 / 왼쪽에 있는 '19금' 글씨 제거 / 여백 제거
    title = music.select_one('td.info > a.title.ellipsis').text.strip().lstrip('19금').strip()

    # 가수명 텍스트로 변환
    artist = music.select_one('td.info > a.artist.ellipsis').text

    print(rank, title, artist)

👉 output


1) 코드 분석

🔎 추가 서칭한 내용

  • text[글자 시작점:나타낼 글자 수]
  • strip() : 파이썬 여백제거 함수
    strip(['글자') : '글자'를 문자열의 왼쪽과 오른쪽에서 제거
    lstrip(['글자']) : '글자'를 문자열의 왼쪽에서 제거
    rstrip(['글자']) : '글자'를 문자열의 오른쪽에서 제거

(1) rank 나타내기

  • text[0:2]를 적용 전
for music in musics:
    rank = music.select_one('td.number').text
    print(rank)
  • text[0:2]로 앞에 2자리만 나타내도록 적용 후
for music in musics:
    rank = music.select_one('td.number').text[0:2]
    print(rank)
  • strip()으로 불필요한 여백 제거
for music in musics:
    rank = music.select_one('td.number').text[0:2].strip()
    print(rank)

(2) title 나타내기

  • '19금' 표시로 인해 중간에 여백이 있음
for music in musics:
    rank = music.select_one('td.number').text[0:2].strip()
    title = music.select_one('td.info > a.title.ellipsis').text.strip()
    print(rank, title)
  • '19금' 제거, 여백제거
for music in musics:
    rank = music.select_one('td.number').text[0:2].strip()
    title = music.select_one('td.info > a.title.ellipsis').text.strip().lstrip('19금').strip()
    print(rank, title)

❗️궁금한 점

title = music.select_one('td.info > a.title.ellipsis').text.strip().lstrip('19금')

여기까지는 이해되는데 왜 .lstrip('19금') 뒤에 .strip()가 한 번 더 붙어야 완전히 여백이 없어지는지는 아직 모르겠다.


(3) artist 나타내기

  • 가수명 .text 변환 전
for music in musics:
    artist = music.select_one('td.info > a.artist.ellipsis')
    print(artist)
  • 가수명 .text 변환 후
for music in musics:
    artist = music.select_one('td.info > a.artist.ellipsis').text
    print(artist)

(4) 최종값 print(rank, title, artist)

for music in musics:
    rank = music.select_one('td.number').text[0:2].strip()
    title = music.select_one('td.info > a.title.ellipsis').text.strip().lstrip('19금').strip()
    artist = music.select_one('td.info > a.artist.ellipsis').text
    print(rank, title, artist)


참조
Python - String strip(), rstrip(), lstrip() 사용 방법 및 예제

profile
코딩입문 코린이

0개의 댓글