🌕

GitpodでSeleniumを動かしてみたお話

2023/11/20に公開

Webサイトからデータをとってきて、(要はスクレイピングして)データベースに保存をしたいとき、ログイン画面という関門が立ち塞がることがあります

普段のわたしはでログイン情報を送るURLに POSTでアクセスして〜というゴリ押しでやるのですが、ふとした気まぐれでSeleniumを使ってスクレイピングすることにしました

GitPodにiPadからアクセスしてスクレイピングする方法を書き留めておく。そんなおはなし。
(Gitpodに限らず、CUI環境でSeleniumを動かすときのメモとしても使えそう。かも)

Seleniumとは

Seleniumは、PythonでChrome(などのブラウザ)自体を操作してしまうためのライブラリ。
ブラウザを動かしているので、中身のJSの関数を発火させたりできるイケてる子。

ブラウザ自体を動かすので、当然ブラウザ自体がインストールされている必要があるなど、準備が必要なのが玉にきず。
Gitpodでやると毎回Chromeインストールしてバージョン確認して、インストールしてという3つの作業が必要。
面倒なので全部を自動で実行してくれる.ymlファイルに書き込んでしまおうというお話

Selenium準備

Seleniumでブラウザを動かすためには以下の3つの準備が必要です

  1. Chrome本体
  2. Chromeのバージョンに対応したChrome Driver
  3. 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つを設定します

  1. インストールしたChromeの居場所
  2. CUI上なので画面表示をしないためのheadlessモード
  3. GPUが使えないので無効化
  4. セキュリティ関連でのクラッシュ防止に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でワークスペースを作るときにStandardLargeか選ぶことができます。

みりゃ書いてあるのですが、LargeStandardの大体2倍のリソースを使えるというステキ機能。

Seleniumを動かすときは裏でブラウザが回っている関係(だと思う)でLargeにしないとまず動かない。

そんでLargeにすると消費するクレジットの量が多くなるわけです。

まぁわたしの場合はいつも無料分を余らせちゃっているのでもっと気軽にLarge使っていいのかななんて思った今日この頃。

Discussion