셀레늄 멀티쓰레딩
파이썬을 사용하여 웹 페이지에서 데이터를 스크래핑하는 것은 매우 일반적인 작업 중 하나입니다. Selenium은 이러한 작업을 위해 널리 사용되는 도구 중 하나로, 웹 브라우저를 프로그래매틱으로 제어하여 웹 페이지의 동적 콘텐츠를 포함한 데이터를 추출할 수 있습니다. 멀티쓰레딩을 이용하면 Selenium을 사용한 웹 스크래핑 작업을 병렬로 수행하여 효율성을 높일 수 있습니다. 본 글에서는 Python의 threading
모듈을 사용하여 Selenium 기반 웹 스크래핑을 멀티쓰레딩으로 구현하는 방법에 대해 설명합니다.
기본 설정
먼저 필요한 라이브러리를 임포트합니다. threading
은 파이썬의 기본 스레딩 모듈, selenium
은 웹 브라우저를 자동화하기 위한 라이브러리, chromedriver_autoinstaller
는 ChromeDriver를 자동으로 설치해주는 유틸리티, 그리고 BeautifulSoup
은 HTML과 XML 파일을 파싱하기 위한 라이브러리입니다.
import threading
from selenium import webdriver
import time
import chromedriver_autoinstaller
from bs4 import BeautifulSoup
스크래핑 스레드 클래스 정의
멀티쓰레딩을 위해 threading.Thread
를 상속받아 ScrapeThread
클래스를 정의합니다. 이 클래스는 각 스레드가 실행할 run
메소드에서 실제 스크래핑 작업을 수행합니다. 생성자에서는 스레드가 스크래핑할 웹 페이지의 URL을 받아 인스턴스 변수로 저장합니다.
class ScrapeThread(threading.Thread):
def __init__(self, url):
threading.Thread.__init__(self)
self.url = url
def run(self):
chromedriver_autoinstaller.install()
driver = webdriver.Chrome()
driver.get(self.url)
page_source = driver.page_source
soup = BeautifulSoup(page_source, 'html.parser')
if self.url == "https://www.naver.com":
print("특별한 URL에서 작업 수행:", soup.title.text + '\n')
elif self.url == "https://www.google.com":
print("또 다른 특별한 URL에서 작업 수행:", soup.title.text + '\n')
else:
print("없음")
time.sleep(1)
driver.close()
스레드 실행
여러 웹 페이지에 대해 병렬 스크래핑을 시작합니다. 이를 위해 각 URL에 대해 ScrapeThread
인스턴스를 생성하고, 스레드를 시작한 후, 모든 스레드가 종료될 때까지 기다립니다(join
메소드 사용).
urls = ['https://www.naver.com', 'https://www.google.com']
threads = []
for url in urls:
t = ScrapeThread(url)
t.start()
threads.append(t)
for t in threads:
t.join()
주의 사항
멀티쓰레딩을 사용할 때는 각 스레드에서 생성되는 WebDriver 인스턴스가 시스템 리소스를 상당량 소모할 수 있으므로 주의가 필요함.
댓글