1. 동적 페이지 소개
JavaScript 덕분에 콘텐츠를 실시간으로 업데이트하는 웹사이트에서 데이터를 스크래핑하려고 시도한 적이 있다면, 이것이 얼마나 골치 아픈 일일 수 있는지 알 거야. 하지만 걱정하지 마! 복잡한 코드는 마법처럼 보이도록 설정할 수 있어. 이제 requests_html이 이런 콘텐츠와 어떻게 작업할 수 있는지 알아보자.
모든 웹 페이지가 똑같이 유용한 것은 아니야. 어떤 페이지는 콘텐츠를 즉시 로드하고, 다른 페이지는 JavaScript를 통해 동적으로 콘텐츠를 생성하거나 업데이트할 수 있어. 이것은 데이터를 추출하려는 사람들에게 몇 가지 어려움을 만들어. 왜냐하면 개발자 도구에서 보이는 HTML이 표준 요청을 통해 얻는 HTML과 다를 수 있기 때문이야.
동적 콘텐츠 스크래핑 시 발생하는 문제
requests와 같은 웹 작업 라이브러리의 대부분은 서버 응답만 처리하고 JavaScript를 실행할 수 없어. 이는 콘텐츠가 JavaScript를 통해 로드되거나 변경되는 경우, 표준 요청에서 해당 콘텐츠를 전혀 확인할 수 없음을 의미해.
2. requests_html 라이브러리 사용
그리고 여기 requests_html이 등장해! 이 라이브러리는 requests의 간단함과 JavaScript 실행 브라우저의 강력함을 결합해. 이 라이브러리는 JavaScript 실행을 지원하는 기본 렌더링 엔진을 제공하여, 마치 실제 브라우저를 사용하는 것처럼 동적 웹 페이지와 상호작용할 수 있게 해줘.
라이브러리 설치 및 설정
작업을 시작하려면 requests_html을 설치하자. 네가 좋아하는 터미널을 열고 아래 명령어를 실행하면 돼:
pip install requests-html
훌륭해, 라이브러리가 설치됐어! 이제 이걸 사용할 수 있어.
JavaScript 콘텐츠를 추출하기 위한 requests_html 기본 사용법
requests_html 덕분에 우리 삶이 더 쉬워졌어. 실제로 어떻게 작동하는지 살펴보자. JavaScript를 통해 데이터를 생성하는 페이지가 있다고 가정해 보자.
from requests_html import HTMLSession
# HTML 세션을 생성
session = HTMLSession()
# 웹 페이지 요청 실행
response = session.get('https://example-dynamic-page.com')
# JavaScript 렌더링
response.html.render()
# 데이터 추출
data = response.html.find('#dynamic-content', first=True)
print(data.text)
이게 바로 마법이지! requests와는 달리 requests_html은 .render() 메서드를 제공하여 페이지를 "실행"하고 JavaScript를 실행할 수 있어. 페이지가 "살아났을" 때, 이전에 배운 선택자를 사용하여 필요한 데이터를 추출할 수 있어.
3. 데이터 추출 예제
이제 심화적으로 들어가 몇 가지 예제를 살펴보자. 이걸 통해 requests_html이 다양한 상황에서 우리를 어떻게 도와주는지 볼 수 있어.
동적 페이지에서 데이터 추출 실습
예를 들어, 스크롤 후에만 최신 뉴스를 로드하는 페이지가 있다고 상상해 보자. requests_html을 사용하면 사용자 행동을 모방할 수 있어.
url = 'https://example-news-site.com'
# 페이지 로드
response = session.get(url)
# 렌더링 실행(필요한 경우 타임아웃 증가)
response.html.render(timeout=20)
# 뉴스 요소 찾기
news_items = response.html.find('.news-item')
for item in news_items:
print(item.text)
이전에 잡을 수 없었던 콘텐츠에 액세스하는 것이 얼마나 쉽고 간단한지 알 수 있지!
requests_html로 로드된 JavaScript 콘텐츠 처리
requests_html과 이전 강의에서 살펴본 CSS 선택자를 사용하면, 마치 여러 해 동안 스크래핑을 연습한 것처럼 웹 페이지 콘텐츠를 작업할 수 있어!
# 첫 번째 뉴스 헤드라인 요소 선택
headline = response.html.find('.news-headline', first=True)
print(headline.text)
# 요소에서 링크 추출
link = headline.find('a', first=True).attrs['href']
print(link)
4. 실전 팁과 트릭
requests_html은 강력한 도구지만, 이를 사용할 때는 몇 가지를 기억해야 해:
- 타임아웃과 지연시간: 더 복잡한 페이지에는 렌더링 타임아웃을 조정하는 것을 잊지 마. 이는 느린 로드로 인한 오류를 방지하는 데 도움이 돼.
- 렌더링 성능:
requests_html은 JavaScript를 렌더링하므로 많은 리소스를 소모할 수 있어. 데이터가 많거나 복잡한 페이지를 작업할 때 이로 인해 프로세스가 느려질 수 있어. - CAPTCHA와 봇 방지:
requests_html은 봇 방지 기술이나 CAPTCHA를 우회하지 못해. 더 복잡한 경우에는 Selenium 같은 툴을 사용하는 것이 좋아.
GO TO FULL VERSION