What I Learnd

웹 스크래핑(크롤링) 기초 [Beautiful Soup 뷰티불수프 라이브러리]

키싸 2023. 5. 4. 22:30

웹 스크래핑(크롤링)을 하는 법 정리!

Beautiful Soup은 Python 프로그래밍 언어를 사용하여 HTML 및 XML 문서를 파싱하고 데이터를 추출하기 위한 파이썬 라이브러리! HTML과 XML은 웹 사이트 및 다른 네트워크 프로토콜에서 자주 사용되는 문서 형식이며, Beautiful Soup은 이러한 문서에서 데이터를 추출하는 데 사용된다!

 

1. 폴더에 Beautiful Soup 패키지 설치하기

pip install bs4

*구글에 Beautiful Soup Doc 검색면 사용가이드 확인 가능!
모든 라이브러리는 이런 식으로 필요한 기능을 찾아보고 사용 doc을 확인하면서 정해진 언어를 참고하여 적용할 수 있다.

2.  크롤링 기본 세팅

import requests
from bs4 import BeautifulSoup

URL = "크롤링 해올 페이지 url"
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(URL, headers=headers)
soup = BeautifulSoup(data.text, 'html.parser')

 

3. 원하는 영역 가져오기

title = soup.select_one("카피해온 부분 통째로").text
# soup.select_one 원하는 값만 가져오고 싶을 때
# 가져온 데이터는 html의 뼈대이기 때문에 .text()를 사용해서 문자 값만 꺼내줌
print(title)
# print() 터미널로 잘 들어왔는지 확인해보기

 

*지니뮤직 인기차트 웹페이지 크롤링 사용 예시 코드

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

# 순위, 곡 정보, 가수 정보

#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(1) > td.info > a.title.ellipsis
#body-content > div.newest-list > div > table > tbody > tr:nth-child(1) > td.info > a.artist.ellipsis

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()
    # strip() 텍스트 앞뒤로 여백 없이 보여주고 싶을 때
    artist = tr.select_one('td.info > a.artist.ellipsis').text
     
    print(rank, title, artist)

 

*결과값

 

*bs4 요약

# 선택자를 사용하는 방법 (copy selector)
soup.select('태그명')
soup.select('.클래스명')
soup.select('#아이디명')

soup.select('상위태그명 > 하위태그명 > 하위태그명')
soup.select('상위태그명.클래스명 > 하위태그명.클래스명')

# 태그와 속성값으로 찾는 방법
soup.select('태그명[속성="값"]')

# 한 개만 가져오고 싶은 경우
soup.select_one('위와 동일')