【Python/Selenium/pickle】add_cookieで「invalid cookie domain」エラーが出たときの対処方法
Contents
課題
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);
ディスカッション
コメント一覧
まだ、コメントがありません