건프의 소소한 개발이야기

[Python] Beautifulsoup 으로 웹크롤링 하기 본문

개발 이야기/Python 이야기

[Python] Beautifulsoup 으로 웹크롤링 하기

건강한프로그래머 2016. 7. 28. 20:33

안녕하세요, 건프입니다.


이번에는 python 의 대표적인 웹크롤러인 beautifulsoup 을 이용해서, 간단한 웹크롤러의 기본을 만드려고 합니다.


beautifulsoup 의 공식 홈페이지 및 Quick Start 페이지는 여기서 확인하시면 됩니다.

https://www.crummy.com/software/BeautifulSoup/bs4/doc/#quick-start


그럼 본격적으로 시작해봅시다.


0. 가상환경 구축

저는 파이썬 패키지들끼리 의존성에 충돌이 나는것을 굉장히 싫어하기 때문에 새로운 작업을 할때, 반드시 새로운 가상환경을 만듭니다.

$ virtualenv venvBeautifulSoup

$ source venvBeautifulSoup/bin/activate


1. Install

가상환경을 킨 상태에서 pip install 명령을 수행하면, 해당 환경에서만 동작하도록 설치가 됩니다.

$ pip install beautifulsoup4

4버전이 최신버전 입니다.


2. 무엇을 긁을까요?

무엇을 긁을지 고민하다 우리 개발자들이 항상 들어가고 애용하는 github 사이트의 레포지토리 목록을 긁어보도록 하겠습니다.


크롬창에서 본인 레포지토리의 첫번째 의 위치를 마우스 오른쪽 클릭하고 '검사'를 누르면 위와 같이 개발자모드가 열립니다.


이것저것 테스트를 해보시면 알겠지만, div 태그의 class="repo-list-item public source" 를 가지고 있는 태그가 repository 의 하나의 아이템을 담고 있습니다.


자 그럼 이것을 파이썬으로 긁어봅시다.


3. 긁어봅시다.

from bs4 import BeautifulSoup
from urllib.request import urlopen
# 인터넷 환경인지 확인해주세요

res = urlopen('https://github.com/SSUHan?tab=repositories').read().decode('utf-8')
# urlopen 으로 해당 url 의 html 코드들을 가져옵니다

# print(res)

soup = BeautifulSoup(res, 'html.parser')
# BeautifulSoup 객체의 파싱 방법은 4가지가 있다고 합니다 그중 html.parser를 사용할 것입니다

print(type(soup))
# bs4.BeautifulSoup 객체가 리턴됩니다

repo_list = soup.find_all('div', class_='repo-list-item public source')
# div 태그인데 클래스가 다음과 같은 div 태그들을 전부 찾아서 반환합니다
print(type(repo_list))
# 리턴된 타입은 bs4.element.ResultSet 객체 입니다

repo_item = repo_list[0]
# 내용물이 많기때문에 그 중 첫번째 요소를 받아냅니다
# print(repo_item.prettify()) 이거 됩니다 ㅋㅋ
print(type(repo_item))
# 각각의 아이템의 타입은 bs4.element.Tag 객체 입니다
print('='*20) # 구분선을 두었으니 어디가 어디까지인지 확인하실 수 있습니다
print(repo_item.h3)
# Tag 객체 안의 child 태그를 접근할 때는 위와 같이 접근이 가능합니다
print('='*20)
print(repo_item.h3.a)
print('='*20)
print(repo_item.h3.a['href'])
# Tag 객체 안의 attr 의 정보를 얻으려면 위와 같이 하면 됩니다
print('='*20)
print(repo_item.h3.a.string)
# 실제적인 바디값을 얻으려면 위와 같이 하면 됩니다
print('='*20)
link = "https://github.com" + repo_item.h3.a['href']
# 링크를 완성하기 위해서 join 합니다
print(link)
# 짠 여러분들은 해당 repo 의 링크를 얻어냈습니다
print('='*20)


결과입니다



자 응용하실 수 있겠나요?


참고할만한 좋은 사이트를 첨부합니다.

http://jhjeong.com/python/2016/01/28/beautifulsoup-web-crawling/


도움이 되었길 바랍니다

고맙습니다 :)

Comments