파이썬은 프로그래밍 언어이기 때문에, 데이터 분석 뿐만 아니라 다양한 작업들을 할 수 있습니다. 그 중에서 많이 하는 작업중 하나는 웹크롤링입니다. 웹크롤링을 할 때는 원하는 위치에 값을 수집해야 하기 때문에 beautifulsoup을 이용하는 것이 필수입니다. 오늘은 웹크롤링에 필수 라이브러리인 beautifulsoup의 사용법과 유용한 팁에 대해서 알아보겠습니다.

 

 

beautifulsoup이란?

beautifulsoup은 html의 태그를 다룰 수 있는 패키지다. html에서 필요한 정보들을 쏙쏙 뽑아낼 때 사용합니다. 설명을 위해 네이버 웹사이트의 뭔가를 크롤링하고 싶다고 가정하겠습니다. 먼저 파이썬 내장모듈인 urllib을 이용해서 웹페이지의 정보를 가져옵니다.

 

from urllib.request import urlopen

url = "https://www.naver.com"
result = urlopen(url)
html = result.read()

 

이제 원하는 위치를 찾고 값을 가져오기 위해 beautifulsoup을 이용합니다.

 

 

1. HTML을 파싱합니다.

urllib으로 가져온 웹페이지 정보는 beautifulsoup을 이용해서 parsing해야 합니다. 그래야 한글도 잘 보이고, 원하는 위치의 태그를 가져올 수 있는 준비가 됩니다. 파싱할 때는 어떤 방법으로 할 지 지정해야 되는데요. html은 html.parser를 이용하면 됩니다.

 

from bs4 import BeautifulSoup

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

 

html이 아니라 xml이라면 파싱 방법을 'xml'로 지정합니다. 그 외에도 'lxml', 'lxml-xml', 'htm5lib' 의 파싱 방법이 있습니다.

 

 

2. 원하는 위치의 태그 정보를 가져옵니다.

원하는 위치의 태그를 찾기 위해서 find와 find_all 함수를 이용합니다. 함수의 입력파라미터로 원하는 위치의 태그명을 넣습니다. 태그는 <태그명> ~ </태그명> 으로 정의돼 있습니다.

 

예를 들어 링크를 의미하는 a태그를 찾고 싶다면, soup.find("a") 또는 sup.find_all("a")라고 입력합니다. 2개의 차이는 하나만 찾느냐 모두 다 찾느냐입니다. find를 이용하면 제일 앞에 있는 하나의 태그 정보만 가져옵니다. find_all을 이용하면 a태그를 모두 찾아서 list 유사한 자료형으로 반환합니다.


a_tag = soup.find_all("a")라고 했다면 a_tag[0], a_tag[1] ....식으로 차례대로 a tag를 불러올 수 있습니다.

 

tag = soup.find_all("a")
type(tag)
[출력] bs4.element.ResultSet

print(tag[0])
[출력] <a href="#newsstand"><span>뉴스스탠드 바로가기</span></a>

print(tag[1])
<a href="#themecast"><span>주제별캐스트 바로가기</span></a>

 

 

원하는 위치의 태그를 더 세부적으로 정할 수도 있습니다. 예를 들어 a태그 중에서 class 속성값이 theme_thumb인 정보를 가져오고 싶다면, attrs 입력 파라미터에 딕셔너리 자료형으로 입력하면 됩니다.

 

soup.find("a", attrs={'class':'theme_thumb'})

 

class나 id 뿐만 아니라, 태그에 있는 속성 정보는 위와 같이 입력해서 모두 활용할 수 있습니다.

 

 

3. 태그 정보에서 원하는 값을 가져옵니다.

tag사이의 text가 필요할 때는 .text를 이용합니다. 위의 예에서 a 태그 사이의 텍스트가 필요하다면, a_tag.text라고 입력하면 됩니다. tag=soup.find("body"), tag.text라고 입력하면 body의 전체 텍스트가 추출됩니다. 내용만 사용하고자 할 때 유용한 방법입니다.

 

tag = soup.find_all("a")
print(tag[1].text)

[출력] 주제별캐스트 바로가기

 

혹은 원하는 속성값이 있다면 get함수를 이용합니다. a태그에서 url주소를 가져오고 싶다면 href속성의 값을 가져오면 됩니다.

 

print(tag[9].get('href'))

[출력]: https://jr.naver.com

 

 

경우에 따라서는 가져오고자 하는 태그 정보가 복잡한 경우도 있습니다. 예를 들어 html의 table태그는 표를 의미하는 태그이지만, 이를 수집하고 원하는 값을 찾아 다시 표로 만들기는 쉽지 않습니다. 이렇게 table 태그 정보를 수집하고 싶다면 다른 방법을 이용하는 것이 좋습니다.

그리고 XML이나 JSON 데이터도 다른 패키지를 이용하면 더 쉽게 사용할 수 있습니다.

 

 

오늘은 이렇게 웹크롤링의 필수 라이브러리인 beautifulsoup의 사용법과 유용한 팁에 대해서 알아보았습니다. 패키지가 잘 정의돼 있어, 필요한 정보를 어렵지 않게 가지고 올 수 있었습니다.

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기