1. 크롤링 도구
1-1. 파이썬 크롤링 라이브러리 종류
1-1-1. Requests
- 특징 : HTTP 요청을 간단히 처리할 수 있는 라이브러리
- 용도 :
- 웹 페이지의 HTML 소스를 가져오기 위해 사용
- REST API 호출
- 장점 :
- 간단하고 빠른 HTTP 요청 지원
- 쿠키, 세션, 인증 등 지원
- 단점 :
- 동적 콘텐츠(JavaScript로 렌더링되는 데이터)는 처리 불가
- 예제 코드
import requests
url = 'https://example.com'
response = requests.get(url)
print(response.text)
1-1-2. Beautiful Soup
- 특징 : HTML과 XML 파일을 파싱하여 구조화된 데이터를 추출
- 용도 :
- 정적 웹사이트에서 데이터 추출
- DOM 트리 탐색 및 조작
- 장점 :
- HTML 구조 파싱 및 간단한 데이터 추출에 적합
- 단점 :
- 동적 콘텐츠는 처리 불가(Selenium이나 다른 도구와 함께 사용 필요)
- 예제 코드
from bs4 import BeautifulSoup
html = '<html><body><h1>Hello, world!</h1></body></html>'
soup = BeautifulSoup(html, 'html.parser')
print(soup.h1.text)
1-1-3. Selenium
- 특징 : 웹 브라우저 자동화 도구
- 용도 :
- JavaScript로 생성된 동적 콘텐츠 크롤링
- 버튼 클릭, 폼 제출, 스크롤링 등 브라우저 작업
- 장점 :
- 동적 페이지 크롤링 가능
- 단점 :
- 상대적으로 느리고 브라우저 드라이버 설정 필요
- 예제 코드
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://example.com')
print(driver.page_source)
driver.quit()
1-1-4. Scrapy
- 특징 : 강력한 웹 크롤링 프레임워크
- 용도 :
- 대규모 크롤링 프로젝트
- 데이터를 효율적으로 수집하고 저장
- 장점 :
- 병렬 요청 지원으로 속도 빠름
- URL 스케줄링 및 데이터 파이프라인 내장
- 단점 :
- 설정과 학습 곡선이 비교적 높음
- 설치 및 실행
scrapy startproject myproject
scrapy crawl myspider
1-1-5. Playwright
- 특징 : Selenium과 유사한 브라우저 자동화 도구로, 최신 브라우저 기능을 지원
- 용도 :
- 동적 웹 페이지 크롤링
- 빠른 속도로 데이터 추출
- 장점 :
- Selenium보다 간단한 API
- Headless 브라우저 지원이 우수
- 단점 :
- 상대적으로 새로운 도구
- 설치 및 코드
pip install playwright
playwright install
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(headless=True)
page = browser.new_page()
page.goto('https://example.com')
print(page.content())
browser.close()
1-1-6. Pyppeteer
- 특징 : Puppeteer의 Python 포트
- 용도 :
- 동적 콘텐츠 크롤링
- 스크린샷, PDF 생성, 헤드리스 브라우저 제어
- 장점 :
- JavaScript-heavy 웹사이트 처리
- 단점 :
- Puppeteer만큼 활발히 유지되지는 않음
- 설치 및 코드
pip install pyppeteer
from pyppeteer import launch
async def main():
browser = await launch()
page = await browser.newPage()
await page.goto('https://example.com')
print(await page.content())
await browser.close()
1-1-7. lxml
- 특징 : 빠르고 강력한 HTML/XML 파싱 라이브러리
- 용도 :
- HTML이나 XML 데이터 처리
- 장점 :
- 빠른 성능
- XPath와 CSS 셀렉터 지원
- 단점 :
- 동적 콘텐츠는 처리 불가
- 예제 코드
from lxml import html
tree = html.fromstring('<html><body><h1>Hello!</h1></body></html>')
print(tree.xpath('//h1/text()'))
1-2. 라이브러리 선택 가이드
요구 사항 추천 도구
간단한 HTTP 요청 | Requests, HTTPX |
정적 웹사이트 크롤링 | Beautiful Soup, lxml |
동적 웹사이트 크롤링 | Selenium, Playwright |
대규모 크롤링 프로젝트 | Scrapy |
최신 브라우저 자동화 | Playwright, Pyppeteer |
빠른 성능의 DOM 분석 | lxml |
1-3. Beautiful Soup과 Selenium
1-3-1. 차이점 요약
구분 Beautiful Soup Selenium
주요 기능 | HTML/XML 파싱 및 데이터 추출 | 웹 브라우저 자동화 및 동적 콘텐츠 처리 |
동작 방식 | 정적 HTML 문서를 파싱하여 데이터 추출 | 실제 브라우저를 구동하여 사용자 행동을 자동화 |
동적 콘텐츠 처리 | 불가능 (JavaScript 실행 불가) | 가능 (JavaScript 실행 및 상호작용 지원) |
속도 및 성능 | 빠르고 리소스 소비가 적음 | 상대적으로 느리고 리소스 소비가 많음 |
사용 사례 | 정적 웹 페이지의 데이터 수집 | 동적 웹 페이지의 데이터 수집, 웹 애플리케이션 테스트 |
설치 및 설정 | 간단 (requests와 함께 라이브러리 설치 후 바로 사용 가능) | 복잡 (브라우저 드라이버 설치 필요) |
코드 복잡도 | 간단 | 상대적으로 복잡 |
→ 가능하다면 Beautiful Soup과 같은 경량 도구를 우선 사용하고, 필요한 경우에만 Selenium을 활용하여 효율성을 높일 수 있다.
1-3-2. 차이점을 고려한 활용 사례
- 정적 웹 페이지 크롤링
- 예시 상황 : 뉴스 사이트에서 최신 기사 제목을 수집한다. 해당 사이트는 콘텐츠가 서버에서 렌더링되며, JavaScript를 사용하지 않는다.
- 사용할 라이브러리 : Beautiful Soup
- 정적 페이지이므로 requests로 페이지를 가져와 Beautiful Soup으로 파싱할 수 있다.
- 예시 코드
import requests
from bs4 import BeautifulSoup
url = 'https://www.staticnewssite.com'
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')
titles = soup.find_all('h2', class_='news-title')
for title in titles:
print(title.get_text())
2. 동적 웹 페이지 크롤링
- 예시 상황: 쇼핑몰 사이트에서 상품 정보를 수집한다. 해당 사이트는 무한 스크롤을 사용하며, 스크롤할 때마다 JavaScript로 새로운 상품이 로드된다.
- 사용할 라이브러리 : Selenium
- 무한 스크롤 및 동적 콘텐츠 로딩이 있으므로 Selenium으로 브라우저를 제어하여 스크롤 동작을 수행하고, JavaScript가 로드한 콘텐츠를 가져올 수 있다.
- 예시 코드
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
driver = webdriver.Chrome()
driver.get('https://www.dynamicshopping.com')
# 스크롤 다운하여 추가 상품 로드
for _ in range(5):
driver.find_element_by_tag_name('body').send_keys(Keys.END)
time.sleep(2) # 로딩 대기
products = driver.find_elements_by_class_name('product-item')
for product in products:
name = product.find_element_by_class_name('product-name').text
price = product.find_element_by_class_name('product-price').text
print(f'상품명: {name}, 가격: {price}')
driver.quit()
'Web Crawling > Web Crawling ?' 카테고리의 다른 글
CSS 선택자 (0) | 2025.02.23 |
---|---|
브라우저 렌더링 동작 구조 (0) | 2025.02.23 |
크롤링 데이터 저장 (0) | 2025.02.23 |
WEB의 구조 (0) | 2025.02.23 |
OPEN API 란 ? (0) | 2025.02.23 |