본문 바로가기

Python

Python: Selenium in Linux # WSL # chromedriver # 예제 코드

728x90
반응형

Windows에서는 기존에 selenium을 이용하는 python script가 있는 경로에 chromedriver에 위치해놓고 썼다.

Linux, 특히 WSL 환경에서 Selenium을 사용하기 위한 방법을 살펴보자

 

1. chromedriver linux 용을 설치 - 압축 해제 후 chromedriver를 /usr/local/bin에 옮기자

sudo mv /home/usr/chromedriver /usr/local/bin/

2. 실행권한 주기

sudo chmod +x /usr/local/bin/chromedriver

* 그외 다른 경로에 넣고 실행하고 싶으면 그 경로 PATH에 등록

export PATH=$PATH:/home/user/some_path

 

아래는 WSL에서 쉽게 마주할 수 있는 에러이다.

위와 같이 해주고 selenium을 실행해보면

selenium.common.exceptions.WebDriverException: Message: unknown error: cannot find Chrome binary

위와 같은 에러를 마주하게 되는데, WSL에서는 chrome이 설치되어 있지 않아서 생긴 에러

Windows와 별도로 WSL에 chrome이 설치되어 있어야 WSL에서 돌리는 python script의 selenium이 chromedriver를 제대로 실행할 수 있다.

 

 

-------------------------

 

pip로 관리하기

 

위 설명은 WSL에서의 설명이므로 Windows GUI에서 driver를 받은 후에 옮길 수 있지만, Linux CLI 환경에서는 위 설명대로 적용하는 것이 어렵다.

 

Linux apt와 pip로 설치를 해보자

 

다운로드할 패키지 목록들을 최신화

sudo apt update

 

크롬 브라우저가 없는 경우는 우선 크롬 브라우저 설치를 한다.

sudo apt install google-chrome-stable

 

Chrome Driver 설치

sudo apt install chromium-chromedriver

 

Chrome Driver 실행권한 부여

sudo chmod +x /usr/bin/chromedriver

 

 

예제코드

  apt로 설치한 chromedriver 경로 지정

    -> webdriver.ChromeService(executable_path='/usr/bin/chromedriver')

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException
from info import base_url
import time

class StockListCrawler:
    def __init__(self):
        # Set up Chrome options
        self.options = webdriver.ChromeOptions()
        self.options.add_argument('--headless')  # Run in headless mode (no GUI)
        self.options.add_argument('--no-sandbox')
        self.options.add_argument('--disable-dev-shm-usage')

        # Initialize the driver with explicit service
        service = webdriver.ChromeService(executable_path='/usr/bin/chromedriver') # apt로 설치한 chromedriver 경로 지정
        self.driver = webdriver.Chrome(service=service, options=self.options)
        self.wait = WebDriverWait(self.driver, 10)

    def get_stock_list(self):
        print("Getting stock list")
        try:
            # Navigate to the base URL
            self.driver.get(base_url)
            
            # Wait for the page to load
            time.sleep(2)
            
            # Here you'll need to add specific selectors for the stock data
            # This is a placeholder - modify according to the actual website structure
            stock_elements = self.wait.until(
                EC.presence_of_all_elements_located((By.CSS_SELECTOR, "your-stock-selector"))
            )
            
            stock_data = []
            for element in stock_elements:
                print(element)
                stock_info = {
                    'symbol': element.get_attribute('data-symbol'),
                    'name': element.text,
                    # Add more fields as needed
                }
                stock_data.append(stock_info)
                
            return stock_data

        except TimeoutException:
            print("Timeout while loading the page")
            return []
        except Exception as e:
            print(f"An error occurred: {str(e)}")
            return []
        finally:
            self.close()

    def close(self):
        """Close the browser and clean up resources"""
        if self.driver:
            self.driver.quit()

def main():
    print("Starting stock list crawler")
    crawler = StockListCrawler()
    stock_list = crawler.get_stock_list()
    print(f"Found {len(stock_list)} stocks")
    print(stock_list)

if __name__ == "__main__":
    main()
728x90
반응형