Python + Selenium WebDriverを使用してCookieを保存およびロードする方法


106

PythonのSelenium WebDriverのすべてのCookieをtxtファイルに保存して、後で読み込むにはどうすればよいですか?ドキュメントでは、getCookies関数についてはほとんど何も述べられていません。

回答:


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
「pickle protocol must be <= 2」というエラーが表示されます。投稿した漬物コードを使用します。これは何を意味するのでしょうか?それは議論を指していますか?
アーロン・ヒニカー2013

これは同じことをしますか?cookieFile = open( "cookies.pkl"、 "w")dump = pickle.dumps(driver.get_cookies())cookieFile.write(dump)
Aaron Hiniker

1
こんにちはアーロン、サンプルを少し変更しました。基本的に、ファイルの開いているセクションに「b」フラグが追加されています。試していただけますか?
Ali-Akber Saifee 2013

同じエラー、私はピクルスに慣れていないので、それが何であるかわかりません。"raise ValueError(" pickle protocol be be <=%d "%HIGHEST_PROTOCOL"
Aaron Hiniker '25 / 02/25

5
これに問題があります。正常に動作しますが、もう一度試行するdrive.add_cookieと、「有効期限」キーが無効であるというエラーメッセージが表示されます。私は、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を使用します。拡張機能を手動でインストールして、すべてのセッションでそれらを使用することもできます。私が実行するSecon時間、すべての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、拡張機能のロード、アンロード、拡張機能のインストールとアンインストール、設定の変更、コードによるログインの変更を必要とせずに拡張機能を使用できる複数のフォルダーを使用できるため、プログラムのロジックを中断させる方法がないことです。 etcまた、これはコードですべてを実行するhavinよりも高速です。


4
これは、Googleログインを処理するときに私にとって最良のソリューションでした。ある時点で、開発での使用が不審なアクティビティとして報告されました。
Moshe Stauber

2
このソリューションを使用する前または後に、@ p1g1nにフラグが付けられました
Eduard Florinescu

3
申し訳ありませんが、ソリューションを使用する前にフラグが立てられました。現在はログインしたままなので、疑わしいアクティビティはありません。
Moshe Stauber

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 2018年

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
漬物は私にはうまくいきませんでした。(これは私が使用した2回目です。)そこで、最初はうまくいかなかった方法を使用しました。変更私がしなければならなかった:私が原因で文書化問題にchrome_options.add_argument(「ノーサンドボックス」)を入力する必要がありましたgithub.com/theintern/intern/issues/878と私は、ユーザデータ-dirのフルパスをしなければなりませんでした私のWindows 10環境で。
Eric Klien

認証データを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のコードを投稿していただきありがとうございます。あなたは私の日を救った!
アナトール

ありがとう!とてもシンプルで、しばらくの間私は気が狂っています。みんなの賛成票!:)
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で、Chromeのバージョンは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.