웹 스크래핑(Web Scraping)이란?
웹 스크래핑은 컴퓨터 과학 분야에서 웹사이트로부터 데이터를 자동으로 추출하는 기술을 의미합니다. 이 기법을 활용하면 웹상에 흩어져 있는 비정형(Unstructured) 데이터를 분석과 활용에 적합한 정형(Structured) 데이터로 변환할 수 있습니다.
파이썬 3에서 가장 널리 사용되는 대표적인 웹 스크래핑 도구는 다음과 같습니다.
- Urllib2
- Requests
- BeautifulSoup
- Lxml
- Selenium
- MechanicalSoup
1. Urllib2
Urllib2는 파이썬에 기본으로 내장되어 있는 모듈로, 별도의 설치 없이 바로 사용할 수 있다는 것이 가장 큰 장점입니다. URL을 다루는 데 특화되어 있으며, urlopen() 함수를 이용해 FTP, HTTP 등 다양한 프로토콜로 웹 페이지를 가져올 수 있습니다. 파이썬 3에서는 urllib.request 모듈로 제공됩니다.
예제 코드
from urllib.request import urlopen
my_html = urlopen("https://www.tutorialspoint.com/")
print(my_html.read())
위 코드를 실행하면 해당 웹사이트의 HTML 소스가 바이트(bytes) 형태로 출력됩니다.
2. Requests
Requests는 파이썬에서 가장 인기 있는 HTTP 라이브러리입니다. 기본 설치되어 있지 않기 때문에 명령 프롬프트에서 아래 명령어로 먼저 설치해야 하며, HTTP/1.1 방식으로 요청을 전송합니다. 직관적인 API 덕분에 초보자도 손쉽게 사용할 수 있습니다.
pip install requests
예제 코드
import requests
# URL 요청
my_req = requests.get('https://www.tutorialspoint.com/')
print(my_req.encoding)
print(my_req.status_code)
print(my_req.elapsed)
print(my_req.url)
print(my_req.history)
print(my_req.headers['Content-Type'])
실행 결과
UTF-8
200
0:00:00.205727
https://www.tutorialspoint.com/
[]
text/html; charset=UTF-8
응답 객체를 통해 문자 인코딩, 상태 코드(200은 성공), 응답 소요 시간, 최종 URL, 응답 헤더 정보 등을 한 번에 확인할 수 있습니다.
3. BeautifulSoup
BeautifulSoup은 HTML과 XML 문서를 구문 분석(Parsing)하는 대표적인 라이브러리입니다. 내부적으로 파서 트리(Parser Tree)를 생성하여 HTML 페이지에서 원하는 데이터를 손쉽게 추출할 수 있으며, 파이썬 표준 라이브러리의 기본 파서를 지원합니다.
설치는 명령 프롬프트에서 다음 명령어를 실행하면 됩니다.
pip install beautifulsoup4
예제 코드
from bs4 import BeautifulSoup
# requests 임포트
import requests
# URL 요청
my_req = requests.get("https://www.tutorialspoint.com/")
my_data = my_req.text
my_soup = BeautifulSoup(my_data)
for my_link in my_soup.find_all('a'):
print(my_link.get('href'))
실행 결과
https://www.tutorialspoint.com/index.htm
https://www.tutorialspoint.com/questions/index.php
https://www.tutorialspoint.com/online_dev_tools.htm
https://www.tutorialspoint.com/codingground.htm
...
/about/contact_us.htm
위 예제는 페이지 내 모든 <a> 태그를 찾아 링크(href) 목록을 출력합니다. 이처럼 BeautifulSoup을 사용하면 복잡한 HTML 문서에서도 원하는 요소를 간단한 코드로 추출할 수 있습니다.
4. Lxml
Lxml은 고성능·프로덕션 수준의 HTML 및 XML 구문 분석 라이브러리입니다. 처리 속도가 매우 빠르고 안정성이 뛰어나기 때문에 대용량 데이터를 다루거나 최고의 성능이 필요한 프로젝트에 적합합니다. 다양한 모듈을 통해 웹사이트에서 데이터를 효율적으로 추출할 수 있습니다.
설치 명령어는 다음과 같습니다.
pip install lxml
예제 코드
from lxml import etree
my_root_elem = etree.Element('html')
etree.SubElement(my_root_elem, 'head')
etree.SubElement(my_root_elem, 'title')
etree.SubElement(my_root_elem, 'body')
print(etree.tostring(my_root_elem, pretty_print=True).decode("utf-8"))
실행 결과
<html>
<head/>
<title/>
<body/>
</html>
Lxml은 위 예제처럼 XML 요소를 직접 생성하고 조작하는 기능도 제공하며, XPath를 활용한 강력한 데이터 추출 기능도 지원합니다.
5. Selenium
Selenium은 브라우저를 자동으로 조작하는 도구로, 웹 드라이버(WebDriver)라고도 불립니다. 일반적인 HTTP 요청 방식으로는 처리하기 어려운 동적 웹 페이지에 특히 유용합니다. 예를 들어 버튼 클릭 후 결과가 로딩되기를 기다리거나, 페이지를 스크롤해야 콘텐츠가 나타나는 경우처럼 JavaScript가 실행된 후의 화면이 필요할 때 Selenium이 필수적입니다.
설치 명령어는 다음과 같습니다.
pip install selenium
예제 코드
from selenium import webdriver
my_path_to_chromedriver = '/Users/Admin/Desktop/chromedriver'
my_browser = webdriver.Chrome(executable_path=my_path_to_chromedriver)
my_url = 'https://www.tutorialspoint.com/'
my_browser.get(my_url)
코드를 실행하면 크롬 브라우저가 자동으로 열리고 지정한 URL의 페이지가 로딩됩니다. 참고로 최신 버전의 Selenium 4부터는 크롬 드라이버 경로를 직접 지정하지 않아도 Selenium Manager가 자동으로 관리해 줍니다.
6. MechanicalSoup
MechanicalSoup은 웹사이트와의 상호작용을 자동화하는 파이썬 라이브러리입니다. 이 라이브러리를 사용하면 다음과 같은 작업을 자동으로 처리할 수 있습니다.
- 쿠키(Cookie) 자동 저장 및 전송
- 리다이렉트(Redirect) 자동 처리
- 링크 클릭 및 폼(Form) 제출 자동화
단, JavaScript 실행은 지원하지 않는다는 점에 유의해야 합니다. JavaScript 렌더링이 필요한 경우에는 앞서 소개한 Selenium을 사용하는 것이 좋습니다.
설치 명령어는 다음과 같습니다.
pip install MechanicalSoup
예제 코드
import mechanicalsoup
my_browser = mechanicalsoup.StatefulBrowser()
my_value = my_browser.open("https://www.tutorialspoint.com/")
print(my_value)
my_val = my_browser.get_url()
print(my_val)
my_va = my_browser.follow_link("forms")
print(my_va)
my_value1 = my_browser.get_url()
print(my_value1)
마무리: 어떤 도구를 선택해야 할까?
각 도구는 용도와 특징이 뚜렷이 다릅니다. 간단한 HTTP 요청에는 Requests, HTML 파싱에는 BeautifulSoup, 고성능 처리가 필요하면 Lxml, 동적 웹 페이지 제어에는 Selenium, 폼 제출 자동화에는 MechanicalSoup이 적합합니다. 실무에서는 Requests로 페이지를 가져오고 BeautifulSoup으로 파싱하는 조합이 가장 널리 사용되므로, 이 두 가지부터 익혀두는 것을 추천합니다.