시작하며

Selenium은 웹 애플리케이션을 테스트하기 위한 인기 있는 오픈 소스 자동화 도구이다. Python 프로그래밍 언어를 사용하여 웹 브라우저를 제어하고 자동화된 테스트를 실행할 수 있다. 애플리케이션 테스트를 위해 사용할 수 있는 다양한 도구가 있지만 가장 인기 있는 도구는 Selenium과 Playwright이다.

배우고 사용하기 쉬운 도구를 찾고 있다면 Playwright가 좋지만. 강력하고 유연하며 다양한 브라우저와 운영 체제를 지원하는 도구를 찾고 있다면 Selenium이 좋은 선택이다.

그 간 경험해본 바로는 복잡한 UI구조를 갖는 사이트의 경우 Seleniumn이 보다 논리적으로 활용하기 편리했다. 그래서, Selenium을 이용한 스크래핑을 한 예로 몇 가지 기본이 되는 활용 법을 기록한다.

1. 필요한 설치 사항과 설치 방법

웹 스크래핑을 위해 우리가 필요로 하는 것들은 크게 세 가지이다: Chrome 브라우저, ChromeDriver, 그리고 Python의 Selenium 패키지이다.

1.1 Chrome 브라우저 설치

Google Chrome은 대부분의 컴퓨터에 이미 설치되어 있을 것이다. 그렇지 않다면 Google Chrome 공식 웹사이트에서 다운로드 받을 수 있다.

1.2 ChromeDriver 설치

ChromeDriver는 Selenium이 Chrome 브라우저와 상호작용할 수 있도록 하는 웹 드라이버이다. ChromeDriver를 설치하려면 다음의 단계를 따르자:

ChromeDriver 다운로드 페이지로 이동: https://sites.google.com/chromium.org/driver/
자신의 Chrome 브라우저 버전에 맞는 ChromeDriver를 다운로드 받다. (Chrome 브라우저 버전 확인 방법은 다음 섹션에서 설명하겠다.)
다운로드 받은 파일을 압축 해제하고, 원하는 위치에 저장한다.
ChromeDriver의 경로를 환경 변수 PATH에 추가한다. 이는 Selenium이 ChromeDriver를 찾을 수 있게 해줍니다.
1.3 Selenium 설치
Python의 Selenium 패키지는 pip를 통해 쉽게 설치할 수 있다. 아래의 명령어를 터미널에 입력하자:


pip install selenium

2. 버전 확인: ChromeDriver와 Chrome Browser

2.1 Chrome Browser 버전 확인

Chrome 브라우저의 버전을 확인하려면, 브라우저에서 chrome://settings/help로 이동하자. 이 페이지에서 Chrome의 현재 버전을 확인할 수 있다.

2.2 ChromeDriver 버전 확인

ChromeDriver의 버전은 실행 파일의 이름에 포함되어 있다. 예를 들어, 'chromedriver_91.0.4472.101'는 버전 91.0.4472.101을 나타냅니다. ChromeDriver의 버전은 설치한 Chrome 브라우저의 버전과 일치해야 한다.

3. 웹 스크래핑 시작: Daum 뉴스 기사 제목 스크랩하기

이제 필요한 모든 설치가 완료되었다. 이제 Python과 Selenium을 사용하여 "https://www.daum.net/"의 첫 페이지에 있는 뉴스 기사 제목을 스크랩해보겠다. 아래는 간단한 예제 코드이다:


from selenium import webdriver
import csv

# ChromeDriver의 위치를 지정하여 WebDriver 인스턴스를 생성한다.
driver = webdriver.Chrome('/path/to/your/chromedriver')

# 웹사이트에 접속한다.
driver.get('https://www.daum.net# We need to browse to get the xpath of the news title on the daum.net homepage.
open_url('https://www.daum.net')

일반적으로 웹사이트에서 특정 요소의 XPath를 얻기 위해선 브라우저 개발자 도구를 사용하는 것이 일반적이다. Chrome 브라우저에서는 다음과 같은 방법으로 XPath를 얻을 수 있다.

원하는 웹페이지를 연다. (이 경우 "https://www.daum.net/")
페이지에서 원하는 요소를 찾아 마우스 오른쪽 버튼을 클릭하고 "검사"를 선택한다. 이를 통해 브라우저의 개발자 도구가 열리고 해당 요소의 HTML 코드가 강조 표시된다.
해당 HTML 코드를 마우스 오른쪽 버튼으로 클릭하고 "Copy" -> "Copy XPath"를 선택한다. 이제 XPath가 클립보드에 복사되었다.
이 XPath를 사용하여 Selenium에서 해당 요소를 찾을 수 있다. XPath를 사용하여 뉴스 기사의 제목을 스크래핑하는 코드는 아래와 같다. 이 예제에서는 {xpath}를 실제 뉴스 제목의 XPath로 대체해야 한다.


# 뉴스 제목 요소를 찾다.
titles = driver.find_elements_by_xpath('{xpath}')

# 각 제목 요소의 텍스트를 출력한다.
for title in titles:
    print(title.text)

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

이 코드는 웹페이지에서 뉴스 제목 요소를 찾아 텍스트를 출력한 후 웹드라이버를 종료한다. 원하신다면, 이 텍스트를 CSV 파일에 저장할 수도 있다.


# 뉴스 제목과 날짜를 저장할 CSV 파일을 엽니다.
with open('news_titles.csv', 'w', newline='', encoding='utf-8') as file:
    writer = csv.writer(file)
    writer.writerow(["Date", "Title"])

    # 각 뉴스 제목 요소의 텍스트를 CSV 파일에 저장한다.
    for title in titles:
        writer.writerow([datetime.now().strftime('%Y-%m-%d'), title.text])

이 코드는 뉴스 제목과 현재 날짜를 CSV 파일에 저장한다. CSV 파일은 각 줄마다 하나의 뉴스 제목을 가지며, 각 줄은 날짜와 제목으로 구성된 두 개의 열을 가진다.

4. XPath를 이용한 HTML 요소 캡처

XPath는 XML 경로 언어의 약어로, XML 문서의 요소나 속성을 탐색하고 선택하는 데 사용된다. HTML은 XML의 한 형태이므로 XPath를 사용하여 HTML 요소를 선택할 수 있다.

Selenium에서는 find_element_by_xpath() 메서드를 사용하여 XPath에 따른 요소를 선택할 수 있다. 이 메서드는 주어진 XPath와 일치하는 첫 번째 요소를 반환한다. 같은 XPath를 가진 모든 요소를 선택하려면 find_elements_by_xpath()를 사용하면 된다.

다음은 XPath를 사용하는 간단한 예이다:


# XPath를 사용하여 HTML 요소를 선택한다.
element = driver.find_element_by_xpath('{xpath}')

# 선택한 요소의 텍스트를 출력한다.
print(element.text)

위 코드에서 {xpath}는 실제 요소의 XPath로 대체해야 한다.

XPath는 매우 강력한 도구이며, 특정 요소를 정확하게 선택할 수 있다. 그러나 XPath는 웹페이지의 구조에 매우 의존적이므로, 웹페이지의 구조가 변경되면 XPath도 수정해야 할 수 있다.

5. Undetected Chrome Browser를 이용한 로그인 수행

Selenium은 웹사이트의 자동화 테스트를 위해 사용되는 도구이므로, 몇몇 웹사이트는 Selenium을 통한 접근을 차단한다. 이러한 문제를 해결하기 위해, Undetected Chrome Driver를 사용할 수 있다. 이는 Selenium이 웹사이트에 자동화 도구로 인식되지 않도록 만들어줍니다.

Undetected Chrome Driver를 설치하려면 다음의 명령어를 실행하자:


pip install undetected-chromedriver

그리고 다음과 같이 코드를 수정하자:


import undetected_chromedriver as uc

driver = uc.Chrome()

이제 이 웹드라이버 인스턴스를 사용하여 웹사이트에 로그인할 수 있다.

6. Pyperclip을 이용한 멀티라인 텍스트 입력

Pyperclip은 클립보드에 접근하여 텍스트를 복사하고 붙여넣는 것을 가능하게 하는 Python 패키지이다. 이를 이용하여 멀티라인 텍스트를 텍스트 영역에 입력할 수 있다.

Pyperclip을 설치하려면 다음의 명령어를 실행하자:


pip install pyperclip

그리고 다음과 같이 코드를 작성하자:


import pyperclip

# 복사하려는 멀티라인 텍스트이다.
text = """
This is line 1.
This is line 2.
This is line 3.
"""

# 텍스트를 클립보드에 복사한다.
pyperclip.copy(text)

# 클립보드의 텍스트를 텍스트 영역에 붙여넣다.
driver.find_element_by_xpath('{xpath}').send_keys(Keys.CONTROL, 'v')

위 코드에서 {xpath}는 실제 텍스트 영역의 XPath로 대체해야 한다.

7. 메신저 형태 UI에서의 메시지 전송

메신저 형태의 UI에서는 텍스트 영역에 입력한 후 별도의 '전송' 버튼을 누르지 않고, Ctrl+Enter를 눌러 메시지를 전송하는 경우가 많다. Selenium에서도 이를 수행할 수 있다. 다음은 이를 수행하는 코드 스니펫이다:


from selenium.webdriver.common.keys import Keys

# 텍스트 영역 요소를 찾다.
text_area = driver.find_element_by_xpath('{text_area_xpath}')

# 텍스트 영역에 메시지를 입력한다.
text_area.send_keys('Hello, world!')

# Ctrl+Enter를 눌러 메시지를 전송한다.
text_area.send_keys(Keys.CONTROL, Keys.ENTER)

위 코드에서 {text_area_xpath}는 실제 텍스트 영역의 XPath로 대체해야 한다. 이를 통해 별도의 '전송' 버튼을 찾지 않고도 메시지를 전송할 수 있다.

8. lxml을 이용한 Scrap 코드 완성

Selenium으로 웹페이지를 직접 읽는 대신, lxml을 이용하여 로컬에 저장된 HTML 파일에서 요소를 찾는 방식을 사용할 수 있다. 이는 웹페이지의 변경에 덜 민감하며, 웹사이트에서 차단당하는 것을 방지할 수 있다.

lxml을 설치하려면 다음의 명령어를 실행하자:

pip install lxml

그리고 다음과 같이 코드를 작성하자:


from lxml import html

# 로컬에 저장된 HTML 파일을 읽다.
with open('saved_page.html', 'r', encoding='utf-8') as file:
    page = file.read()

# HTML 트리를 구성한다.
tree = html.fromstring(page)

# XPath를 이용하여 요소를 찾다.
titles = tree.xpath('{xpath}')

# 각 제목 요소의 텍스트를 출력한다.
for title in titles:
    print(title.text)

위 코드에서 {xpath}는 실제 요소의 XPath로 대체해야 한다. 이를 통해 로컬에 저장된 HTML 파일에서 XPath를 이용하여 요소를 찾을 수 있다.

마치며

Selenium을 이용하여 웹 스크래핑을 수행할 때는, 웹사이트에서 차단당하는 것을 방지하는 것이 중요한다. 이를 위해, 항상 같은 결과를 반환하는 페이지는 로컬에 저장하여 실험을 마친 후 메인 로직에 통합하는 방식을 추천한다. 이는 웹 스크래핑을 더 빠르고 안전하게 수행할 수 있게 한다.

또한, 웹페이지의 구조가 변경될 때마다 XPath도 수정해야 하므로, 가능하면 웹페이지의 구조가 안정적인 부분에 대해서만 XPath를 사용하는 것이 좋다. 이렇게 함으로써 웹페이지의 작은 변화에도 코드가 계속 동작하도록 할 수 있다.

이처럼 웹 스크래핑은 다양한 방법과 도구를 조합하여 수행할 수 있으며, 상황에 따라 가장 효과적인 방법을 선택하는 것이 중요한다. 이 글에서는 Selenium, Chrome Driver, Undetected Chrome Driver, Pyperclip, lxml 등의 도구와 기법을 이용한 웹 스크래핑에 대해 알아보았다. 이러한 도구와 기법을 적절하게 활용하여 웹 스크래핑을 수행해 보자.

profile
개발하면서 또는 프러덕 관리하면서 겪는 기억해둬야하는 내용을 메모장 삼아 남긴다. Google Keep이나 메모 도구에 남기는 것과는 달리 잘 정리할 수 있어서 언젠가 들춰봐야할 내용들을 담은 글들이 게시된다.

0개의 댓글