如何使用Python + Selenium WebDriver保存和加载Cookie


Answers:


179

您可以使用pickle将当前cookie保存为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
我收到“棘手协议必须为<= 2”的错误。使用您发布的泡菜代码。这是什么意思?是指论据吗?
亚伦·希尼克

这会做同样的事情吗?cookieFile = open(“ cookies.pkl”,“ w”)dump = pickle.dumps(driver.get_cookies())cookieFile.write(dump)
Aaron Hiniker 2013年

1
嗨,亚伦,我对示例进行了一些修改-基本上将'b'标志添加到了文件打开部分。你可以尝试一下吗?
Ali-Akber Saifee

同样的错误,我对泡菜不熟悉,所以不确定是什么。“ raise ValueError(” pickle协议必须为<=%d“%HIGHEST_PROTOCOL”
Aaron Hiniker 2013年

5
我对此有疑问。它工作正常,但是当我drive.add_cookie再次尝试输入t时,我收到一条错误消息,提示“ expiry”键无效。我在Mac OS上使用chromedriver
Solal,

55

当您需要从一个会话到另一个会话的cookie时,还有另一种方法可以使用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时都需要我现在需要的cookie。您还可以手动安装扩展,并在每个会话中使用它们。在我运行的第二个时间里,所有的cookie都在那里:

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. 

好处是您可以使用具有不同设置和Cookie的多个文件夹,无需加载,卸载Cookie,安装和卸载扩展程序,更改设置,通过代码更改登录名的扩展程序,因此无法中断程序的逻辑,等等这比通过代码完成所有操作要快。


4
这是我处理Google登录名时最好的解决方案。在某个时候,我的开发使用被标记为可疑活动。
Moshe Stauber,

2
@ p1g1n在使用此解决方案之前或之后被标记
Eduard Florinescu

3
抱歉,在使用解决方案之前已对其进行了标记。现在,我保持登录状态,因此没有可疑活动。
Moshe Stauber '19

2
chrome_options = Options()给我name 'Options' is not defined...?

4
@Dan您需要:from selenium.webdriver.chrome.options import Options
Eduard Florinescu

32

请记住,您只能为当前域添加cookie。如果您想为您的Google帐户添加Cookie,请执行

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

1
这应该在他们的文档中:(
Tjorriemorrie


3
@MauricioCortazar它没有提及域要求,这就是我所指的
Tjorriemorrie

2
@Tjorriemorrie是基本人,cookie仅存储在域中,甚至不允许子域
Mauricio Cortazar

1
对于使用来自根域的cookie的多个域,此注释似乎很相关。例如,google.com可以是根域,而Google拥有的另一个域或子域可以使用相同的cookie。由于这个原因(以及其他原因),我更喜欢@Eduard Florinescu的解决方案,因为它不需要在加载cookie之前使用browser.get,它们已经在数据目录中了。似乎在加载cookie文件之前(根据此评论),这里需要附加的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
泡菜的东西对我不起作用。(这是我第二次尝试使用它。)因此,我使用了您的方法,但这种方法最初对我也不起作用。我必须进行的更改:由于github.com/theintern/intern/issues/878中记录的问题,我必须键入chrome_options.add_argument('no-sandbox'),并且必须使user-data-dir成为完整路径在我的Windows 10环境中。
埃里克·克莱恩

无法在我的将身份验证数据存储在Cookie中的网站上工作
Wildhammer,

12

@Roel Van de Paar编写的代码仅作了少许修改,所有功劳都归功于他。我在Windows中使用它,并且在设置和添加Cookie方面都运行良好:

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

谢谢!如此简单,并且一直让我发疯了一段时间。为大家投票!:)
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

我的操作系统是Windows 10,Chrome版本是75.0.3770.100。我已经尝试过'user-data-dir'解决方案,但是没有用。尝试@ Eric Klien的解决方案也失败。最后,我将chrome设置设置为图片,它可以工作!但是在Windows Server 2012上却不起作用。

设置

在此处输入图片说明


4
png的语言似乎不像英语那样熟悉。请确保您仅以英文发布。
amonk
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.