초기 페이지 로드 후 JavaScript를 통해 콘텐츠를 로드하는 동적 웹사이트를 스크래핑하는 것은 골치 아픈 일이 될 수 있습니다. 스크레이핑하려는 데이터가 원시 HTML 소스 코드에 없을 수 있기 때문입니다.
나는 그 문제를 해결하기 위해 여기 있습니다.
이 기사에서는 Python과 Playwright를 사용하여 동적 웹사이트를 스크래핑하는 방법을 배웁니다. 결국에는 다음 방법을 알게 됩니다.
- 극작가 설정 및 설치
- 브라우저 인스턴스 생성
- 페이지로 이동
- 페이지와 상호작용
- 필요한 데이터를 긁어냅니다.
동적 웹사이트란 무엇입니까?
동적 웹사이트는 JavaScript와 같은 클라이언트측 스크립팅 언어를 사용하여 동적으로 콘텐츠를 로드합니다. 콘텐츠가 서버에서 사전 렌더링되는 정적 웹 사이트와 달리 동적 웹 사이트는 사용자 상호 작용, API에서 가져온 데이터 또는 기타 동적 소스를 기반으로 즉시 콘텐츠를 생성합니다. 이로 인해 정적 웹사이트에 비해 스크래핑이 더 복잡해집니다.
동적 웹페이지와 정적 웹페이지의 차이점은 무엇인가요?
정적 웹 페이지는 서버에서 사전 렌더링되어 완전한 HTML 파일로 제공됩니다. 해당 내용은 고정되어 있으며 기본 HTML 파일이 수정되지 않는 한 변경되지 않습니다. 반면 동적 웹 페이지는 JavaScript와 같은 클라이언트 측 스크립팅 언어를 사용하여 즉시 콘텐츠를 생성합니다.
동적 콘텐츠는 React, Angular, Vue.js와 같은 JavaScript 프레임워크 및 라이브러리를 사용하여 생성되는 경우가 많습니다. 이러한 프레임워크는 AJAX(Asynchronous JavaScript and XML)와 같은 기술을 사용하여 API에서 가져온 데이터나 사용자 상호 작용을 기반으로 DOM(문서 개체 모델)을 조작합니다.
동적 콘텐츠는 처음에는 HTML 소스 코드에 존재하지 않으며 캡처하려면 추가 처리가 필요합니다.
동적 콘텐츠 스크랩을 위한 도구 및 라이브러리
동적 콘텐츠를 스크랩하려면 JavaScript를 실행하고 실제 브라우저처럼 웹 페이지와 상호 작용할 수 있는 도구가 필요합니다. 그러한 도구 중 하나는 Chromium, Firefox 및 WebKit 브라우저를 자동화하기 위한 Python 라이브러리인 Playwright입니다.
Playwright를 사용하면 사용자 상호 작용을 시뮬레이션하고, JavaScript를 실행하고, 결과적인 DOM 변경 사항을 캡처할 수 있습니다.
Playwright 외에도 HTML을 구문 분석하고 렌더링된 DOM에서 관련 데이터를 추출하기 위해 Beautiful Soup와 같은 라이브러리가 필요할 수도 있습니다.
Playwright 사용에 대한 단계별 가이드
1. 설정 및 설치
- Python Playwright 라이브러리 설치: pip install Playwright
- 필수 브라우저 바이너리(예: Chromium) 설치: Playwright install chromium
2. 브라우저 인스턴스 만들기
필요한 Playwright 모듈을 가져오고 브라우저 인스턴스를 만듭니다.
from Playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch()
3. 새 브라우저 컨텍스트를 시작하고 새 페이지를 만듭니다.
page = browser.new_page()
4. 대상 웹사이트로 이동
page.goto("https://example.com/infinite-scroll")
5. 필요에 따라 페이지와 상호 작용
스크롤, 버튼 클릭, 양식 채우기 등을 통해 동적 콘텐츠 로딩을 트리거합니다.
# 더 많은 콘텐츠를 로드하려면 아래로 스크롤하세요.
while True:
page.evaluate("window.scrollTo(0, document.body.scrollHeight);")
new_content_loaded = page.wait_for_selector(".new-content", timeout=1000)
if not new_content_loaded:
break
6. 콘텐츠가 로드될 때까지 기다리세요
Playwright에 내장된 대기 메커니즘을 사용하여 원하는 콘텐츠가 로드될 때까지 기다립니다.
new_content_loaded = page.wait_for_selector(".new-content", timeout=1000)
7. 데이터 추출
Playwright의 평가 메커니즘을 사용하거나 Beautiful Soup과 함께 렌더링된 DOM에서 원하는 데이터를 추출하세요.
content = page.inner_html("body")
다음은 Playwright를 사용하여 무한 스크롤 페이지를 스크랩하는 전체 예입니다.
from Playwright.sync_api import sync_playwright
with sync_playwright() as p:
# 새로운 Chromium 브라우저 인스턴스 실행
browser = p.chromium.launch()
# 새 페이지 개체 만들기
page = browser.new_page()
# 무한 스크롤로 대상 웹사이트로 이동
page.goto("https://example.com/infinite-scroll")
# 더 많은 콘텐츠를 로드하려면 아래로 스크롤하세요.
while True:
# JavaScript를 실행하여 페이지 하단으로 스크롤
page.evaluate("window.scrollTo(0, document.body.scrollHeight);")
# 새 콘텐츠가 로드될 때까지 기다립니다(1초 후 시간 초과).
new_content_loaded = page.wait_for_selector(".new-content", timeout=1000) # Check for a specific class
# 새 콘텐츠가 로드되지 않으면 루프를 중단하세요.
if not new_content_loaded:
break
# 렌더링된 DOM에서 원하는 데이터 추출
content = page.inner_html("body")
# 브라우저 인스턴스를 닫습니다.
browser.close()
과제와 솔루션
웹 스크래핑 동적 콘텐츠에는 CAPTCHA 처리, IP 금지, 웹사이트에서 구현하는 기타 스크래핑 방지 조치 등 여러 가지 문제가 발생할 수 있습니다.
다음은 몇 가지 일반적인 해결 방법입니다.
- CAPTCHA: Playwright는 타사 서비스 또는 맞춤형 솔루션을 사용하여 CAPTCHA를 해결하는 메커니즘을 제공합니다. python-anticaptchacloud 또는 python-anti-captcha와 같은 라이브러리를 사용하여 프로그래밍 방식으로 CAPTCHA를 해결할 수 있습니다.
- IP 금지: 회전식 프록시나 헤드리스 브라우저를 사용하여 IP 금지를 피하고 실제 사용자 행동을 모방합니다. request-html 및 selenium과 같은 라이브러리는 Bright Data 또는 Oxylabs와 같은 프록시 서비스와 함께 사용할 수 있습니다.
- 스크래핑 방지 조치: 스크레이퍼의 감지 가능성을 낮추기 위해 무작위 지연, 사용자 에이전트 회전 및 기타 전술과 같은 기술을 구현합니다. fake-useragent 및 scrapy-fake-useragent와 같은 라이브러리는 사용자 에이전트 교체에 도움이 될 수 있습니다.
요약 및 다음 단계
웹사이트에서 구현한 스크래핑 방지 조치로 인해 웹 스크래핑 동적 콘텐츠는 정적 웹사이트 스크래핑보다 더 어려울 수 있습니다. 따라서 JavaScript를 실행할 수 있는 Playwright와 같은 도구 외에도 탐지를 피하고 성공적인 스크래핑을 보장하기 위해 프록시 회전, CAPTCHA 처리, 실제 사용자 동작 모방과 같은 추가 기술을 사용해야 할 수도 있습니다.
추가 학습 및 추가 리소스를 보려면 Playwright의 공식 문서를 살펴보세요.