셀레니움과 크롬 드라이버를 이용해 웹 정보를 수집(크롤링)을 하는데, 자꾸만 에러가 발생했다.
The chromedriver version (119.0.6045.105) detected in PATH at C:\Users\jandb\.wdm\drivers\chromedriver\win64\119.0.6045.105\chromedriver-win32\chromedriver.exe might not be compatible with the detected chrome version (120.0.6099.71);
잘 되던 코드였는데, 어느 순간부터 해당 크롬 드라이버를 찾지 못했다. 크롬 브라우저가 업데이트 되면서 버전이 올라갔다. 그런데 파이썬 셀레니움에서 해당 버전을 자동 업데이트하지 못했다. 4.0부터는 자동으로 가능한 걸로 아는데, 여튼 안되었다.
ChatGPT에 위 에러 메시지를 던졌다. 파이썬 에러코드를 그대로 ...
답변은 시원시원했다. 3가지 해결책을 리턴했다.
제공된 경고 메시지는 ChromeDriver와 Chrome 브라우저 간의 버전 불일치를 나타냅니다. ChromeDriver 버전 119.0.6045.105이 PATH에 감지되었지만 Chrome 브라우저 버전이 120.0.6099.71입니다. 이러한 불일치는 자동화된 테스트나 스크립트 실행 시 문제를 일으킬 수 있습니다.
이 문제를 해결하려면 몇 가지 옵션이 있습니다.
- ChromeDriver 업데이트:
- 공식 ChromeDriver 다운로드 페이지를 방문하세요: https://sites.google.com/chromium.org/driver/
- Chrome 브라우저 버전과 일치하는 ChromeDriver 버전을 다운로드하세요 (이 경우 120.0.6099.x).
- 다운로드한 버전으로 현재 PATH에 있는 ChromeDriver 실행 파일을 교체하세요.
- Chrome 브라우저 다운그레이드:
- ChromeDriver를 업데이트하는 것이 불가능한 경우 현재 설치된 ChromeDriver 버전과 호환되는 이전 버전의 Chrome 브라우저로 다운그레이드할 수 있습니다.
- Chrome 릴리스 아카이브를 방문하세요: https://commondatastorage.googleapis.com/chromium-browser-snapshots/index.html
- 현재 설치된 ChromeDriver 버전에 해당하는 이전 버전을 다운로드하세요.
- WebDriverManager 사용:
- WebDriverManager는 브라우저 드라이버의 자동 관리를 수행하는 라이브러리로, 설치된 Chrome 브라우저에 적합한 ChromeDriver 버전을 자동으로 다운로드할 수 있습니다.
- Java와 같은 프로그래밍 언어를 사용하는 경우 프로젝트에 WebDriverManager를 통합할 수 있습니다.
Java에서 WebDriverManager를 사용하는 간단한 예제는 다음과 같습니다:
import io.github.bonigarcia.wdm.WebDriverManager;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
public class Example {
public static void main(String[] args) {
// WebDriverManager를 사용하여 ChromeDriver 설정
WebDriverManager.chromedriver().setup();
// ChromeDriver의 인스턴스 생성
WebDriver driver = new ChromeDriver();
// 나머지 코드...
}
}
귀하의 요구에 가장 적합한 옵션을 선택하고 최적의 호환성을 위해 브라우저 및 드라이버 버전을 동기화하는 것이 중요합니다
- 첫 번째는 크롬 드라이버를 직접 받아 설치하는 방식이다. 가장 쉬운 해결책이다. 하지만 매번 드라이버 버전이 바뀔때마다 이 작업을 한다면 엄청나게 귀찮은 작업이다.
- 두 번째는 chrome 드라이버가 아닌 브라우저를 다운 그레이드 하라는 건데, 이 건 더 귀찮고 보안상 취약점이 발생할 수 있어서 올바른 방법이 아니다.
- 세 번째는 WebDriverManager를 이용해 드라이버 setup을 명시적으로 하라는데, 별로다. 최근 셀레니움은 드라이버를 자동으로 업그레이드시키니까 말이다.
내가 원한 궁금증은 왜 자동으로 드라이버를 갱신하지 않는다는 거였는데, chatgpt 입장에서 내 pc 사정이 어떤지 정확히 알 수 없으니 정확한 답변은 내기가 어렵다.
그래서 해결방안을 찾아봤다. 크롬 드라이버를 어떻게 참조하는가?
가장 먼저는 cache를 뒤진다. 소스 코드를 디버깅하면, chromedriver path를 확인할 수 있다.
사용자 디렉터리의 cache 밑으로 크롬드라이버가 생성된다. 버전별 디렉터리가 있다.
만약, 처음 실행이라면 chache에 없다. 그러면 소스코드가 실행되는 바로 그 디렉터리에서 찾아 참조한다.
C:\temp 라면, 웹에서 해당 크롬 드라이버를 다운로드하여 옮겨두고, 코드를 실행해 보자. 정상 실행되고 나면 .cache 디렉터리에 크롬드라이버가 생성되어 있는 걸 확인할 수 있다.
별거 아닌데, 이거 이해하는데 며칠은 걸린 것 같다.
정리하면,
1. (아마도) 셀레늄 4.0 버전 이상부터는 selenium 4.6부터 크롬 드라이버를 자동으로 내려받는다. 더 이상 소스코드에 지저분한 코딩을 추가할 필요가 없다.
> 그런데, 여기도 한가지 심각한 문제가 있다. 크롬 드라이버가 최신버전으로 업그레이드 되어 selenium보다 버전이 높아지면, 크롬드라이버를 자동으로 업그레이드 하지 못한다.
pip install --upgrade selenium
cmd창에서 업그레이드를 해주면 되지만, 매번 버전이 올라갈 때마다 해줄수는 없는 노릇이다. 그래서 소스코드에 자동 업그레이드 코드를 넣어서 selenium 최신버전을 유지하도록 해야 한다.
import os
import time
from selenium import webdriver
# selenium 버전 업그레이드
os.system('pip install --upgrade selenium')
# 크롬 드라이버 가져오기
driver = webdriver.Chrome()
# selenium 버전 확인
print(webdriver.__version__)
# 웹 페이지 열기 예제
driver.get("https://www.naver.com")
time.sleep(5)
# 드라이버 사용 후 종료
driver.quit()
2. cache 디렉터리에서 크롬 드라이버를 찾고, 없으면 소스코드 실행 디렉토리에서 찾는다.
3. 2번에서 못 찾으면 웹에서 자동 다운로드하여 cache에 저장된다.
ChatGPT를 이용해 파이썬 크롤링 프로그램 디버깅을 해보았다. 구글링으로 찾는 거보다 훨씬 빠르게 해결을 할 수 있다. 더군다나 샘플코드까지 친절하게 제공해 주니 정말 편리하다. 단, 소스코드가 완벽하진 않으니, 디버깅을 해보고 필요한 부분만 사용해야 한다.
'코드리뷰 > chatGPT(Python)코드' 카테고리의 다른 글
파이썬 가상환경 만들기 (venv) (0) | 2024.02.23 |
---|---|
ChatGPT는 절대 로또 번호를 알려주지 않는다!? (2) | 2023.04.11 |
ChatGPT 전문가 뺨치는 블로그 만들기 (2) | 2023.04.01 |
댓글