스크레이핑(Scraping)은 웹 페이지에서 데이터를 추출하는 프로세스를 의미합니다. 많은 웹 사이트가 HTML 형식으로 정보를 제공하기 때문에, HTML을 구문 분석하고 추출하는 도구가 필요합니다. Python의 requests-html 라이브러리는 웹 페이지를 스크레이핑하는 강력하고 유연한 기능을 제공합니다.
requests-html은 requests 라이브러리의 wrapper로써, HTTP 요청을 보내고 응답을 받는데 사용됩니다. requests-html은 내부적으로 HTML 페이지를 파싱하여 파이썬 객체로 반환하는 역할을 수행합니다. 이러한 렌더링은 Javascript 실행, 동적 콘텐츠 로딩, AJAX 요청 등과 같은 웹 페이지의 동적인 부분들을 처리할 수 있습니다.
requests-html를 사용하여 스크레이핑을 수행하는 가장 강력한 기능 중 하나는 도메인 특정 언어(Domain Specific Language, DSL)의 사용입니다. DSL은 특정 작업을 수행하기 위해 설계된 프로그래밍 언어입니다. requests-html의 DSL은 HTML을 구문 분석하고 필요한 데이터를 추출하기 위해 사용됩니다.
예를 들어, 다음과 같은 HTML 페이지가 있다고 가정해봅시다:
<html>
<body>
<h1>Welcome to my Blog</h1>
<div class="post">
<h2>Introduction to Scraping</h2>
<p>Scraping is the process of extracting data from web pages.</p>
</div>
<div class="post">
<h2>Advanced Web Scraping Techniques</h2>
<p>Learn advanced techniques for web scraping using Python.</p>
</div>
</body>
</html>
requests-html의 DSL을 사용하여 위의 HTML 페이지에서 “post” 클래스를 가진 모든 div의 제목(h2)과 내용(p)을 추출할 수 있습니다. 이를 위한 코드는 다음과 같습니다:
from requests_html import HTMLSession
session = HTMLSession()
response = session.get('https://example.com/blog')
posts = response.html.find('.post')
for post in posts:
title = post.find('h2', first=True).text
content = post.find('p', first=True).text
print(f'Title: {title}')
print(f'Content: {content}')
print('----')
위의 코드에서는 requests-html의 HTMLSession 클래스를 사용하여 웹 페이지에 대한 세션을 만들고, get() 메서드를 사용하여 웹 페이지를 가져옵니다. 이후 response.html.find()
메서드를 사용하여 “post” 클래스를 가진 div 요소들을 검색합니다. 결과로 나온 div 요소들에 대해 post.find()
을 사용하여 제목(h2)과 내용(p)을 추출하여 출력합니다.
requests-html의 DSL은 HTML 구문을 이해하고 추출하기 쉽게 만들어주어, 스크레이핑 작업을 더욱 쉽게 수행할 수 있습니다. 이외에도 다양한 기능과 유용한 메서드들을 제공하기 때문에, requests-html은 웹 스크레이핑 작업에 필수적인 도구로 자리 잡고 있습니다.