本記事のゴール
- PythonのSeleniumライブラリを利用したスクレイピング環境を、ローカルPCに構築する
- Jupyter Notebook でサンプルのSeleniumコードを動かす
- "1️⃣ 通常のChromeブラウザを用意する方法" と "2️⃣ Chrome for Testing を使用する方法"の2通りを紹介
mac OS (M1) 環境で説明しますが、Linux, Windows もコマンドが少し異なる程度で基本的な手順は同じです
1. Python仮想環境を作成
詳しくは以前書いたこちらの記事を参考
ここでは説明を省略してコマンドのみ記載
1-1. venvで仮想環境を作成
- ~/.venv/ ディレクトリにPython仮想環境(trade)を作成して起動
% python -m venv ~/.venv/trade
% source ~/.venv/trade/bin/activate
1-2. Seleniumのインストール
- pipを最新バージョンにして、Seleniumライブラリをインストール
(trade) % pip install --upgrade pip
(trade) % pip install selenium
(trade) % pip --version
(trade) % pip list | grep selenium
→ pip 25.2 from /Users/watson/.venv/trade/lib/python3.13/site-packages/pip (python 3.13)
→ selenium 4.35.0
1-3. Jupyter Lab のインストール
任意ですが、Jupyter Lab を使うとセル単位で実行したり結果の確認が便利になるので導入
(trade) % pip install jupyterlab
(trade) % pip show jupyterlab
→ Version: 4.4.6
Jupyter Lab は Jupyter Notebook の進化版で、コードの折りたたみや複数のノートブックをひとつのタブで表示できるようになり便利です。
2. ブラウザ環境の準備(Chrome)
本題であるSeleniumの使用に必要なブラウザ環境を準備。
ここでは代表的なChromeを使用。
2-1. 【方法①】 通常のChromeブラウザを使用
- 通常のChromeブラウザアプリを使用していない場合はこちらからインストール
- 現在使用しているChromeのバージョンを確認
Chromeアプリのブラウザ検索欄に「 chrome://settings/help 」を入力、もしくは
Chromeアプリのメニューバーから Chrome > Google Chrome について
コマンドでも確認
% /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --version
→ Google Chrome 139.0.7258.155
ここまでできたら、方法1️⃣ による準備は完了。Seleniumのサンプルコード実行へ進む。
Selenium 4.6 以降であれば、WebDriver Manager 機能が標準搭載されているため、chromedriver を別途準備しなくても、自動的に必要なバージョンのドライバが用意されます。
2-2. 【方法②】 Chrome for Testing を使用
通常のChromeブラウザではなく、バージョン固定のChromeブラウザとドライバを以下のサイトからダウンロードして使用する方法です。
- 最新の Stable 版で、ご自身のPlatformnの chrome(ブラウザ) と chromedriver(ドライバ) をダウンロードします。
-
それぞれダウンロードしたファイルを任意の場所に保管します(Pythonコードで場所を指定して使用する形になります)
-
コマンドで実行する場合はこちら(URLとユーザー名は適切なものに変更して下さい)
☝️ chrome(ブラウザ)のダウンロード・解凍・移動
% curl -O https://storage.googleapis.com/chrome-for-testing-public/139.0.7258.138/mac-arm64/chrome-mac-arm64.zip
% unzip chrome-mac-arm64.zip
% sudo mv chrome-mac-arm64 /Users/watson/Applications/chrome-for-testing
✌️ chromedriver(ドライバ)のダウンロード・解凍・移動
% curl -O https://storage.googleapis.com/chrome-for-testing-public/139.0.7258.138/mac-arm64/chromedriver-mac-arm64.zip
% unzip chromedriver-mac-arm64.zip
% sudo mv chromedriver-mac-arm64/chromedriver ~/chromedriver
- それぞれのブラウザとドライバのバージョンを確認
☝️ chrome(ブラウザ)のバージョン
% /Users/watson/Applications/chrome-for-testing/Google\ Chrome\ for\ Testing.app/Contents/MacOS/Google\ Chrome\ for\ Testing --version
→ Google Chrome for Testing 139.0.7258.138
✌️ chromedriver(ドライバ)のバージョン
% ~/chromedriver --version
→ ChromeDriver 139.0.7258.138
メジャーバージョン(最初の.139のまで)が一致していれば基本的に互換性があります
3. Selenium の Hello World
1️⃣と2️⃣ の方法で、Pythonコードも若干違いがあります。
Jupyter Lab(もしくは Jupyter Notebook) を起動してコードを実行します(.pyファイルで実行する場合も同様のコード)
(trade) % jupyter notebook
※ Jupyter Lab で起動する場合
既存ブラウザ: jupyter lab
safari指定: jupyter lab --browser="safari"
chrome指定: jupyter lab --browser="chrome"
firefox指定: jupyter lab --browser="firefox"
Jupyter Notebook のカーネルに、作成した仮想環境が表示されない場合、以下のコマンドで登録します
% python -m ipykernel install --user --name=trade --display-name "Python (trade)"
--name → 仮想環境名
--display-name → Jupyter のメニューに表示する任意の名前
仮想環境の登録一覧を確認、削除するコマンド(trade は仮想環境名)
% jupyter kernelspec list
Available kernels:
myenv /Users/watson/Library/Jupyter/kernels/myenv
test /Users/watson/Library/Jupyter/kernels/trade
% jupyter kernelspec uninstall trade
3-1. 【方法①】 通常のChromeブラウザを使用した場合のコード
# ① 通常のChromeブラウザと WebDriver Manager 機能のドライバを使用する場合
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://www.google.com")
print(driver.title)
driver.quit()
エラーになる場合、Chromeブラウザとバージョン互換性のないドライバが、パスの通っている場所に存在している可能性があります。その場合はwhichコマンドでパスを確認して、別の場所に移動または削除します。
% which chromedriver
→ /usr/local/bin/chromedriver
% sudo mv /usr/local/bin/chromedriver ~/
または
% sudo rm -f /usr/local/bin/chromedriver
3-2. 【方法②】 Chrome for Testing を使用した場合のコード
# ② Chrome for Testing のブラウザとドライバを使用する場合
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
# Chrome オプション
options = Options()
# Chrome for Testing のブラウザのパスを指定
options.binary_location = "/Users/watson/Applications/chrome-for-testing/Google Chrome for Testing.app/Contents/MacOS/Google Chrome for Testing"
# chromedriver の絶対パスを指定( /usr/local/bin/chromedriver にある場合は設定不要 )
service = Service("/Users/watson/chromedriver")
# ブラウザ起動
driver = webdriver.Chrome(service=service, options=options)
driver.get("https://www.google.com")
print(driver.title)
driver.quit()
成功すると、ブラウザが立ち上がり、実行結果には設定したリンクのページタイトル(Google)が出力されます。
4. ボット検知対策
- オプションなどを追加することでボット検知対策が可能
# ボット検知対策(通常のChromeブラウザを使用)
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import time
# Chromeのオプション設定
options = Options()
options.add_argument("--lang=ja-JP") # 言語設定を日本語
options.add_argument("--disable-blink-features=AutomationControlled") # webdriver検知対策
options.add_argument("--disable-infobars") # "Chrome is being controlled" を非表示
options.add_argument("--disable-extensions") # 拡張機能を無効化
options.add_argument("--incognito") # シークレットモード
options.add_argument("--start-maximized") # 最大化で起動
options.add_argument("user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) " # User-Agent
"AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36")
driver = webdriver.Chrome(options=options)
driver.execute_cdp_cmd(
"Page.addScriptToEvaluateOnNewDocument",
{"source": """
// webdriverフラグ無効化
Object.defineProperty(navigator, 'webdriver', {get: () => undefined});
// 言語偽装
Object.defineProperty(navigator, 'languages', {get: () => ['ja-JP','ja']});
// プラグイン偽装
Object.defineProperty(navigator, 'plugins', {get: () => [
{name: 'PDF Viewer', filename: 'internal-pdf-viewer', description: 'Portable Document Format'},
{name: 'Chrome PDF Viewer', filename: 'internal-pdf-viewer', description: 'Portable Document Format'},
{name: 'Chromium PDF Viewer', filename: 'internal-pdf-viewer', description: 'Portable Document Format'},
{name: 'Microsoft Edge PDF Viewer', filename: 'internal-pdf-viewer', description: 'Portable Document Format'},
{name: 'WebKit built-in PDF', filename: 'internal-pdf-viewer', description: 'Portable Document Format'}
]});
"""}
)
driver.get("https://httpbin.org/headers")
# 5秒待つ(ページが動的に描画されるのを待つ)
time.sleep(5)
# ページタイトルを表示
print("ページタイトル:", driver.title)
# ブラウザを終了
driver.quit()
- ブラウザ情報を確認するには、Chromeの開発者ツールを開いて Console に以下を実行
// User-Agent
console.log(navigator.userAgent);
// 他の指紋情報(ボット検知に使われる可能性があるもの)
console.log(navigator.language);
console.log(navigator.languages);
console.log(navigator.platform);
console.log(navigator.hardwareConcurrency); // CPUスレッド数
console.log(navigator.deviceMemory); // RAM (対応ブラウザのみ)
console.log(navigator.webdriver); // botかどうか検知されやすい
// プラグイン設定
navigator.plugins
- 以下のサイトにアクセスしてもいくつかブラウザ情報を確認できる
https://httpbin.org/headers