Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬 BeautifulSoup으로 웹 스크래핑 시작하기 – 설치부터 링크 추출 예제까지

BeautifulSoup란 무엇인가?

BeautifulSoup는 파이썬 bs4 모듈에 포함된 클래스로, HTML 또는 XML 문서를 손쉽게 파싱(parsing)하기 위해 만들어진 라이브러리입니다. 웹 페이지에서 원하는 데이터를 추출하는 웹 스크래핑(Web Scraping) 작업에서 가장 널리 쓰이는 필수 도구 중 하나입니다.

bs4 설치하기

BeautifulSoup는 pip 모듈을 통해 매우 간단하게 설치할 수 있습니다. 명령 프롬프트나 터미널에서 아래 명령어만 실행하면 됩니다.

pip install bs4

위 명령어를 실행하면 화면에 다음과 같은 설치 과정이 출력됩니다.

C:\Users\rajesh>pip install bs4
Collecting bs4
Downloading https://files.pythonhosted.org/packages/10/ed/7e8b97591f6f456174139ec089c769f89a94a1a4025fe967691de971f314/bs4-0.0.1.tar.gz
Requirement already satisfied: beautifulsoup4 in c:\python\python361\lib\site-packages (from bs4) (4.6.0)
Building wheels for collected packages: bs4
Building wheel for bs4 (setup.py) ... done
Stored in directory: C:\Users\rajesh\AppData\Local\pip\Cache\wheels\a0\b0\b2\4f80b9456b87abedbc0bf2d52235414c3467d8889be38dd472
Successfully built bs4
Installing collected packages: bs4
Successfully installed bs4-0.0.1

설치가 정상적으로 완료되었는지 확인하려면 같은 터미널에서 파이썬을 실행한 뒤 BeautifulSoup를 임포트해 보면 됩니다.

C:\Users\rajesh>python
Python 3.6.1 (v3.6.1:69c0db5, Mar 21 2017, 17:54:52) [MSC v.1900 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from bs4 import BeautifulSoup
>>>

오류 없이 임포트되었다면 설치가 성공적으로 완료된 것입니다.

예제 1: HTML 문서에서 모든 링크 추출하기

HTML 문서가 있을 때 문서 내의 모든 참조 링크(href)를 수집하고 싶다고 가정해 보겠습니다. 먼저 HTML 문서를 문자열 형태의 변수로 저장합니다.

html_doc='''<a href='www.Tutorialspoint.com'/a>
<a href='www.nseindia.com.com'/a>
<a href='www.codesdope.com'/a>
<a href='www.google.com'/a>
<a href='www.facebook.com'/a>
<a href='www.wikipedia.org'/a>
<a href='www.twitter.com'/a>
<a href='www.microsoft.com'/a>
<a href='www.github.com'/a>
<a href='www.nytimes.com'/a>
<a href='www.youtube.com'/a>
<a href='www.reddit.com'/a>
<a href='www.python.org'/a>
<a href='www.stackoverflow.com'/a>
<a href='www.amazon.com'/a>
<a href='www.linkedin.com'/a>'''

이제 위에서 만든 html_doc 변수를 BeautifulSoup의 초기화 함수에 전달하여 soup 객체를 생성합니다.

from bs4 import BeautifulSoup
soup = BeautifulSoup(html_doc, 'html.parser')

soup 객체가 준비되었으므로, BeautifulSoup 클래스의 다양한 메서드를 적용할 수 있습니다. 문서 내 태그의 속성과 값을 자유롭게 조회할 수 있습니다.

for tag in soup.find_all('a'):
    print(tag.get('href'))

위 코드는 반복문을 통해 html_doc 문자열 안의 모든 <a> 태그를 순회하면서 각 태그의 href 속성값을 가져오는 방식으로 동작합니다.

다음은 html_doc 문자열에서 모든 링크를 추출하는 완전한 코드입니다.

from bs4 import BeautifulSoup

html_doc='''<a href='www.Tutorialspoint.com'/a>
<a href='www.nseindia.com.com'/a>
<a href='www.codesdope.com'/a>
<a href='www.google.com'/a>
<a href='www.facebook.com'/a>
<a href='www.wikipedia.org'/a>
<a href='www.twitter.com'/a>
<a href='www.microsoft.com'/a>
<a href='www.github.com'/a>
<a href='www.nytimes.com'/a>
<a href='www.youtube.com'/a>
<a href='www.reddit.com'/a>
<a href='www.python.org'/a>
<a href='www.stackoverflow.com'/a>
<a href='www.amazon.com'/a>
<a href='www.rediff.com'/a>'''

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

for tag in soup.find_all('a'):
    print(tag.get('href'))

실행 결과

www.Tutorialspoint.com
www.nseindia.com.com
www.codesdope.com
www.google.com
www.facebook.com
www.wikipedia.org
www.twitter.com
www.microsoft.com
www.github.com
www.nytimes.com
www.youtube.com
www.reddit.com
www.python.org
www.stackoverflow.com
www.amazon.com
www.rediff.com

예제 2: 특정 키워드가 포함된 링크만 추출하기

실제 웹사이트에서 링크 안에 특정 단어(예: python)가 포함된 URL만 골라서 출력하는 방법을 살펴보겠습니다. 아래 프로그램은 지정한 웹사이트의 모든 URL 중 링크 주소에 "python"이라는 문자열이 들어간 것들만 걸러내어 출력합니다.

from bs4 import BeautifulSoup
from urllib.request import urlopen
import re

html = urlopen("https://www.python.org")
content = html.read()
soup = BeautifulSoup(content)
for a in soup.findAll('a', href=True):
    if re.findall('python', a['href']):
        print("Python URL:", a['href'])

동작 원리

이 코드는 세 단계로 구성됩니다. 첫째, urlopen()으로 python.org 웹페이지의 HTML을 가져옵니다. 둘째, BeautifulSoup로 해당 내용을 파싱한 뒤 href 속성을 가진 모든 <a> 태그를 찾습니다. 셋째, 정규표현식 모듈인 re를 활용해 링크 주소에 'python'이 포함된 경우만 화면에 출력합니다.

실행 결과

Python URL: https://docs.python.org
Python URL: https://pypi.python.org/
Python URL: https://www.facebook.com/pythonlang?fref=ts
Python URL: https://brochure.getpython.info/
Python URL: https://docs.python.org/3/license.html
Python URL: https://wiki.python.org/moin/BeginnersGuide
Python URL: https://devguide.python.org/
Python URL: https://docs.python.org/faq/
Python URL: https://wiki.python.org/moin/Languages
Python URL: https://python.org/dev/peps/
Python URL: https://wiki.python.org/moin/PythonBooks
Python URL: https://wiki.python.org/moin/
Python URL: https://www.python.org/psf/codeofconduct/
Python URL: https://planetpython.org/
Python URL: /events/python-events
Python URL: /events/python-user-group/
Python URL: /events/python-events/past/
Python URL: /events/python-user-group/past/
Python URL: /downloads/release/python-373/
Python URL: //jobs.python.org
Python URL: https://blog.python.org
Python URL: https://wiki.python.org/moin/TkInter
Python URL: https://www.wxpython.org/
Python URL: https://ipython.org
Python URL: #python-network
...

마무리

지금까지 BeautifulSoup를 설치하고, HTML 문자열에서 링크를 추출하는 기본 예제와 실제 웹사이트에서 조건에 맞는 URL을 수집하는 응용 예제를 살펴보았습니다. find_all(), findAll() 메서드와 정규표현식을 조합하면 원하는 데이터만 정확하게 걸러낼 수 있습니다. 여기에 requests 라이브러리, Selenium 등을 함께 활용하면 더욱 강력한 웹 스크래핑 시스템을 구축할 수 있습니다.