웹사이트에서 데이터가 필요합니다. Python 스크래퍼를 작성할까요? Playwright를 실행할까요? 브라우저 확장 프로그램을 사용할까요? 수백 개의 사이트에서 데이터를 추출해온 경험을 바탕으로, 상황에 맞는 도구를 선택하는 프레임워크를 정리했습니다.
선택지 비교
| 접근 방식 | 실행 위치 | JS 처리 | 로그인 지원 | 설정 시간 |
|---|---|---|---|---|
| Python + requests | 서버 | ❌ | 수동 쿠키 | 5분 |
| Python + BeautifulSoup | 서버 | ❌ | 수동 쿠키 | 5분 |
| Playwright/Puppeteer | 서버 | ✅ | 스크립트 가능 | 15분 |
| 브라우저 확장 프로그램 | 사용자 브라우저 | ✅ | 자동 | 0분 |
| 복사-붙여넣기 | 사용자 브라우저 | ✅ | 자동 | 0분 |
각 도구마다 장단점이 있습니다. 하나씩 살펴보겠습니다.
옵션 1: Python + Requests/BeautifulSoup
최적 용도: 정적 HTML 페이지, API, 자동화 파이프라인
import requests
from bs4 import BeautifulSoup
response = requests.get("https://example.com/data")
soup = BeautifulSoup(response.text, "html.parser")
table = soup.find("table")
rows = []
for tr in table.find_all("tr"):
row = [td.get_text(strip=True) for td in tr.find_all(["td", "th"])]
rows.append(row)
장점:
- 빠른 실행 속도
- 스케줄링 용이 (cron, Airflow)
- 브라우저 오버헤드 없음
단점:
- JavaScript 실행 불가
- 많은 최신 사이트가 테이블을 클라이언트에서 렌더링
- 인증에 수동 쿠키 처리 필요
실패 사례: React 기반 대시보드를 스크래핑하면 빈 <div id="root"></div>만 받게 됩니다.
옵션 2: 헤드리스 브라우저 (Playwright/Puppeteer)
최적 용도: JavaScript 렌더링 페이지, 자동화 파이프라인, 인터랙션이 필요한 사이트
const { chromium } = require('playwright');
(async () => {
const browser = await chromium.launch();
const page = await browser.newPage();
await page.goto('https://example.com/dashboard');
// 테이블 렌더링 대기
await page.waitForSelector('table');
const data = await page.evaluate(() => {
const table = document.querySelector('table');
return Array.from(table.rows).map(row =>
Array.from(row.cells).map(cell => cell.textContent.trim())
);
});
console.log(data);
await browser.close();
})();
장점:
- JavaScript 실행 가능
- 페이지 인터랙션 가능 (클릭, 스크롤, 폼 입력)
- 인증 플로우 스크립팅 가능
단점:
- 직접 HTTP보다 느림
- 리소스 집약적 (메모리, CPU)
- 복잡한 에러 핸들링
- 헤드리스 브라우저 감지 가능성
실패 사례: 많은 사이트가 navigator 속성, WebGL 핑거프린팅, 행동 분석을 통해 Puppeteer/Playwright를 감지합니다. 스텔스 플러그인이 도움되지만 완벽하지 않습니다.
옵션 3: 브라우저 확장 프로그램
최적 용도: 비정기 추출, 인증된 사이트, 사용자 주도 워크플로우
브라우저 확장 프로그램은 사용자의 실제 브라우저 세션에서 실행되어 다음에 완전히 접근할 수 있습니다:
- 인증된 세션
- JavaScript 렌더링 콘텐츠
- 사용자가 보는 그대로의 DOM
최고의 옵션 비교는 웹사이트 테이블 내보내기를 위한 Chrome 최고의 확장 프로그램 5선을 참고하세요.
// Chrome 확장 프로그램의 콘텐츠 스크립트
chrome.runtime.onMessage.addListener((msg, sender, sendResponse) => {
if (msg.type === "EXTRACT_TABLE") {
const table = document.querySelector("table");
const data = Array.from(table.rows).map(row =>
Array.from(row.cells).map(cell => cell.textContent.trim())
);
sendResponse({ data });
}
});
장점:
- 인증 처리 불필요—이미 로그인 상태
- 사용자가 보는 것과 동일하게 표시 (JS 렌더링 문제 없음)
- 모든 사이트에서 작동 (봇 감지 없음)
- 서버 인프라 불필요
단점:
- 수동 트리거 필요 (사용자 클릭)
- 스케줄 실행 불가
- 브라우저 컨텍스트로 제한
실패 사례: 10,000개 페이지에서 자동으로 데이터를 추출해야 할 때. 확장 프로그램은 사용자 주도 워크플로우용이지, 배치 처리용이 아닙니다.
의사 결정 프레임워크
Python + requests를 사용할 때:
- ✅ 서버 사이드 렌더링 HTML 페이지
- ✅ 자동화/스케줄 추출이 필요할 때
- ✅ 데이터 파이프라인 구축 시
- ✅ API 키 또는 단순 쿠키 인증
Playwright/Puppeteer를 사용할 때:
- ✅ JavaScript 렌더링이 필요한 페이지
- ✅ 자동화/스케줄 추출이 필요할 때
- ✅ 인터랙션 필요 (스크롤, 클릭, 페이지네이션)
- ✅ 봇 감지 대응이 가능할 때
브라우저 확장 프로그램을 사용할 때:
- ✅ 이미 사이트에 로그인된 상태
- ✅ 비정기적으로 데이터 필요 (자동화 불필요)
- ✅ 강력한 봇 감지가 있는 사이트
- ✅ 코드 작성 없이 즉시 데이터가 필요할 때
그냥 복사-붙여넣기할 때:
- ✅ 일회성 추출
- ✅ 단순한 테이블 구조
- ✅ 특정 형식이 필요 없을 때
실전 예시
예시 1: 위키피디아 테이블
최적 접근법: 브라우저 확장 프로그램 또는 Python
위키피디아는 인증 없는 서버 렌더링 HTML입니다. Python이 완벽하게 작동합니다:
import pandas as pd
url = "https://en.wikipedia.org/wiki/List_of_countries_by_population"
tables = pd.read_html(url)
df = tables[0]
하지만 위키피디아 테이블은 복잡한 rowspan과 네비게이션 행이 있는 경우가 많습니다. 전용 확장 프로그램이 이를 자동으로 처리합니다.
단계별 가이드는 위키피디아 테이블을 30초 만에 Excel로 내보내기를 참고하세요.
예시 2: 금융 대시보드 (로그인 필요)
최적 접근법: 브라우저 확장 프로그램
증권사에서 로그인 후 포트폴리오 데이터를 보여줍니다. 선택지:
Python: 인증 플로우 역공학, 2FA 처리, 세션 쿠키 유지. 가능하지만 취약합니다.
Playwright: 로그인 스크립팅, 2FA 프롬프트 처리, 데이터 페이지 이동. 작동하지만 복잡합니다.
확장 프로그램: 정상적으로 로그인, "테이블 내보내기" 클릭. 끝.
비정기 내보내기에서 확장 프로그램이 데이터 획득 시간에서 압승합니다.
예시 3: 일일 가격 모니터링 (1000페이지)
최적 접근법: Playwright + 큐
1000개 상품 페이지의 가격을 매일 확인해야 합니다. 이 경우:
// 배치 추출 의사코드
const urls = loadUrlsFromDatabase();
for (const url of urls) {
const page = await browser.newPage();
await page.goto(url);
await page.waitForSelector('.price');
const price = await page.evaluate(() =>
document.querySelector('.price').textContent
);
await saveToDatabase(url, price);
await page.close();
// 속도 제한
await sleep(randomBetween(1000, 3000));
}
확장 프로그램으로는 불가능합니다—사용자 인터랙션이 필요하기 때문입니다. Playwright가 적합한 도구입니다.
예시 4: 일회성 스포츠 통계 내보내기
최적 접근법: 브라우저 확장 프로그램
FBREF에는 복잡한 2단계 헤더가 있습니다. 이번 시즌 통계가 한 번만 필요합니다.
Python 접근법: 테이블 구조에 맞는 커스텀 파서 작성에 30분.
확장 프로그램 접근법: 내보내기 클릭. 10초.
일회성 추출에서는 과잉 엔지니어링 하지 마세요.
하이브리드 접근법
때로는 두 가지를 함께 사용해야 합니다:
-
확장 프로그램으로 인증 쿠키 내보내기
- 로그인된 세션에서 쿠키 내보내기
- Python/Playwright에서 자동화를 위해 가져오기
-
확장 프로그램으로 구조 분석, Python으로 확장
- 확장 프로그램 도구로 DOM을 수동 검사
- 구조를 파악한 후 타겟 스크래퍼 작성
-
Playwright로 네비게이션, 확장 프로그램으로 추출
- 스크립트가 페이지로 이동
- 복잡한 테이블 파싱을 위해 확장 프로그램 API 호출
나의 도구 구성
웹 테이블 데이터가 필요한 80%의 경우:
- 일회성, 인증 필요: HTML Table Exporter (제가 만든 브라우저 확장 프로그램)
-
일회성, 공개 데이터:
pd.read_html()또는 확장 프로그램 - 자동화 파이프라인: Playwright + 커스텀 파서
- API 가용: 직접 API 호출 (항상 선호)
최적의 도구는 특정 추출 상황에 따라 다릅니다. 문제의 복잡성에 솔루션의 복잡성을 맞추세요.
당신의 선호 추출 방식은 무엇인가요? gauchogrid.com/ko/html-table-exporter에서 자세히 알아보거나 Chrome 웹 스토어에서 무료로 확장 프로그램을 사용해보세요.
Top comments (0)