Python + Selenium WebDriver를 사용하여 쿠키를 저장하고로드하는 방법


106

Python의 Selenium WebDriver에있는 모든 쿠키를 txt 파일에 저장 한 다음 나중에로드하려면 어떻게해야합니까? 문서는 getCookies 함수에 대해 많은 것을 말하지 않습니다.

답변:


179

pickle을 사용하여 현재 쿠키를 python 객체로 저장할 수 있습니다. 예를 들면 :

import pickle
import selenium.webdriver 

driver = selenium.webdriver.Firefox()
driver.get("http://www.google.com")
pickle.dump( driver.get_cookies() , open("cookies.pkl","wb"))

나중에 다시 추가하려면 :

import pickle
import selenium.webdriver 

driver = selenium.webdriver.Firefox()
driver.get("http://www.google.com")
cookies = pickle.load(open("cookies.pkl", "rb"))
for cookie in cookies:
    driver.add_cookie(cookie)

1
"pickle protocol must be <= 2"오류가 발생합니다. 게시 한 피클 코드를 사용합니다. 이것은 무엇을 의미 하는가? 주장을 언급하고 있습니까?
Aaron Hiniker 2013

이것이 똑같은 일을할까요? cookieFile = open ( "cookies.pkl", "w") dump = pickle.dumps (driver.get_cookies ()) cookieFile.write (dump)
Aaron Hiniker 2013

1
안녕 Aaron, 샘플을 약간 수정했습니다. 기본적으로 파일 열기 섹션에 'b'플래그가 추가되었습니다. 당신은 그것을 시도 할 수 있습니까?
Ali-Akber Saifee 2013

같은 오류, 나는 피클에 익숙하지 않아 그것이 무엇인지 잘 모르겠습니다. "raise ValueError ("pickle protocol must be <= % d "% HIGHEST_PROTOCOL"
Aaron Hiniker 2013

5
이것에 문제가 있습니다. 잘 작동하지만 drive.add_cookie다시 시도하면 "만료"키가 유효하지 않다는 오류 메시지가 나타납니다. 저는 Mac OS에서 chromedriver를 사용하고 있습니다
Solal

55

세션에서 세션으로 쿠키가 필요할 때 다른 방법이 있습니다. 폴더를 프로필로 사용하기 위해 Chrome 옵션 user-data-dir을 사용하십시오.

chrome_options = Options()
chrome_options.add_argument("user-data-dir=selenium") 
driver = webdriver.Chrome(chrome_options=chrome_options)
driver.get("www.google.com")

여기에서 사람의 상호 작용을 확인하는 로그인을 수행 할 수 있습니다.이 작업을 수행 한 다음 모든 것이 거기에있는 폴더로 Webdriver를 시작할 때마다 필요한 쿠키를 수행합니다. 또한 확장을 수동으로 설치하고 모든 세션에서 사용할 수 있습니다. 두 번째로 실행하면 모든 쿠키가 있습니다.

chrome_options = Options()
chrome_options.add_argument("user-data-dir=selenium") 
driver = webdriver.Chrome(chrome_options=chrome_options)
driver.get("www.google.com") #Now you can see  the cookies, the settings, extensions, etc, and the logins done in the previous session are present here. 

장점은 설정과 쿠키가 다른 여러 폴더를 사용할 수 있다는 것입니다. 확장 프로그램은로드, 쿠키 언로드, 확장 설치 및 제거, 설정 변경, 코드를 통한 로그인 변경이 필요하지 않으므로 프로그램이 중단되는 논리를 가질 방법이 없습니다. etc 또한 이것은 코드로 모든 것을 수행하는 것보다 빠릅니다.


4
이것은 Google 로그인을 다룰 때 가장 좋은 솔루션이었습니다. 어느 시점에서 내 개발 사용이 의심스러운 활동으로 표시되었습니다.
Moshe Stauber

2
@ p1g1n 전이나이 솔루션을 사용 후 신고 된
에드워드 Florinescu

3
죄송합니다. 솔루션을 사용하기 전에 신고되었습니다. 이제는 로그인 상태를 유지하므로 의심스러운 활동이 없습니다.
Moshe Stauber

2
chrome_options = Options()나에게 준다 name 'Options' is not defined...?
Dan

4
@ 댄 당신이 필요합니다 :from selenium.webdriver.chrome.options import Options
Eduard Florinescu

32

현재 도메인에 대해서만 쿠키를 추가 할 수 있습니다. Google 계정에 쿠키를 추가하려면

browser.get('http://google.com')
for cookie in cookies:
    browser.add_cookie(cookie)

1
이것은 그들의 문서에 있어야합니다 :(
Tjorriemorrie


3
@MauricioCortazar 그것은 내가 언급 한 것입니다 도메인 요구 사항에 대해 아무것도 말하지 않는다
Tjorriemorrie

2
, 쿠키 만 도메인에 저장되어있는 기본적인 인간의 @Tjorriemorrie은, 심지어 하위 도메인은 허용되지 않습니다
마우 코르 타 사르를

1
이 의견은 루트 도메인의 쿠키를 사용하는 여러 도메인과 관련이있는 것으로 보입니다. 예를 들어 google.com은 루트 도메인이 될 수 있고 Google이 소유 한 다른 도메인이나 하위 도메인은 동일한 쿠키를 사용할 수 있습니다. 쿠키를로드하기 전에 browser.get을 사용할 필요가 없기 때문에 @Eduard Florinescu의 솔루션이 더 좋습니다. 쿠키를로드하기 전에 이미 데이터 디렉토리에 있습니다. 테스트하지는 않았지만 쿠키 파일을로드하기 전에 여기에 추가 browser.get이 필요한 것 같습니다.
Roel Van de Paar

12

@Eduard Florinescu의 답변을 기반으로하지만 최신 코드와 누락 된 가져 오기가 추가되었습니다.

$ cat work-auth.py 
#!/usr/bin/python3

# Setup:
# sudo apt-get install chromium-chromedriver
# sudo -H python3 -m pip install selenium

import time
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

chrome_options = Options()
chrome_options.add_argument("--user-data-dir=chrome-data")
driver = webdriver.Chrome('/usr/bin/chromedriver',options=chrome_options)
chrome_options.add_argument("user-data-dir=chrome-data") 
driver.get('https://www.somedomainthatrequireslogin.com')
time.sleep(30)  # Time to enter credentials
driver.quit()

$ cat work.py 
#!/usr/bin/python3

import time
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

chrome_options = Options()
chrome_options.add_argument("--user-data-dir=chrome-data")
driver = webdriver.Chrome('/usr/bin/chromedriver',options=chrome_options)
driver.get('https://www.somedomainthatrequireslogin.com')  # Already authenticated
time.sleep(10)
driver.quit()

3
피클 재료가 작동하지 않았습니다. (이번이 두 번째로 사용해 보았습니다.) 그래서 처음에는 저에게도 효과가 없었던 방법을 사용했습니다. 변경 내가해야했다 : 나는 때문에 문서화 문제에 chrome_options.add_argument ( '노 샌드 박스')를 입력했다 github.com/theintern/intern/issues/878 내가해야했던 사용자 데이터를-디렉토리 전체 경로 내 Windows 10 환경에서.
Eric Klien

내 웹 사이트 작동하지 않는 그 쿠키에 저장 인증 데이터
와일드 해머

12

@Roel Van de Paar가 작성한 코드를 약간 수정 한 것입니다. 나는 이것을 Windows에서 사용하고 있으며 쿠키를 설정하고 추가하는 데 완벽하게 작동합니다.

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

chrome_options = Options()
chrome_options.add_argument("--user-data-dir=chrome-data")
driver = webdriver.Chrome('chromedriver.exe',options=chrome_options)
driver.get('https://web.whatsapp.com')  # Already authenticated
time.sleep(30)

2
완벽하게 작동합니다! Windows 용 코드를 게시 해 주셔서 감사합니다! 당신은 내 하루를 구했습니다!
Anatol 2011

감사! 너무 간단하고, 한동안 나를 미치게 만들었습니다. 모두에게 찬성 투표! :)
MT

0

이것은 내가 Windows에서 사용한 코드입니다.

 for item in COOKIES.split(';'):
            name,value = item.split('=',1)
            name=name.replace(' ','').replace('\r','').replace('\n','')
            value = value.replace(' ','').replace('\r','').replace('\n','')
            cookie_dict={  
                    'name':name,
                    'value':value,
                    "domain": "",  # google chrome
                    "expires": "",
                    'path': '/',
                    'httpOnly': False,
                    'HostOnly': False,
                    'Secure': False
                    }
            self.driver_.add_cookie(cookie_dict)

-2

내 OS는 Windows 10이고 크롬 버전은 75.0.3770.100입니다. 나는 'user-data-dir'솔루션을 시도했지만 작동하지 않았습니다. @ Eric Klien의 솔루션도 실패합니다. 마지막으로 그림과 같이 크롬 설정을했는데 작동하지만 Windows Server 2012에서는 작동하지 않았습니다.

환경

여기에 이미지 설명 입력


4
png는 영어만큼 익숙하지 않은 언어로 보입니다. 반드시 영어로만 게시하십시오.
amonk
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.