지나가던 개발자

[Python] beautifulsoup를 사용한 웹 크롤링 예제 - 노래 가사 가져오기 본문

Developing/Python

[Python] beautifulsoup를 사용한 웹 크롤링 예제 - 노래 가사 가져오기

KwonYongHyeon 2021. 12. 20. 19:47

 Python에는 여러가지 모듈이 있습니다. 진짜 많은 모듈들. 그 중 오늘은 beutifulsoup라고, 웹 크롤링을 하는 모듈을 써보려 합니다.

 

Beautiful Soup is a Python library for pulling data out of HTML and XML files.

 

 그렇다고 하네요.(출처)

 

 그래서 오늘은 이 위키독스 페이지 그리고 이 위키독스 페이지를 보며 한번 beutifulsoup를 공부해보겠습니다.

 

 우선 컴퓨터에 모듈을 깔아줘야 합니다. cmd에 들어가서 pip install beautifulsoup4라고 치면 아마 될겁니다.

 

 

 그리고 requests라는 모듈도 깔아야합니다. pip install requests 합시다. 

 

 

 잘 깔렸네요. 그러면 이제 beautifulsoup를 써볼 차례입니다. 위에 링크해놓은 위키독스 페이지에서 친절히 코드를 제공해 주네요.

 

import requests
from bs4 import BeautifulSoup

url = 'https://search.naver.com/search.naver?sm=tab_hty.top&where=nexearch&query=%EB%B6%88%ED%98%91%ED%99%94%EC%9D%8C+%EB%A8%B8%EB%93%9C+%EA%B0%80%EC%82%AC&oquery=%EB%B6%88%ED%98%91%ED%99%94%EC%9D%8C+%EA%B0%80%EC%82%AC&tqi=hNtjdwp0J1Zssd%2FAWr0ssssssYV-300239'

response = requests.get(url)

if response.status_code == 200:
    html = response.text
    soup = BeautifulSoup(html, 'html.parser')
    print(soup)

else : 
    print(response.status_code)

 

 위키독스에 나온거에서 url만 바꾸었습니다. 저는 네이버에 <불협화음 머드 가사>라고 친 페이지로 만들었어요.

 

 코드 설명을 좀 해보자면... 사실 설명할것도 없긴 한데 response.status_code == 200 이 뭔말이냐면 웹페이지에서 준 메시지가 200이면 아래 코드를 실행하라는거에요. 404 Not Found나 403 Forbidden 메시지는 다들 많이 보셨을거라 생각하는데, 200은 조금 생소하실수도 있습니다. 왜냐하면 200이라는게 왔다는건 서버에 연결하는게 성공했다는거고, 의도했던 페이지로 넘어가니까 굳이 200이라 띄울 이유가 없거든요. 반면 404나 403은 에러기 때문에 자주 보셨을거고요.

 

import requests
from bs4 import BeautifulSoup

url = 'https://search.naver.com/search.naver?sm=tab_hty.top&where=nexearch&query=%EB%B6%88%ED%98%91%ED%99%94%EC%9D%8C+%EB%A8%B8%EB%93%9C+%EA%B0%80%EC%82%AC&oquery=%EB%B6%88%ED%98%91%ED%99%94%EC%9D%8C+%EA%B0%80%EC%82%AC&tqi=hNtjdwp0J1Zssd%2FAWr0ssssssYV-300239'

response = requests.get(url)

if response.status_code == 200:
    html = response.text
    soup = BeautifulSoup(html, 'html.parser')
    lyrics = soup.select_one('#main_pack > section.sc_new.sp_pmusic._au_music_collection._prs_mus_1st > div > div.group_music > ul > li:nth-child(1) > div.music_btn._lyrics_wrap > div > div.lyrics_txt._lyrics_txt')
    print(lyrics)

else : 
    print(response.status_code)

 

 암튼 그래서 저는 이렇게 코드를 한번 짜보았습니다. lyrics 모듈은 선택자를 가져온건데요. 구글 개발자 도구에서 선택하고 싶은 영역을 선택한 뒤에 <복사 - selector 복사>를 클릭해 주시면 저렇게 복사됩니다.

 

 

 와! 신기하네요. 근데 문제는 이렇게 HTML 그 자체가 나온다는겁니다. 여기서 제가 얻고 싶은건 가사뿐인데. 그래서 .get_text() 함수를 써주었습니다.

 

import requests
from bs4 import BeautifulSoup

url = 'https://search.naver.com/search.naver?sm=tab_hty.top&where=nexearch&query=%EB%B6%88%ED%98%91%ED%99%94%EC%9D%8C+%EB%A8%B8%EB%93%9C+%EA%B0%80%EC%82%AC&oquery=%EB%B6%88%ED%98%91%ED%99%94%EC%9D%8C+%EA%B0%80%EC%82%AC&tqi=hNtjdwp0J1Zssd%2FAWr0ssssssYV-300239'

response = requests.get(url)

if response.status_code == 200:
    html = response.text
    soup = BeautifulSoup(html, 'html.parser')
    lyrics = soup.select_one('#main_pack > section.sc_new.sp_pmusic._au_music_collection._prs_mus_1st > div > div.group_music > ul > li:nth-child(1) > div.music_btn._lyrics_wrap > div > div.lyrics_txt._lyrics_txt')
    print(lyrics.get_text())

else : 
    print(response.status_code)

 

 실행!

 

 

 아까보다는 편안해졌습니다. 근데 아직도 불편해요. 한줄씩 띄어 나왔으면 좋겠단 말이에요.

 

import requests
from bs4 import BeautifulSoup

url = 'https://search.naver.com/search.naver?sm=tab_hty.top&where=nexearch&query=%EB%B6%88%ED%98%91%ED%99%94%EC%9D%8C+%EB%A8%B8%EB%93%9C+%EA%B0%80%EC%82%AC&oquery=%EB%B6%88%ED%98%91%ED%99%94%EC%9D%8C+%EA%B0%80%EC%82%AC&tqi=hNtjdwp0J1Zssd%2FAWr0ssssssYV-300239'

response = requests.get(url)

if response.status_code == 200:
    html = response.text
    soup = BeautifulSoup(html, 'html.parser')
    lyrics = soup.select_one('#main_pack > section.sc_new.sp_pmusic._au_music_collection._prs_mus_1st > div > div.group_music > ul > li:nth-child(1) > div.music_btn._lyrics_wrap > div > div.lyrics_txt._lyrics_txt')
    lines = lyrics.select('p')
    for line in lines:
        print(line.get_text(), "\n")

else : 
    print(response.status_code)

 

 그래서 이렇게 만들었습니다. lyrics에 저장해놓은 div 안에 p로 줄이 나뉘어져 있더라고요. 그래서 p를 가져온 다음에 한줄씩 띄어 출력했습니다.

 

 

 아주 편안합니다. 불협화음의 가사를 가져오는것은 성공했어요!

 

 그런데 제 최애는 불협화음이긴 하지만, 저는 불협화음만 좋아하는게 아니라 리무진도 좋아하고 회전목마도 좋아합니다.

 

 그럼 사용자가 입력한 곡의 가사를 출력할 수 있도록 바꾸어 봅시다.

 

import requests
from bs4 import BeautifulSoup

title = input("title: ")
artist = input("artist: ")

url = 'https://search.naver.com/search.naver?sm=tab_hty.top&where=nexearch&query=' + title + artist + '가사'

response = requests.get(url)

if response.status_code == 200:
    html = response.text
    soup = BeautifulSoup(html, 'html.parser')
    lyrics = soup.select_one('#main_pack > section.sc_new.sp_pmusic._au_music_collection._prs_mus_1st > div > div.group_music > ul > li:nth-child(1) > div.music_btn._lyrics_wrap > div > div.lyrics_txt._lyrics_txt')
    if lyrics == None:
        print("찾으시는 곡의 가사 정보를 찾을 수 없습니다.")
    else:
        lines = lyrics.select('p')
        for line in lines:
            print(line.get_text(), "\n")

else : 
    print(response.status_code)

 

 됐습니다. 사용자가 노래의 제목과 아티스트를 입력하면, 그를 조합해서 네이버 링크를 만든 뒤 가사를 출력하는 식입니다. 만약 네이버에 그런 노래가 없다면 가사 정보가 없다고 출력하고요.

 

 실행해 봅시다!

 

 

 리무진도 출력되네요! 이번에는 없는 노래를 입력해봅시다. 

 

 

 편안합니다 :)

 

 오늘 이 모듈을 처음 써보는데, 꽤 쉽고 편하고 신기하네요. 앞으로 많이 써야겠습니다.

Comments