- 0
- 이니스프리
- 조회 수 4935
본래 예정되었던 파이썬 반복문에 관한 강좌는 아니고, 잠깐 Selenium에 관한 글을 적겠습니다.
구글링해보면 Selenium의 세션을 Requests로 보내는 방법에 대한 웹문서는 많지만, 그 반대 경우에 대해서는 제대로 된 서술을 찾기 어려워서 적어봅니다.
물론 어디까지나 제 허접한 수준에서 우여곡절 끝에 발견한 방법이기 때문에, 보다 간명한 다른 방법이 있을 것 같습니다 ^^
굳이 Requests에서 Selenium으로 세션을 전송할 필요가 있는가 하는 생각도 드시겠지만, 요새 Selenium에서의 로그인을 특별히 신경써서 막아놓은 사이트들을 적지 않게 발견할 수 있습니다.
예컨대 Selenium에서 패스워드를 입력하는 것을 막아놓아서 우회적으로 Pyperclip 등 라이브러리를 이용하여 Ctrl+C, V를 해야 하는 경우가 있습니다.
구체적인 우회방법에 대해서는 제가 이전에 허접한 글을 올렸습니다.
참고 : https://studyforus.com/innisfree/584242
이 경우에 Headless 모드에서 구동시키거나, 우분투에서 실행하는 경우에 Ctrl+C, V가 제대로 작동하지 않을 수 있습니다.
따라서 이러한 문제를 해소하고 모든 환경에서 원활하게 로그인 처리를 하기 위하여 다음과 같은 스크립트를 작성하였습니다.
import requests from selenium import webdriver driver = webdriver.Firefox() def transfer_session(): LOGIN_INFO = { 'id': user_id, 'password': user_pw } s.get('URL') s.post('URL/login_check.php', data=LOGIN_INFO) driver.get('URL') # 여기에 이 부분이 들어가지 않으면 에러가 발생합니다. for c in s.cookies: driver.add_cookie({'name': c.name, 'value': c.value, 'path': c.path, 'expiry': c.expires}) driver.refresh() return
간략히 알고리즘을 설명드리면, 우선 Requests로 로그인을 진행한 후에 Selenium 창을 띄운 상태에서 add_cookie를 하고나서 driver.refresh()를 해주는 방식입니다.
(i) Selenium을 미리 띄워놓지 않은 상태에서 쿠키를 보내고 창을 열려고 하거나, (ii) driver.refresh()를 하지 않는 경우에는 "Document is cookie-averse."라는 에러가 발생할 수 있습니다.
결론적으로 주석을 달아놓은 부분을 쿠키를 넘기기 전에 넣어주는 것이 핵심이라고 하겠습니다.
꼭 .refresh()가 아니더라도 Selenium을 미리 띄워놓아야 한다는 의미에서 드리는 말씀이에요.
스포어의 고수님들께서 더 간단한 방법을 알고 계시다면 조언 부탁드리겠습니다 ^^
그럼 즐거운 주말 되세요!