Selenium で Chrome を起動すると、コンテンツ側で自動制御されていることを検知できます。
そのため、reCaptcha などの「私はロボットではありません」系を突破することが困難です。
そこで、本記事では本家の Chrome から Cookie を読み込ませる方法をご紹介します。
参考
Selenium で Cookie をファイルから読込・保存する方法は、こちらを参考にしてください。
全体の流れと注意事項
以下の流れで普段使用している Chrome の Cookie を
Selenium から起動する Chrome に読み込むことができます。
step
1本家ChromeのCookieをエクスポート
step
2エクスポートしたJSONを加工
step
3加工したJSONをSeleniumで読込む
順番に詳しく説明していきます。
注意事項
この方法は、あくまで個人用途、何があっても自己責任でお願いします。
準備:本家ChromeのCookieをエクスポート
Chrome の拡張機能「EditThisCookie」を公式ページからインストールします。
インストールしたら、機能を有効化しましょう。
次に、Cookie をエクスポートしたい Web ページへ移動し、
インストールした EditThisCooke アイコンを押下します。
アイコンをクリックすると、EditThisCookie のコンテキストメニューが表示されます。
赤枠で囲った右上の「エクスポート」ボタンを押下します。
現在見ているページのドメインに適用されている Cookie がクリップボードにエクスポートされます。
メモ帳などのテキストエディタに貼りつけ、JSON ファイルとして保存すれば準備完了です。
編集:エクスポートしたJSONを加工
エクスポートした JSON ファイルをそのまま読込めれば便利なのですが、
Selenium Web Driver が解釈できないキーが含まれているため、それを削除します。
具体的には、「sameSite」のキーと値が不要となります。
各 Cookie のエントリーに入っていますので、それぞれ削除します。
cookie.json
{
cookies: [
(省略)
]
}
さいごに、Python で扱いやすいように、クリップボードにコピーされた内容全てが値となるように
キーを設けます。先頭に「{ cookies:」を追加し、末尾に「}」を追加します。
読込:加工したJSONをSeleniumで読込む
記事「SeleniumでCookieの読込と保存」で紹介したサンプルコードから、
load_cookie(driver, file_path) の関数を変更し、その引数として渡す file_path を
JSON ファイルに書き換えるだけです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
from selenium import webdriver import chromedriver_binary import json import os import pickle import time def load_cookie(driver, file_path): if os.path.isfile(file_path) != True: return with open(file_path, 'r') as fd: jobj = json.load(fd) for c in jobj.cookies: driver.add_cookie(c) def save_cookie(dirver, file_path): cookies = driver.get_cookies() with open(file_path, 'wb') as fd: pickle.dump(cookies, fd) def main(): # Chrome 起動 driver = webdriver.Chrome() # 所望の URL へ移動 driver.get('https://progzakki.sanachan.com/') time.sleep(5) # Cookie 読込、ファイルが無ければ何もしない load_cookie(driver, './cookie.json') # この待ち時間中に、何かあれば作業などを手動で行う time.sleep(30) # Cookie 保存 save_cookie(driver, './cookie.pkl') # Chrome 終了 driver.quit() if __name__ == '__main__': main() |