Programming/Python

[Python] Web 스크랩 및 파싱 :: BeautifulSoup 사용방법

쌍쌍바나나 2016. 4. 20. 19:14
반응형

 Web 스크랩 및 파싱하기 :: BeautifulSoup 사용방법

들어가며

  웹에서 페이지를 스크랩하는 방법에 대해서 설명하려고 합니다.  웹페이지를 스크랩한다는 말은 웹 페이지에서 [오른쪽 마우스 클릭] --> [소스보기] 에 있는 텍스트를 가져온다고 생각하시면 됩니다. 웹에 있는 페이지에 특정 단어나, 이미지의 url 등을 가져오고 싶은 경우가 있습니다. 일단 가져오기 전에 feasibility(가능성)를 따져본 후에, 가능 하다면 페이지의 소스코드를 가져오고, 일정 포맷에 있는 데이터를 가져오면 됩니다.


내가 원하는 페이지에 들어간다.

[그림 1] 인터넷 페이지

오른쪽 마우스를 클릭한 후에 View Source를 누른다. (또는 페이지 소스보기) 

[그림 2] 인터넷 페이지 소스코드

구현하기

  구현해야 하는 시나리오는 페이지에서 내가 원하는 값은 해당 앱의 카테고리가 어떤 분류로 되어있는지를 가져오기 입니다. requests의 모듈을 통해 웹페이지[그림2]의 소스코드를 가져오고, 소스코드를 파싱하기 위해서 beautifulsoup을 사용합니다. 이때 주의할점은 한글 데이터의 경우 encoding문제로 깨짐현상이 일어나기 때문에 beautifulsoup의 인스턴스를 생성할때 from_encoding='utf-8'을 하셔야 한글 테스트의 깨짐이 없이 가져올 수 있습니다. 아래 결과는 input으로 com.parasite.torrent를 넣고 결과로 해당 앱의 장르인 도구 정보를 화면에 출력합니다. 

# BeautifulSoup 모듈을 import 합니다. 
from bs4 import BeautifulSoup
# requests는 페이지를 요청한 응답을 받을때 사용합니다.
import requests

package_name = "com.parasite.torrent"
genre = 'None'

# requests의 get을 통해 요청을 한 뒤 응답을 받아옵니다. 
# r.content는 [그림 2]와 같은 택스트로 이루어져 있습니다. 여기서 encode를 'utf-8'로 설정을 안해주면 한글이 깨짐현상이 일어납니다.
r = requests.get( 'https://play.google.com/store/apps/details?id=' + package_name)
soup = BeautifulSoup(r.content, 'html.parser', from_encoding='utf-8')

# soup에서 'div'로 시작하는 tag를 갖고 있고 class가 details-info인 모든 값을 찾습니다. 
details_info = soup.findAll('div', {'class':'details-info'})
if len(details_info) > 0:
    # details-info인 값을 찾은 후에 span의 tag를 갖고 있고 itemprop가 genre인 값을 가져오면 됩니다.
    genre_info = details_info[0].findAll('span', {'itemprop':'genre'})
if len(genre_info) > 0:
    # genre_info[0]에는 도구 의 값이 담겨 있습니다.
    genre = genre_info[0].text
    print genre



반응형