【Python】Seleniumでクッキー(ログイン情報)を利用する方法

【Python】Seleniumでクッキー(ログイン情報)を利用する方法 プログラミング

「Seleniumでクッキーを読み込みたい」
「ログインした状態でスクレイピングしたい」

このような場合には、この記事の内容が参考となります。
この記事では、Seleniumによるクッキーの利用方法を解説しています。

本記事の内容

  • Seleniumによるクッキーの利用
  • EditThisCookieを使ったクッキーの保存
  • Seleniumによるクッキーの読み込み

それでは、上記に沿って解説していきます。

Seleniumによるクッキーの利用

Seleniumでは、クッキーを利用することが可能です。
そのためには、クッキーを取得する必要があります。

そもそも、Seleinumについてよくわからない場合は次の記事をご覧ください。

クッキーの取得方法には、複数の方法があります。
今回は、Chrome拡張機能を使った方法を説明します。

そのChrome拡張機能は、以下。

EditThisCookie
https://chrome.google.com/webstore/detail/editthiscookie/fngmhnnpilhplaeedifhccceomclgfbg?hl=ja

EditThisCookieを使って、ブラウザからクッキーをコピーします。
そして、コピーした情報をテキストに保存。

そのテキストから読み込んだ情報をSeleniumで利用することになります。
イメージできましたか?

実際にやってみるとすぐに理解できます。
まずは、EditThisCookieを使ってクッキーを保存してみましょう。

EditThisCookieを使ったクッキーの保存

EditThisCookieのインストールは、他のChrome拡張機能を同じです。

EditThisCookieをインストールできたら、次のページへアクセスします。

World Wide Web Consortium (W3C)
https://www.w3.org/

このページ(サイト)を選んだ理由は、クッキーがシンプルだからです。
ページにアクセスしたら、クッキーを確認します。

Chrome DevTools(デベロッパーツール、開発者ツール)から、確認できます。
この値をEditThisCookieで取得しようということです。

EditThisCookieを起動しましょう。

これは、「拡張機能」アイコンをクリックした状態です。
ここで「EditThisCookie」を選択。

EditThisCookieが、起動しました。
初期状態では、「_pk_ses.447.fbaa」を選択しているようです。

有効期限が、日本時間に変換されています。
これは、何気に嬉しいです。

もう一方の「_pk_id.447.fbaa」も確認しておきましょう。

両方の値ともに、Chrome DevToolsで確認した値と同じですね。
これをまとめて取得するには、次のボタンをクリックします。

オンマウスで次のように表示されます。
クッキーのエクスポート機能ですね。

このボタンをクリックすると、次のように表示されます。

これでクリップボードに、クッキーが保存されました。
内容は、json形式となっています。

[
{
    "domain": "www.w3.org",
    "expirationDate": 1672642884,
    "hostOnly": true,
    "httpOnly": false,
    "name": "_pk_id.447.fbaa",
    "path": "/",
    "sameSite": "lax",
    "secure": false,
    "session": false,
    "storeId": "0",
    "value": "0eec6ec7740f76e7.1638687684.",
    "id": 1
},
{
    "domain": "www.w3.org",
    "expirationDate": 1638689483,
    "hostOnly": true,
    "httpOnly": false,
    "name": "_pk_ses.447.fbaa",
    "path": "/",
    "sameSite": "lax",
    "secure": false,
    "session": false,
    "storeId": "0",
    "value": "1",
    "id": 2
}
]

これをcookie.txt(名前は何でもOK)に保存します。
ここまでの処理でクッキーの保存が、完了しました。

次は、Seleniumでこのクッキーを読み込みます。

Seleniumによるクッキーの読み込み

実際のコードで確認しましょう。

import json
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome import service as fs

CHROMEDRIVER = "chromedriverのパス"

# 対象ページ
URL = "https://www.w3.org/"

# ドライバー指定でChromeブラウザを開く
chrome_service = fs.Service(executable_path=CHROMEDRIVER)

options = Options()
options.add_argument(f'service={chrome_service}')
driver = webdriver.Chrome(options=options)

# 対象ページへアクセス(1回目)
driver.get(URL)

json_open = open('cookie.txt', 'r')
cookies = json.load(json_open)

for cookie in cookies:
    tmp = {"name": cookie["name"], "value": cookie["value"]}
    driver.add_cookie(tmp)

# 対象ページへアクセス(2回目)
driver.get(URL)

このコードは、Selenium 4で動きます。
Selenium 3とSelenium 4では仕様が若干異なります。
そのあたりは、次の記事で説明しています。

コードに戻ります。
先程、クッキーを読み込み処理は次の部分です。

# 対象ページへアクセス(1回目)
driver.get(URL)

json_open = open('cookie.txt', 'r')
cookies = json.load(json_open)

for cookie in cookies:
    tmp = {"name": cookie["name"], "value": cookie["value"]}
    driver.add_cookie(tmp)

# 対象ページへアクセス(2回目)
driver.get(URL)

json形式であるため、jsonとして読み込んでいます。
nameとvalueだけを抜き出して、利用します。

add_cookieの詳細は、マニュアルをご覧ください。
それよりも、重要なことは2回アクセスすることです。

Seleniumの仕様として、クッキー追加を行う時点で対象サイトへはアクセス済みが前提となります。
1回目のアクセスを行わないと、次のエラーが発生します。

selenium.common.exceptions.InvalidCookieDomainException: Message: invalid cookie domain

そのため、2回アクセスするような処理をコーディングしています。
負荷軽減のためには、1回目はサイズの小さいページにした方がいいかもしれません。

そして、2回目はクッキーを保持してアクセスしたいページにアクセスするという感じです。

では、コードの実行結果を見てみましょう。
ブラウザが立ち上がり、対象ページにアクセスします。

Chrome DevToolsでクッキーを確認します。
(「Console」や「Application」が初期の英語表示です)

見事に、同じ値のクッキーを読み込んでいます。

以上、Seleniumによるクッキーの読み込みを説明しました。

タイトルとURLをコピーしました