이번 과제는 지니뮤직 사이트의 음원 순위를 크롤링하는거였다.

사실 과제 자체가 많이 어렵진 않았다.

3주차에서 배운 내용들과 추가로 알려주신 function을 이용하면 할 수 있었음.

처음에 썼던 코딩은 이랬다

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')

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

for song in songs:
    a = song.select_one('td.info')
    b = song.select_one('td.number')

    rank = b.text[0:2].strip()
    artist = song.select_one('a.artist.ellipsis').text.strip()
    title   = song.select_one('a.title.ellipsis').text.strip()

    print(rank, title, artist)

1. 문제 발견

그런데 이렇게 해보니 문제가 하나 발생했다 ^^

저스틴 비버의 피치쓰... 이눔자식에.... 쓸데없는 친구 하나가 딸려오는 것이었다

이렇게....

딴건 잘 나오는데 피치쓰...왜이래...?

 

2. 원인 분석

결과물이 이렇게 나오는 이유는, 

크롤링으로 읽어오는 class에

 

유일하게 피치쓰만

19금으로 span class가 하나 더 있기 때문이었다 ^^

혹시 숙제 해설 코드에는 이거 없애는게 반영되어있나? 싶어서 코드 복사하고 실행해봤지만 마찬가지였다 ㅎㅎ

 

이게 너무나 거슬려서 해결을 해보려 했지만 증말 쉽지 않았다 ㅠ

ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠ

거의 1시간 가량 구글링하고 테스트해봐서 성공ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠ

3. 해결 방법

구글링을 해보았더니 function 하나를 알아낼 수 있었다.

바로 'descompose()'!!!

 

class의 아래에 있는 자식 태그를 골라내어서 지울 수 있는 메서드다.

descompose에 대한 설명이 잘 되어있는 블로그는 아래를 참조.

 

https://studyforus.com/innisfree/650714

 

[BeautifulSoup] 자식태그를 제거하기 - .decompose() & .extract() - Study For Us

안녕하세요?날씨가 쌀쌀해졌는데 다들 건강히 계시는지요? ^^이번 강좌에서는 BeautifulSoup에서 상대적으로 덜 사용되지만 유용한 두 메서드를 다뤄보고자 합니다.BeautifulSoup을 사용하다보면 자식

studyforus.com

 

이친구를 사용해서 없애보려 했지만 이 또한 쉽지 않았다.

왜냐하면 다른 곡들에는 span 태그가 없는데 피치쓰만 있으니까....

span class를 지워줘! 하면

여긴 span 없는데?ㅠ

와 같은 결과가 나왔다.

span 없는데 뭘 지우라는거니?ㅠㅠ

 

이를 해결하려면

"span이 있으면 > 지워주고 title 뽑아내

           없으면 > 그냥 title 뽑아내"

와 같이 조건문을 이용해서 구분을 지어줘야한다.

 

if a.span is not None:
    a.span.decompose()
    title = song.select_one('a.title.ellipsis').text.strip()
else:
    title   = song.select_one('a.title.ellipsis').text.strip()

이렇게 구분을 지어줘서

성공적인 결과를 볼 수 있었다 움하하

 

 

짜면서 알게 된 건, decompose는 단순히 "지워주는" 메서드라 굳이 따로 변수를 설정할 필요가 없는 것 같다.

뭔 말이냐면...

aa = a.span.decompose()
title = song.select_one('aa.title.ellipsis').text.strip()

이렇게 a를 지운게 aa고, aa에서 title 뽑아내줘

하면 오류난다. 아마 내가 매트랩에 익숙해져 있어서 자꾸 변수 설정 하려는 것 같은데ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

python에 익숙해지는 시간이 필요할 듯 하다....

 

4. 결론

사실 이것저것 막 해보면서 성공한 결과라 ㅠㅠ 원리를 잘 이해하고 짰는지는 모르겠다...

decompose 함수를 알고 나서도 거의 30분에서 1시간 정도 헤맨 듯 ㅠㅠ

class와 tag, 부모 자식 태그에 대한 이해도가 있어야 크롤링을 잘 할 수 있을 것 같다.

검색하다가 잘 정리해놓은 블로그가 있길래 또 따옴

https://blog.naver.com/PostView.naver?blogId=kiddwannabe&logNo=221177292446&redirect=Dlog&widgetTypeCall=true&directAccess=false 

 

코.알.못. 마케터도 크롤링하기#4. BeautifulSoup으로 정보가져오기

설명 영상을 게시글 아래에 추가하였습니다. (updated 2021.01.15) html 구조를 살펴보았다면, 이제는 실제...

blog.naver.com

시간을 엄청 많이 쓰긴 했지만 ㅠ_ㅠ

그래도 막상 성공하고나니 매우매우 뿌-듯 (●'◡'●)

기록하지 않고 넘어가기 아까워서 일지를 따로 써봤다.

+ Recent posts