셀레니움을 사용할 때는 드라이버가 필요하다. 파이어폭스는 geckodriver, 크롬은 chromedriver, 그외 PhantomJS 등 브라우저마다 각각의 드라이버가 필요하다. 이 드라이버는 버전이 업그레이드 될때마다 번거롭게 다운 받아주어야 하는데 파이썬 코드로 이러한 번거로움을 날려버릴 수 있다. 이 글은 우리가 가장 많이 사용하는 구글의 크롬(chrome)을 기준으로 설명한다.
셀레니움 크롤링 소개
파이썬으로 크롤링을 할 때 여러가지 방법이 있다. requests + BeautifuSoup 을 사용하기도 하고, urllib 를 쓰기도 하고 scrapy 를 쓰기도 한다. 그러나 셀레니움이 속도가 조금 느릴 뿐이지 이것으로 웹자동화와 크롤링을 모두 할 수 있고, 특히 requests + BeautifuSoup 으로는 크롤링이 불가능한 영역까지 모두 소화해낼 수 있기 때문에 입문자들에게 다른 것을 붙잡고 스트레스를 받느니 그냥 셀레니움 사용을 적극 권하고 싶다.
입문자의 입장에서는 위에서 말한 BeautifulSoup 이 뭔지 scrapy 가 뭔지 지금 상황에서 알 필요가 없다. 일단 셀레니움을 알면 내가 필요한 일처리의 거의 대부분이 해결된다. 다른 것들은 나중에 가서 고수가 되었을 때 천천히 알아보자.
셀레니움은 우리가 사용하는 인터넷 브라우저(IE, Chrome, Safari, Opera등)을 컨트롤하여 우리가 브라우저로 볼 수 있는 것들은 다 보고 누르고 긁어올 수 있게 해준다. 일단 설치부터 해보자.
설치
보통은 이렇게 설치를 하라고 하지만 우리는 파이참을 많이 사용하기 때문에 파이참에서 셀레니움을 설치하는 방법도 알아보자. 파이참을 설치하고 세팅하는 방법은 이 문서를 참고하자.
좌측 하단 빨간색으로 표시된 Terminal 부분을 클릭하면 위와같이 터미널 창이 나온다. 우리가 흔히 알고 있는 command 창이라고 보면 된다. (커맨드 창이 뭔지는 몰라도 상관없다.) 여기서 pip install selenium 을 치면 설치가 된다. 컴퓨터에 하나의 파이썬 버전만 설치되어있다면 위와같은 방법을 사용해도 좋지만, 여러개의 파이썬 버전을 사용하고 있는 경우는 패스(path)가 꼬이는 문제가 발생할 수 있기 때문에 좀 더 확실한 방법을 알려주겠다.
File – setting 에 들어가서 좌측에 Project:프로젝트명 – Project Interpreter 를 클릭하면 위와 같은 창을 볼 수 있다. (개인마다 설치되어 있는 라이브러리가 다르기 때문에 화면 내용을 다를 수 있다.) 우측에 + 모양을 클릭하면
위와같은 창이 나오는데 selenium 을 검색하고 아래 Install Package 를 클릭하면 설치가 완료된다. 셀레니움 뿐만 아니라 내가 필요한 대부분의 라이브러리는 이곳에서 찾아서 설치가 가능하니 가능하면 이 기능을 적극 활용하자.
크롬 드라이버
크롬 드라이버는 크롬브라우저를 컨트롤 할 수 있게 해주는 파일이다. 이 파일은 크롬을 만든 구글 사이트에서 다운로드를 해주어야 한다. 크롬 드라이버 다운로드 주소에서 나의 크롬 버전에 맞는 드라이버를 다운 받고 파이썬 파일이 있는 곳에 넣어주어야 한다.
다운로드
일단 나의 크롬 브라우저 버전부터 확인하자. 나의 크롬버전은
여기서 확인이 가능하다.
https://chromedriver.chromium.org/downloads 에 접속해서 내 버전에 맞는 드라이버를 받아 파이썬 파일이 있는 곳에 저장하자.
이제 다운로드를 받았으니 크롬드라이버를 구동시켜보자
어디어디경로는 내가 크롬드라이버를 다운받은 정확한 위치를 입력하자. 만약 파이썬 파일이 있는 곳과 같은 폴더에 두었다면 chromedriver.exe 만 적어주어도 상관없다. 위 코드를 실행했을 때 에러가 나지 않고 크롬창이 잘 뜨면 성공이다. 그러나 이것은 시간이 지나고나면 우리에게 작은 문제(!)를 안겨다 준다. 나중에 크롬이 버전 업데이트를 하게 되면 우리가 다운받은 크롬드라이버와 크롬 브라우저가 버전이 서로 일치하지 않는 문제가 생기기 때문에 아래와 같은 에러가 발생한다.
selenium.common.exceptions.SessionNotCreatedException: Message: session not created: This version of ChromeDriver only supports Chrome version
자동다운로드 처리 코드
우리는 무언가를 자동화하기 위해 파이썬을 사용한다. 때문에 이런 것들을 자동으로 처리하는 것 역시 어렵지 않다. 크롬 드라이버를 자동으로 설치해주는 라이브러리를 설치하자.
이름하여 크롬 드라이버 오토인스톨러이다. 내 크롬 버전을 알아서 확인해서 알아서 맞는 버전을 다운로드 받아준다.
자 그럼 곧바로 활용해보자
위 코드는 앞으로 셀레니움을 실행하는 코드로 그대로 복붙해서 쓰면 좋다. 위 코드로 실행하면 크롬드라이버에 대한 번거로움을 완전히 해결된다. 이해를 위해 코드를 설명하자면
일단 chrome_ver 는 크롬 버전을 확인하기 위한 코드인데
chromedriver_autoinstaller.get_chrome_version()
를 입력하면 현재 내 크롬 브라우저의 버전을 알려준다. 예를 들어 내 크롬 버전이 ‘87.0.4280.88’ 라고 가정한다면 앞에 일단 맨앞 87만 알면 된다 (이유는 후술). 버전 맨 앞자리를 구하기 위해 . 으로 split 하고 리스트의 첫 인덱스만 가져온다.
chromedriver_autoinstaller.install(True)
는 크롬 드라이버를 설치하라는 코드이다. 괄호 안을 True 라고 적으면 현재 파이썬 파일이 있는 곳에 크롬 버전을 폴더 이름으로 하여 크롬드라이버가 그 안에 저장된다.
예를 들어 나의 크롬 브라우저 버전이 ‘87.0.4280.88′ 이라면 c:\경로(path)/87/chromedriver.exe 가 생성이 되는 것이다. 따라서 이 87을 자동으로 처리해주기 위해 chrome_ver = chromedriver_autoinstaller.get_chrome_version().split(‘.’)[0] 코드를 작성한 것이고 이를 통해 버전이 변동되어도 자동으로 변동된 버전을 확인하여 알아서 드라이버를 관리하게 된다.
마지막으로 driver.implicitly_wait(10) 차후에 자세히 설명할 일이 있을 것이다. 이 것은 드라이버를 구동했을 때 기본적으로 써주어야 한다는 사실을 잊지 말자.
updated 2021.4.3.
ABC 님께서 댓글로 잘못된 부분을 지적해주셔서 해당부분을 수정하였습니다.
chromedriver_autoinstaller.install() 에서 괄호 안에는 경로가 아닌 True 또는 False 가 입력됩니다. 기본값은 False 이며 False 입력시 파이썬 site-packages\chromedriver_autoinstaller 이하 폴더에 크롬드라이버가 설치됩니다.
ABC님께 감사의 말씀 다시 드립니다.
파이썬 초보인데 좋은 정보 주셔서 감사합니다. 크롬 버전 때문에 고민 중이었는데 글 덕분에 해결했어요!
도움이 되셨다니 기쁘네요… 글은 마음껏 퍼가셔도 좋습니다. 단, 출처는 꼭 밝혀주세요.
설정한 경로에 설치가 안됩니당..
맨 마지막 스크립트를 그대로 복붙하시면 경로문제는 발생하지 않으실 것입니다.
다만 chromedriver_autoinstaller 설치해주셔야 합니다.
pip install chromedriver-autoinstaller
chromedriver_autoinstaller.install(‘경로(path)’)에 들어가는 것은 경로가 아니라 flag인 것 같습니다
flag 가 아니고 경로가 맞습니다~
def install(cwd=False):
“””
Appends the directory of the chromedriver binary file to PATH.
:param cwd: Flag indicating whether to download to current working directory
:return: The file path of chromedriver
“””
인자로 받는 cwd의 주석 설명을 보십시오.
오 Flag 가 맞군요. 지금까지 왜 path라고 알고 그렇게 계속 써왔는지 모르겠습니다.
지적해주신 부분에 대해 진심으로 감사드립니다.
글은 수정하여 업데이트 하도록 하겠습니다.
안녕하세요. 이 방법으로 upbit.com 사이트를 열면, 봇으로 감지해서 그런지
“잠시만 기다려주세요” 부분에서 넘어가지 않습니다.
혹시 어떤방법이 있을까요?
반갑습니다. 본 사이트에 봇 탐지 우회에 관한 글이 있으니 참조하세요.
현재 구글에서 ‘셀레니움 봇 탐지’ 로 검색하면 가장 상단에 나오는 글이기도 합니다.
from selenium import webdriver
driver = webdriver.Chrome(“c:/crawling/chromedriver_win32/chromedriver.exe”)
—————————————————————————
FileNotFoundError Traceback (most recent call last)
/usr/local/lib/python3.7/dist-packages/selenium/webdriver/common/service.py in start(self)
현재 질문자님께서는 ㅋ 자동처리 코드를 복붙하시면 이런일이 발생하지 않는다는 글을 보시고 계십니다
크롬 117버전이 자동으로 안되는데 어떻게 해야할까요?ㅠㅠㅠㅠㅠ
위에 셀레니움 실행코드를 회사에서 해보니
Traceback (most recent call last):
File “d:\Pythonworkplace\dl_mugaerae.py”, line 7, in
driver = webdriver.Chrome(f’./{chrome_ver}/chromedriver.exe’)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “d:\Pythonworkplace\venv\Lib\site-packages\selenium\webdriver\chrome\webdriver.py”, line 45, in __init__
super().__init__(
File “d:\Pythonworkplace\venv\Lib\site-packages\selenium\webdriver\chromium\webdriver.py”, line 50, in __init__
if finder.get_browser_path():
^^^^^^^^^^^^^^^^^^^^^^^^^
File “d:\Pythonworkplace\venv\Lib\site-packages\selenium\webdriver\common\driver_finder.py”, line 47, in get_browser_path
return self._binary_paths()[“browser_path”]
^^^^^^^^^^^^^^^^^^^^
File “d:\Pythonworkplace\venv\Lib\site-packages\selenium\webdriver\common\driver_finder.py”, line 56, in _binary_paths
browser = self._options.capabilities[“browserName”]
^^^^^^^^^^^^^^^^^^^^^^^^^^
AttributeError: ‘str’ object has no attribute ‘capabilities’
라고 에러가 발생하네요. 뭐가 문제일까요?