GitpodでSeleniumを動かしてみたお話
Webサイトからデータをとってきて、(要はスクレイピングして)データベースに保存をしたいとき、ログイン画面という関門が立ち塞がることがあります
普段のわたしはでログイン情報を送るURLに POSTでアクセスして〜というゴリ押しでやるのですが、ふとした気まぐれでSeleniumを使ってスクレイピングすることにしました
GitPodにiPadからアクセスしてスクレイピングする方法を書き留めておく。そんなおはなし。
(Gitpodに限らず、CUI環境でSeleniumを動かすときのメモとしても使えそう。かも)
Seleniumとは
Seleniumは、PythonでChrome(などのブラウザ)自体を操作してしまうためのライブラリ。
ブラウザを動かしているので、中身のJSの関数を発火させたりできるイケてる子。
ブラウザ自体を動かすので、当然ブラウザ自体がインストールされている必要があるなど、準備が必要なのが玉にきず。
Gitpodでやると毎回Chromeインストールしてバージョン確認して、インストールしてという3つの作業が必要。
面倒なので全部を自動で実行してくれる.yml
ファイルに書き込んでしまおうというお話
Selenium準備
Seleniumでブラウザを動かすためには以下の3つの準備が必要です
- Chrome本体
- Chromeのバージョンに対応したChrome Driver
- Seleniumを動かすコードを記述したPythonファイル
2番のChrome DriverはPythonなどからブラウザを操作するためのデバッグ用ツールらしい。
このDrivergがクセ者で、バージョンが違うと動かない。悲しい。
最新バージョンが対応しているかどうかはここで確認できるようだ。
1. Chrome本体をインストールする
CUIでChromeをインストールしよう。と書いて簡単にはいかないステップ。
Chromeはyum
やらapt
のパッケージには標準で含まれていないので、追加するステップが必要
具体的なコマンドはこれ↓
sudo sh -c 'echo "deb http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list'
sudo wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | sudo apt-key add -
sudo apt update
aptのリストにchromeの最新版を追加。そしてGoogleが公開している公開鍵をもらってきて、aptの認証で通るように設定。
こうするとaptパッケージとして使えるようになったので、あとはapt install
でインストールできる。やったね
echo 'y' | sudo apt install google-chrome-stable
インストールができたか確認するバージョン確認のコマンドはこう↓
google-chrome-stable --version
バージョンはこんなふうに取れる
Google Chrome 119.0.6045.159
2. Chrome Driverのインストール
さて、Chromeをインストールしたのでそれに合わせたDriverをインストールしなければなりません。
んなもんChromeのバージョンを指定してインストールすればいいじゃないかという声が聞こえてきます。
しかし、Googleはセキュリティのために古いバージョンのChromeはそもそもダウンロードできないようになっているようです。
非公式に配布している場所があるらしいが、非公式なので今回はその方法は取らないことにする。
Chrome Driverのインストール方法はいくつかあるのだが今回はバージョンを指定してpip
インストールできるchromedriver_binary
で取得する。
バージョンがわかってる場合はこんな感じでインストールする
pip install chromedriver_binary==<メジャーバージョン番号>.*
メジャーバージョンは、例えば 119.0.6045.105
だったら119
。要するに.
(ピリオド)で区切った1番目の値のこと。
というわけで、バージョン確認はコマンドでできる値からバージョン番号を切り取って、pipコマンドに入れてあげればいいわけです。
Google Chrome 119.0.6045.159
を半角スペースとピリオドでSplitすればいけそう
いけそうってことでshのコマンドで作ったものがこれ
chromever=(`google-chrome-stable --version`)
numver=(${chromever[2]//./ })
pip uninstall -y chromedriver_binary
pip install chromedriver_binary==${numver[0]}.*
chromever
変数にバージョン取得するコマンドの結果を代入。
.
を半角スペースに書き換えたものを配列化。
3番目の値をnumver
に代入。
そしたらあとはpip
コマンドのバージョン指定部分に変数を入れてあげれば、取得したバージョンに対応するdriverがインストールできるという寸法。
意外と単純
3. Selenumを動かすPythonファイルの記述
Seleniumのオプションでは、以下の4つを設定します
- インストールしたChromeの居場所
- CUI上なので画面表示をしないための
headless
モード - GPUが使えないので無効化
- セキュリティ関連でのクラッシュ防止に
sandbox
モードを解除
options = webdriver.ChromeOptions()
options.binary_location = '../../bin/google-chrome-stable'
options.add_argument('--headless')
options.add_argument('--disable-gpu')
options.add_argument('--no-sandbox')
この部分は、Gitpodで動かす環境作ってみたというこの記事の題意にそぐわないのでこれ以上のことは書かずに、できているものを用意しました。
わたしの記事一覧をテキトーに取得して、実際にスクレイピングできている。やったね
Selenium準備用コードをyml化する
ここまでで準備の方法をつらつらと書き留めたわけですが、これらをGitpodの環境構築用のyml
ファイルにまとめたものがこれ。
必要な部分だけを抜き取るとこんな感じ
tasks:
- name: install_chrome
before: |
sudo sh -c 'echo "deb http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list'
sudo wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | sudo apt-key add -
sudo apt update
echo 'y' | sudo apt install google-chrome-stable
chromever=(`google-chrome-stable --version`)
numver=(${chromever[2]//./ })
pip uninstall -y chromedriver_binary
pip install chromedriver_binary==${numver[0]}.*
(15行目以降のJupyter起動用はおまけでついているだけで、実際はなくても良いわけです)
Gitpodで起動するたびに、これらのコマンドが走ってChromeのインストールからDriversの準備までやってくれるという内容。
本質的にはコマンドをまとめただけなので説明することなんてない。この記事はこれでおしまい
おまけ: Gitpodのマシンの強さ
マシンの強さってなんだよていう表現的なコトは置いておいて、Gitpodでワークスペースを作るときにStandard
かLarge
か選ぶことができます。
みりゃ書いてあるのですが、Large
はStandard
の大体2倍のリソースを使えるというステキ機能。
Seleniumを動かすときは裏でブラウザが回っている関係(だと思う)でLarge
にしないとまず動かない。
そんでLarge
にすると消費するクレジットの量が多くなるわけです。
まぁわたしの場合はいつも無料分を余らせちゃっているのでもっと気軽にLarge
使っていいのかななんて思った今日この頃。
Discussion