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()
'Python' 카테고리의 다른 글
Python: moviepy # duration # 비디오 파일 재생시간 가져오기 (0) | 2023.03.25 |
---|---|
isinstance() # check is instance of class # check type # datetime.date (0) | 2023.03.19 |
이중 삼중 for문 break # forloop # break (0) | 2023.03.04 |
Python: 동적으로 변수 이용 # 전역변수, 지역변수, globals(), locals(), importlip, getattr (0) | 2023.03.01 |
sort # 복수의 값으로 정렬할 때 (0) | 2023.01.28 |