Web Crawling/Web Crawling ?

크롤링 도구

js-kkk 2025. 2. 23. 17:52

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. 차이점을 고려한 활용 사례

  1. 정적 웹 페이지 크롤링
    • 예시 상황 : 뉴스 사이트에서 최신 기사 제목을 수집한다. 해당 사이트는 콘텐츠가 서버에서 렌더링되며, 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