[파이썬] Python 셀레늄(selenium)으로 자동 로그인 기능 및 검색기능 구현하기(네이버, 다음, 인스타그램, 구글 등)
파이썬 언어로 크롤링시, 셀레늄(selenium)을 사용하여 자동 로그인 기능 및 웹사이트 열고 특정 키워드를 검색하는 방법에 대해 알아봅니다.
셀레늄을 사용하는 이유
1. request를 사용할 경우 페이지가 로드 되기도 전에 종료될 수 있기 때문입니다.
2. reuest의 지연이 발생할 경우 실패하는 경우가 있습니다.
3. request 작업 시간이 오래 걸리는 작업은 셀레니움(selenium)을 사용합니다.
셀레니움(selenium)은 웹 브라우저 동작을 자동화 할 수 있기 때문에 웹크롤링을 할 때 BeautifulSoup모듈과 함께 자주 사용됩니다.
셀레늄을 사용하기 위해 selenium 라이브러를 설치합니다.
명령프롬프트창(cmd)을 열고 pip install selenium명령어를 실행합니다.
이미 설치한 경우에는 Requirement already satisfied: selenium 설치 경로를 알려줍니다.
Microsoft Windows [Version 10.0.19042.685] (c) 2020 Microsoft Corporation. All rights reserved. C:\python\Workspace> C:\python\Workspace> C:\python\Workspace>pip install selenium Requirement already satisfied: selenium in c:\users\ilike\appdata\local\programs\python\python39\lib\site-packages (3.141.0) Requirement already satisfied: urllib3 in c:\users\ilike\appdata\local\programs\python\python39\lib\site-packages (from selenium) (1.26.2) C:\python\Workspace>
아래 파이썬 스크립트는 파이썬 공식 사이트를 열어 python이라는 키워드로 자동 검색하는 스크립트입니다.
send_keys()함수는 input태그의 value 속성의 값을 자동으로 입력해줍니다.
find_element_by_name()함수는 태그의 name 속성을 검색할 때 사용합니다.
from selenium import webdriver from selenium.webdriver.common.keys import Keys driver = webdriver.Chrome(executable_path="C:/python/chromedriver_win32/chromedriver.exe") driver.implicitly_wait(10) # seconds driver.get("http://www.python.org") elem = driver.find_element_by_name("q") elem.clear() elem.send_keys("pycon") elem.send_keys(Keys.RETURN) assert "No results found." not in driver.page_source #브라우저 닫기 #driver.close()
find_element_by_name으로 “q”를 지정한 이유를 알아야합니다.
python.org사이트에 열어보면 검색바가 존재합니다.
그리고 검색바에 안에 타이핑 할 수 있는 입력창이 존재합니다.
input 태그의 이름이 “q”로 되어 있기 때문에 find_element_by_name로 해당 태그에 접근이 가능하게 됩니다.
driver 설정시 암시적 대기 10초를 주었습니다.
WebDriver에게 즉시 사용할 수 없는 요소를 찾으려고 할 때 일정 시간 동안 DOM을 폴링하도록 지시합니다.
이렇게 설정하게 되면 WebDriver 개체의 수명 동안 암시적 대기가 설정됩니다.
폴링(polling)이란
하나의 장치(또는 프로그램)가 충돌 회피 또는 동기화 처리 등을 목적으로 다른 장치(또는 프로그램)의 상태를 주기적으로 검사하여 일정한 조건을 만족할 때 송수신 등의 자료처리를 하는 방식을 말한다 (위키백과의 폴링 정의)
파이썬으로 다음(Daum) 사이트 자동 검색 기능 구현
아래 코드니스펫은 다음 사이트를 자동으로 열고 검색 키워드를 “파이썬”으로 입력하고 실행해보는 예제입니다.
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys driver = webdriver.Chrome(executable_path="C:/python/chromedriver_win32/chromedriver.exe") driver.get("https://www.daum.net/") search_box = driver.find_element(By.NAME, "q") search_box.send_keys("파이썬") search_box.send_keys(Keys.RETURN)
다음 사이트 역시 input태그의 name 속성의 값이 “q”입니다.
개발자가 동일한 사람도 아닐텐데 3개의 사이트의 검색창 input태그의 name 속성의 값이 일치하네요.
구글(google) 자동 검색 기능 구현하기(매크로)
다음은 구글 웹사이트를 자동으로 열고 검색 키워드를 입력하고 찾는 스크립트를 만들어보는 예제입니다.
find_element_by_name와 find_element는 사용 방법의 차이입니다.
find_element를 사용하면 훨씬 가독성이 좋다고 생각됩니다.
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys driver = webdriver.Chrome(executable_path="C:/python/chromedriver_win32/chromedriver.exe") driver.get("http://www.google.com") search_box = driver.find_element(By.NAME, "q") search_box.send_keys("파이썬") search_box.send_keys(Keys.RETURN)
구글사이트 역시 input태그의 name 속성값이 “q”입니다.
파이썬으로 인스타그램 자동 로그인 처리 및 키워드 검색
인스타그램(instagram)에서 검색을 하기 위해서는 로그인이 먼저 필요합니다.
로그인 계정과 비밀번호를 입력하는 input태그에 접근을 하기위해 input태그의 name 속성이나 id 속성값을 찾습니다.
로그인 후 검색창의 input 태그의 name속성 값을 찾아봅니다.
하지만 인스타그램의 경우 name 속성이나 id 속성값은 사용하지 않고 있으며, class태그 속성을 사용합니다.
그럼으로 우리는 클래스 속성(By.CLASS_NAME)으로 접근해야합니다.
다음은 인스타그램을 자동 로그인 처리 후 검색키워드를 검색하는 파이썬 스크립트입니다.
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys driver = webdriver.Chrome(executable_path="C:/python/chromedriver_win32/chromedriver.exe") driver.get("https://www.instagram.com/") loginid = driver.find_element(By.NAME, "username") password = driver.find_element(By.NAME, "password") loginid.send_keys("본인의 인스타그램 로그인계정") password.send_keys("비밀번호") password.send_keys(Keys.RETURN) driver.implicitly_wait(10) # seconds search_box = driver.find_element(By.CLASS_NAME, "XTCLo") search_box.send_keys("남산타워") search_box.send_keys(Keys.RETURN)
코드를 실행하였으나 여러개의 태그가 존재한 나머지 선택창이 나타납니다.
남산타워를 선택하고 들어간 후 URL 주소를 확인해보니 아래와 같습니다.
www.instagram.com/explore/tags/남산타워/
개인이 만든 태그인 경우 태그(tag)주소로 찾게 되어 있으며, 위치 기준인 경우 locations 기준으로 검색됨을 확인하였습니다.
www.instagram.com/explore/locations/587456739/
아래 파이썬스크립트는 검색기준을 태그 기준으로 변경하여 검색하는 예제입니다.
from selenium import webdriver driver = webdriver.Chrome(executable_path="C:/python/chromedriver_win32/chromedriver.exe") search_param ="남산타워" url = f'https://www.instagram.com/explore/tags/{search_param}' driver.get(url)
파이썬으로 페이스북(facebook) 자동 로그인 처리 및 검색기능 구현하기
페이스북 역시 인스타그램과 동일한 방법으로 처리합니다.
아이디와 비빌번호 입력하기위한 input태그를 먼저 찾습니다.
로그인버튼을 클릭하여 실행해보고 싶다면 로그인 버튼의 name속성을 찾아서 클릭이벤트를 처리해줍니다.
아래 스크립트를 참고하세요. send_keys(Keys.RETURN)을 사용하여 로그인처리를 해도 됩니다.
로그인 버튼을 찾았으니, click()함수를 호출하여 처리합니다.
로그인 후 검색URL로 변경 후 검색하고자 하는 키워드로 검색을 시도합니다.
from selenium import webdriver from selenium.webdriver.common.by import By driver = webdriver.Chrome(executable_path="C:/python/chromedriver_win32/chromedriver.exe") driver.get("https://www.facebook.com/") loginid = driver.find_element(By.NAME, "email") password = driver.find_element(By.NAME, "pass") loginid.send_keys("본인의 페이스북 로그인계정") password.send_keys("비밀번호") #password.send_keys(Keys.RETURN) loginbutton = driver.find_element(By.NAME, "login").click() driver.implicitly_wait(20) # seconds driver.get("https://www.facebook.com/search/top?q=남산타워")
존재하지않는 요소의 값을 찾을 경우 NoSuchElementException: Message: no such element 오류가 발생됩니다.
C:\Users\ilike\AppData\Local\Programs\Python\Python39\python.exe C:/python/Workspace/main.py Traceback (most recent call last): File "C:\python\Workspace\main.py", line 31, in <module> search_box = driver.find_element(By.NAME, "query") File "C:\Users\ilike\AppData\Local\Programs\Python\Python39\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 976, in find_element return self.execute(Command.FIND_ELEMENT, { File "C:\Users\ilike\AppData\Local\Programs\Python\Python39\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute self.error_handler.check_response(response) File "C:\Users\ilike\AppData\Local\Programs\Python\Python39\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response raise exception_class(message, screen, stacktrace) selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":"[name="query"]"} (Session info: chrome=87.0.4280.88)
사이트의 개편이 발생하면 input 태그의 name 속성값이 변경되거나 삭제될 수 있어요.
그렇기 때문에 어느날 제대로 실행되던 파이썬 스크립트에서 오류가 발생한다면 크롬 개발자도구를 사용하여 확인하셔야합니다.
파이썬으로 네이버(naver) 사이트 자동 검색 기능 구현하기
마지막으로 네이버 사이트를 자동으로 열고 검색 키워드를 “파이썬”으로 입력하고 실행해봅니다.
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys driver = webdriver.Chrome(executable_path="C:/python/chromedriver_win32/chromedriver.exe") driver.get("http://www.naver.com") search_box = driver.find_element(By.NAME, "query") search_box.send_keys("파이썬") search_box.send_keys(Keys.RETURN)
네이버 사이트의 경우 input태그의 name 속성값은 “query”입니다.
참고로, webdriver로 크롬 브라우저를 호출하기위해서는 chromdriver가 필요합니다.
크롬 드라이버 설치방법 다음에 있는 selenium WebDriverExcepiton 오류 해결방법을 참고하세요..
selenium WebDriverException오류 해결 방법
selenium.common.exceptions.WebDriverException: Message: ‘chromedriver’ executable needs to be in PATH
C:\Users\ilike\AppData\Local\Programs\Python\Python39\python.exe C:/python/Workspace/main.py Traceback (most recent call last): File "C:\Users\ilike\AppData\Local\Programs\Python\Python39\lib\site-packages\selenium\webdriver\common\service.py", line 72, in start self.process = subprocess.Popen(cmd, env=self.env, File "C:\Users\ilike\AppData\Local\Programs\Python\Python39\lib\subprocess.py", line 947, in __init__ self._execute_child(args, executable, preexec_fn, close_fds, File "C:\Users\ilike\AppData\Local\Programs\Python\Python39\lib\subprocess.py", line 1416, in _execute_child hp, ht, pid, tid = _winapi.CreateProcess(executable, args, FileNotFoundError: [WinError 2] 지정된 파일을 찾을 수 없습니다 During handling of the above exception, another exception occurred: Traceback (most recent call last): File "C:\python\Workspace\main.py", line 4, in <module> driver = webdriver.Chrome() File "C:\Users\ilike\AppData\Local\Programs\Python\Python39\lib\site-packages\selenium\webdriver\chrome\webdriver.py", line 73, in __init__ self.service.start() File "C:\Users\ilike\AppData\Local\Programs\Python\Python39\lib\site-packages\selenium\webdriver\common\service.py", line 81, in start raise WebDriverException( selenium.common.exceptions.WebDriverException: Message: 'chromedriver' executable needs to be in PATH. Please see https://sites.google.com/a/chromium.org/chromedriver/home Process finished with exit code 1
오류 해결을 위해 크롬드라이버 설치가 필요합니다.
webdriver.Chomre()호출시 절대경로를 지정합니다.
driver = webdriver.Chrome(executable_path='C:/python/chromedriver_win32/chromedriver.exe')
아래 경로에서 PC에 설치된 크롬브라우저의 버전을 확인후 버전에 맞는 chromdriver를 다운받아주세요.
sites.google.com/a/chromium.org/chromedriver/downloads
리눅스용(linux64), 윈도우용(win32), 맥용(mac64) chromdriver를 다운받을 수 있습니다.
다운받은 파일(chromdriver_win32.zip)을 압축을 푼 후 본인이 원하는 경로에 복사합니다.
그리고 executable_path에 절대경로를 지정합니다.
from selenium import webdriver from selenium.webdriver.common.by import By #For Windows #driver = webdriver.Chrome(r"C:\Users\USER_NAME\Desktop\FOLDER\chromedriver") driver = webdriver.Chrome(executable_path="C:/python/chromedriver_win32/chromedriver.exe") driver.get("https://google.com") # Get element with tag name 'div' element = driver.find_element(By.TAG_NAME, 'div') # Get all the elements available with tag name 'p' elements = element.find_elements(By.TAG_NAME, 'p') for e in elements: print(e.text) driver.quit()
위 방법은 일시적인 방법입니다. 왜냐하면 크롬브라우저가 자동업데이트 될 때 마다 변경해줘야하는 불편함이 발생합니다.
다음 방법으로 자동화 하세요.
명령프롬프트에서 pip install webdriver manager 명령어를 실행하면 webdriver가 설치됩니다.
그런 다음 ChromDriverManager().install()를 사용하여 절대경로를 지정하지 않아도 해결이 가능합니다.
Microsoft Windows [Version 10.0.19042.685] (c) 2020 Microsoft Corporation. All rights reserved. C:\Users\ilike>pip install webdriver-manager Collecting webdriver-manager Downloading webdriver_manager-3.2.2-py2.py3-none-any.whl (16 kB) Requirement already satisfied: requests in c:\users\ilike\appdata\local\programs\python\python39\lib\site-packages (from webdriver-manager) (2.25.0) Collecting configparser Downloading configparser-5.0.1-py3-none-any.whl (22 kB) Collecting crayons Downloading crayons-0.4.0-py2.py3-none-any.whl (4.6 kB) Requirement already satisfied: colorama in c:\users\ilike\appdata\roaming\python\python39\site-packages (from crayons->webdriver-manager) (0.4.4) Requirement already satisfied: chardet<4,>=3.0.2 in c:\users\ilike\appdata\local\programs\python\python39\lib\site-packages (from requests->webdriver-manager) (3.0.4) Requirement already satisfied: urllib3<1.27,>=1.21.1 in c:\users\ilike\appdata\local\programs\python\python39\lib\site-packages (from requests->webdriver-manager) (1.26.2) Requirement already satisfied: idna<3,>=2.5 in c:\users\ilike\appdata\local\programs\python\python39\lib\site-packages (from requests->webdriver-manager) (2.10) Requirement already satisfied: certifi>=2017.4.17 in c:\users\ilike\appdata\local\programs\python\python39\lib\site-packages (from requests->webdriver-manager) (2020.12.5) Installing collected packages: crayons, configparser, webdriver-manager Successfully installed configparser-5.0.1 crayons-0.4.0 webdriver-manager-3.2.2 C:\Users\ilike>
자동화 처리한 파이썬 스크립트(Python script)는 다음과 같습니다.
from selenium import webdriver from webdriver_manager.chrome import ChromeDriverManager driver = webdriver.Chrome(ChromeDriverManager().install())
[REFERENCE]
selenium-python.readthedocs.io/locating-elements.html
www.selenium.dev/documentation/en/webdriver/web_element/