【Python/Selenium/pickle】add_cookieで「invalid cookie domain」エラーが出たときの対処方法

2021年9月28日

課題

Seleniumでスクレイピングしている際、インターネットで検索すると、pickleでCookieを保存して、単純にadd_cookieで復元するようなコードが見つかる。

#Cookie保存
driver.get('https://example.com')
print("操作が完了したら、何か入力してください。")
input() #この間にブラウザを操作してログインとかする。
pickle.dump(driver.get_cookies() , open("cookies.pkl","wb"))

#Cookie 復元
driver.get('https://example.com')

cookies = pickle.load(open("cookies.pkl", "rb"))
for cookie in cookies:
    driver.add_cookie(cookie); #ここでinvalid cookie domain

しかし、2021/9/24現在、このコードを使用しても、「selenium.common.exceptions.InvalidCookieDomainException: Message: invalid cookie domain」が現れる場合がある。

解決できたので、ここに記する。

エラーになる理由

Chromeのバージョンアップに伴い、ドメインが別のサイトのCookieを、他のサイトにadd_cookieすることはできなくなっている。

保存前の操作で、別のドメインのサイトを開いてしまうと、pickleで保存した「cookies.pkl」に別のドメインのCookieが含まれてしまう可能性が高い。

cookies.pklの中身は、pythonコマンドで以下のように参照できる。

python -m pickle cookies.pkl

そうすると、辞書が含まれるリストが以下のように出力される。

[{'domain': 'us05web.example.com',
'expiry': 1640152162,
'httpOnly': False,
'name': 'NPS_0487a3ac_last_seen',
'path': '/',
'sameSite': 'Lax',
'secure': True,
'value': '1632376162405'},
{'domain': '.example.com',
'httpOnly': False,
'name': '_zm_date_format',
'path': '/',
'secure': True,
'value': 'yy/mm/dd'},

~以下省略~

ここで、エラーとなっていれば、リスト中に、"domain"に目的のドメインじゃないものがあるはず。

解決

ここまで分かれば、あとは簡単。add_cookieしているループに条件分として、目的のドメイン以外をはじくよう「if cookie[“domain"] == “.example.com":」を追加してあげる。

#Cookie 復元 修正版
driver.get('https://example.com')

cookies = pickle.load(open("cookies.pkl", "rb"))
for cookie in cookies:
    if cookie["domain"] == ".example.com": 
         driver.add_cookie(cookie);