본문 바로가기

Python/Others

Python 웹스크래핑 관련 라이브러리 종류

반응형

Python 웹스크래핑 관련 라이브러리 종류

오랜만에 Python과 관련된 포스트를 작성하는 듯 하다.
이번 포스트에서는 Python에서 웹스크래핑 작업을 할 때 사용하는 라이브러리 종류에 대해서 알아보고자 한다.
필자의 경우 주식 분석 글을 작성할 때 기업의 재무제표를 블로그에 내 스타일대로 작성하기 위해 파이썬으로 웹스크래핑 코드를 만들었었다.
웹스크래핑을 공부할 때 Beautiful Soup, Requests, Selenium만 배웠었는데, 이 라이브러리말고 어떤 것이 있는지 간단하게 알아보자.

목차

Beautiful Soup

Beautiful Soup는 HTML과 XML 파일로부터 데이터를 추출하기 위해 사용된다.
웹 페이지의 구조를 파악하고, 특정 태그를 쉽게 찾아내거나, 웹 페이지의 내용을 필요에 따라 추출하거나 조작할 수 있다.
예를 들어, 웹 사이트의 특정 부분만을 가져오거나, 링크가 담긴 모든 태그를 찾아내고 싶을 때 Beautiful Soup을 사용할 수 있다.

이 라이브러리의 장점은 사용하기 쉽고 직관적인 API를 제공한다는 것이다.
Beautiful Soup는 태그의 이름과 속성을 이용하여 쉽게 접근하고, CSS 선택자를 통해 태그를 선택하는 기능도 제공한다.
또한, 문서 내에서 문자열을 검색하고, 태그의 내용을 수정하거나 추가하는 기능도 포함하고 있다.

Beautiful Soup는 정적인 HTML을 파싱하는 데는 효과적이지만, 자바스크립트로 동적으로 생성되는 내용을 직접적으로 다루지는 못한다.
웹 페이지에 동적 콘텐츠가 많은 경우, Beautiful Soup만으로는 충분하지 않을 수 있다.



✅ Install
pip install beautifulsoup4
✅ Example
from bs4 import BeautifulSoup
import requests

# 웹 페이지를 불러온다 (Requests)
url = 'http://example.com/'
response = requests.get(url)

# response.content로 웹 페이지의 내용을 받아온다.
soup = BeautifulSoup(response.content, 'html.parser')

# find() 메서드를 사용하여 웹 페이지에서 첫 번째 <h1> 태그를 찾는다.
first_h1 = soup.find('h1')

# find_all() 메서드를 사용하여 모든 <a> 태그를 찾는다.
all_links = soup.find_all('a')
Requests

Requests 라이브러리는 파이썬에서 HTTP 요청을 쉽게 발송할 수 있도록 해주는 라이브러리이다.
HTTP를 이용한 네트워크 통신을 구현할 때 필요한 기능들을 직관적이고 사용하기 쉬운 인터페이스로 제공한다.

간단한 API를 통해 GET, POST, PUT, DELETE 등의 HTTP 메소드를 사용할 수 있게 해주며, 쿠키를 이용한 세션 관리를 자동으로 처리하여, 로그인이 필요한 웹 서비스에 대한 지속적인 요청을 보낼 수도 있다.

URL 파라미터를 딕셔너리 형태로 전달할 수 있으며, 자동으로 적절한 형태로 인코딩해준다.
또한 JSON 응답은 자동으로 파이썬 딕셔너리로 변환할 수 있고, 바이너리 응답도 쉽게 처리할 수 있다.

요청의 최대 대기 시간을 설정해서 서버의 응답이 늦어질 때의 타임아웃을 관리할 수도 있다.


✅ Install
pip install requests
✅ Example
import requests

# GET 요청
response = requests.get('https://api.example.com/data')
# POST 요청
response = requests.post('https://api.example.com/data', data={'key': 'value'})
Selenium

Selenium은 주로 웹 애플리케이션의 테스트 자동화를 위해 개발된 오픈 소스 소프트웨어이다.
웹 애플리케이션의 테스팅을 자동화하기 위해 개발되었으며, 여러 브라우저 환경에서 애플리케이션을 테스트하는 데 주로 사용된다.
테스팅 외에도, 웹 스크래핑이나 웹 UI 자동화 작업에도 널리 활용된다.

실제 브라우저를 제어하여 웹 페이지를 열고, 클릭, 스크롤, 자바스크립트 실행 등의 작업을 수행할 수 있다.
Chrome, Firefox, Safari, Edge 등 다양한 브라우저를 지원한다.

Selenium은 Python 외에도 Java, C#, Ruby 등 다양한 프로그래밍 언어로 Selenium 코드를 작성할 수 있다.

  • Selenium WebDriver : 실제 브라우저를 제어하는 인터페이스를 제공한다.
    WebDriver는 각 브라우저에 맞는 드라이버를 통해 브라우저와 상호작용한다.

  • Selenium Grid: 여러 시스템에서 동시에 테스트를 실행할 수 있게 해주는 서버이다.
    이를 통해 다양한 브라우저와 운영 체제에서 테스트를 분산시켜 실행할 수 있다.

  • Selenium IDE: 브라우저 확장 기능으로, 사용자의 웹 상호작용을 기록하고,
    이를 자동화 스크립트로 변환하여 재생할 수 있는 도구이다.

✅ Install
pip install selenium

Selenium을 사용할 때는, 사용할 브라우저에 맞는 드라이버를 설치해야 한다.
예를 들어, 크롬 브라우저를 자동화하려면 크롬 드라이버(ChromeDriver)가 필요하다.

  • ChromeDriver : Google Chrome 브라우저
  • GeckoDriver : Mozilla Firefox 브라우저
  • EdgeDriver : Microsoft Edge 브라우저
  • SafariDriver : Apple Safari 브라우저

각 드라이버는 해당 브라우저의 공식 웹사이트나 드라이버 관리 페이지에서 다운로드 받을 수 있다.



✅ Example (ChromeDriver)
from selenium import webdriver

# ChromeDriver의 경로를 지정
# 만약 PATH에 ChromeDriver가 추가되어 있다면 경로 지정은 생략 가능하다.
driver_path = '/path/to/chromedriver'
driver = webdriver.Chrome(driver_path)

# ChromeDriver로 웹사이트 실행.
driver.get('https://www.google.com')

# 페이지의 제목을 출력
print(driver.title)

# 웹 드라이버를 종료
driver.quit()
Scrapy

Scrapy는 파이썬으로 작성된 고성능의 웹 크롤링 및 스크레이핑 프레임워크이다.
비동기 처리를 기반으로 하여 빠른 데이터 추출이 가능하고, 데이터 수집을 위한 강력한 기능들을 제공한다.
Scrapy는 웹사이트를 순회하며 특정 정보를 추출하고, 추출된 데이터를 다양한 형식으로 저장하는 데 사용된다.

XPath 및 CSS를 이용한 선택자를 사용하여 웹 페이지에서 데이터를 추출할 수 있게 지원한다.
또한 정규 표현식을 사용하여 데이터를 더 정밀하게 처리할 수 있다.

사용자가 필요에 따라 추가 컴포넌트를 쉽게 추가할 수 있도록 설계되었으며, 미들웨어, 플러그인 등을 통해 기능을 확장할 수 있다.

robots.txt 파일을 자동으로 인식하고 준수하여, 웹사이트의 크롤링 정책을 따른다.

크롤링 과정에서 발생하는 다양한 이벤트를 로깅하여, 크롤링 과정의 모니터링 및 디버깅을 용이하게 한다.

세션 관리를 위한 내장 메커니즘이 있어, 쿠키를 통한 로그인이 필요한 사이트도 크롤링할 수 있다.



✅ Install
pip install scrapy

Scrapy 프로젝트를 시작하기 전에 scrapy startproject 명령어를 통해 새 프로젝트를 생성해야 한다.

scrapy startproject myproject

이 명령어를 실행하면 myproject라는 이름의 프로젝트 폴더가 생성되며, 그 안에는 프로젝트를 구성하는 다양한 파일들이 포함된다.



✅ Example
import scrapy

class QuotesSpider(scrapy.Spider):
    name = "quotes"
    start_urls = [
        'http://quotes.toscrape.com/'
    ]

    def parse(self, response):
        for quote in response.css('div.quote'):
            yield {
                'text': quote.css('span.text::text').get(),
                'author': quote.css('span small::text').get(),
                'tags': quote.css('div.tags a.tag::text').getall(),
            }

        next_page = response.css('li.next a::attr(href)').get()
        if next_page is not None:
            yield response.follow(next_page, self.parse)

이 코드를 quotes_spider.py와 같은 이름으로 myproject/myproject/spiders 폴더 안에 저장하고서 아래 코드로 실행할 수 있다.
여기서 스파이더의 이름은 quotes이다. (myproject 경로에서 실행한다.)

scrapy crawl quotes

이 스파이더는 quotes.toscrape.com 웹사이트를 방문하여 각 인용구의 텍스트, 저자, 태그를 추출하고, 페이지에 다음 페이지 링크가 있으면 그 페이지로 이동하여 계속해서 인용구를 추출한다.

아래는 결과를 json으로 저장하게 하는 코드이다.

scrapy crawl quotes -o results.json

코드를 실행하면 아래처럼 results.json이 생성된다.

MechanicalSoup

MechanicalSoup은 웹 브라우징을 자동화하기 위한 간단한 API를 제공한다.
Requests 라이브러리를 기반으로 하여 웹 사이트와의 상호 작용을 단순화시키며, BeautifulSoup을 통해 HTML 문서를 파싱할 수 있다.
MechanicalSoup은 브라우저 객체를 생성하여 세션 관리, 쿠키를 다루고, HTML 폼을 채우고 제출하는 등의 기능을 수행할 수 있다.

자동 리다이렉션을 처리하는데, 웹 페이지 간의 이동이 사용자의 추가 개입 없이도 원활하게 이루어지게 한다.

HTTP 오류가 발생하였을 때 이를 감지하고 적절한 예외를 발생시켜 사용자가 문제를 해결할 수 있도록 도와준다. 또한 웹 페이지에 포함된 이미지나 CSS, JavaScript 파일과 같은 자원에도 접근할 수 있다.



✅ Install
pip install MechanicalSoup

아래 코드는 구글 검색창에 Hello, world를 검색하고 검색 결과 페이지에서 모든 a tag를 찾은 뒤, 해당 a 태그의 text를 출력하는 코드이다.



✅ Example
import mechanicalsoup

# MechanicalSoup 브라우저 인스턴스를 생성
browser = mechanicalsoup.Browser()

# Google 홈페이지로 이동
google = browser.get("http://www.google.com")

# 검색창 폼을 찾는다. (Google 홈페이지의 검색 폼 name은 "f")
search_form = google.soup.find('form')

# 검색창 input name=f를 찾아 "Hello, world"를 입력
search_form.find('input', {'name': 'q'})['value'] = 'Hello, world'

# 폼을 제출하고 결과 페이지로 이동
search_results = browser.submit(search_form, google.url)

# 결과 페이지에서 모든 검색 결과 링크를 찾는다.
links = search_results.soup.find_all('a')

for link in links :
    print(link.text)

위 코드를 실행하면 아래와 같은 결과를 출력한다.

Playwright

Playwright는 Microsoft에 의해 개발된 오픈 소스 자동화 라이브러리로, 주로 브라우저 기반의 웹 애플리케이션 테스팅을 위해 사용된다.
이는 웹사이트의 자동화된 테스트를 가능하게 하며, Chromium, Firefox, 및 WebKit을 통해 크로스 브라우저 테스팅을 지원한다.
Playwright는 다양한 언어로 API를 제공하고 있으며, 여기에는 Node.js, Python, C# 및 Java가 포함된다.

GUI 없이 백그라운드에서 브라우저를 실행할 수 있으며, CSS, XPath, 텍스트 콘텐츠를 사용하여 요소를 선택할 수 있다.

키보드 입력, 마우스 클릭 등 사용자 인터랙션을 시뮬레이션 할 수 있다.
여러 페이지 및 iframe 내부의 요소와 상호 작용할 수 있으며, 모바일 환경을 에뮬레이션하여 테스팅할 수 있다.



✅ Install
pip install playwright
playwright install
✅ Example
from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    # Chromium 브라우저 인스턴스를 생성
    browser = p.chromium.launch(headless=False)  # headless=False는 브라우저 UI가 보이게 한다.
    
    # 새 페이지 오픈
    page = browser.new_page()
    
    # 원하는 웹사이트로 이동
    page.goto('http://www.naver.com/')
    
    # 페이지 타이틀을 출력
    print(page.title())
    
    # 브라우저 종료
    browser.close()

위 코드를 실행하면 크롬으로 Naver가 열린 후 해당 페이지의 타이틀을 출력해준다.


이번 포스트에서는 파이썬으로 웹스크래핑을 하기 위해 필요한 라이브러리 종류에 대해서 알아보았다.
이 글을 작성하면서 관심이 가는 것은 Playwright인데, 나중에 시간내서 스터디를 해봐야겠다.

커피 한 잔으로
저를 응원해주세요!
반응형

loading