🍄

GoogleColaboratoryでseleniumを使ってスクレイピングする

2022/10/23に公開
4

はじめに

GoogleColaboratory(Googleコラボ)使ってますか。
Googleコラボは、Googleアカウントさえあれば、簡単にPythonの実行環境を構築できるうえに、GPUも無料で使えて、最強のサービスだと思います。

私自身、Pythonは、Googleコラボで実行していますが、これまで、ブラウザを操作するSelenium はGoogleコラボでは「できない」と思い込んでいました
今回、GoogleコラボでもSeleniumが扱えることを知ったので、その方法について、ご紹介したいと思います。
AnacondaやVS-codeよりずっと簡単にSeleniumを扱うことができます。

Seleniumについて

Seleniumはブラウザを直接操作するライブラリーです。
Pythonではrequestsライブラリを利用して、WEBサイトからデータを取得することもできますが、JavaScriptが使われているサイトや、ログインが必要なサイトは、requestsライブラリでデータを取得することはやや難しいです。
そこで利用するのがSeleniumになります。Seleniumは、ウエブドライバーを使ってブラウザを操作することができます
つまり、Seleniumでは人間がブラウザを操作しているのと同じ動きを実現することが可能になります。ブラウザを操作して、画面を読み込んでからrequestsライブラリを使って、データを取得する流れとなります。

今回トライすること

seleniumを使って、TULLY'Sの会員サイトにログインしてみたいと思います。
CULB TULLY'Sのサイトから、Googleコラボ上で、ID・パスワードを入力し、ログインボタンをクリックして、会員の専用サイトにページ遷移するまでを行います。

ライブラリーのインストール

ウェブドライバーとしてはChromeドライバーを使います。
実行の都度、ウェブドライバーの最新版をインストールするので、バージョンを気にしなくて良いですね。

%%shell

cat > /etc/apt/sources.list.d/debian.list <<'EOF'
deb [arch=amd64 signed-by=/usr/share/keyrings/debian-buster.gpg] http://deb.debian.org/debian buster main
deb [arch=amd64 signed-by=/usr/share/keyrings/debian-buster-updates.gpg] http://deb.debian.org/debian buster-updates main
deb [arch=amd64 signed-by=/usr/share/keyrings/debian-security-buster.gpg] http://deb.debian.org/debian-security buster/updates main
EOF


apt-key adv --keyserver keyserver.ubuntu.com --recv-keys DCC9EFBF77E11517
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 648ACFD622F3D138
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 112695A0E562B32A

apt-key export 77E11517 | gpg --dearmour -o /usr/share/keyrings/debian-buster.gpg
apt-key export 22F3D138 | gpg --dearmour -o /usr/share/keyrings/debian-buster-updates.gpg
apt-key export E562B32A | gpg --dearmour -o /usr/share/keyrings/debian-security-buster.gpg


cat > /etc/apt/preferences.d/chromium.pref << 'EOF'
Package: *
Pin: release a=eoan
Pin-Priority: 500


Package: *
Pin: origin "deb.debian.org"
Pin-Priority: 300


Package: chromium*
Pin: origin "deb.debian.org"
Pin-Priority: 700
EOF

apt-get update
apt-get install chromium chromium-driver

pip install -q selenium

必要なライブラリーをインポート

from selenium import webdriver
from selenium.webdriver.common.by import By
from bs4 import BeautifulSoup
import time

ドライバーオプションの設定

Googleコラボで使用する場合、ウェブドライバーでいくつかのオプション設定をしておく必要があります。

# ブラウザをheadlessモード実行
options = webdriver.ChromeOptions()
#ヘッドレスモード(バックグラウンドで起動)で実行。コラボの場合、必須。
options.add_argument('--headless')
#サンドボックスモードの解除。これも必須。
options.add_argument('--no-sandbox')
#これも設定した方がよい。
options.add_argument('--disable-dev-shm-usage')

ウェブドライバーで指定したURLを開く

ウェブドライバーをインスタンス化します。
この際、webdriver.Chromeの引数に、optionsを指定する必要があります。
driver.get(url)で指定したURLを開きます。
うまくゲットできたか、driver.titleで確認します。

#インスタンス化
driver = webdriver.Chrome('chromedriver',options=options)
#指定したドライバーが見つかるまで待機
driver.implicitly_wait(10)

#urlの指定
url="https://club-tullys.jp/login?GID=C001"

driver.get(url)
time.sleep(3)

print("サイトのタイトル:", driver.title)

出力結果

うまくゲットできていますね。

サイトのタイトル: CLUB TULLY'S | TULLY'S COFFEE

ページソースの確認

BeautifulSoupを使って、ページのhtml構造を確認することができます。

html = driver.page_source
BeautifulSoup(html,"lxml")

ログインする

find_elementメソッドを使って、ユーザー名・パスワードを入力するための要素を取得し、send_keysメソッドを使って、ユーザー名・パスワードを入力します。
要素の取得方法はいろいろあるのですが、ここでは、一番、使いやすいBy.XPATHを使います。(後ほど説明します)
入力が終わったら、「ログイン」ボタンの要素を取得し、clickメソッドを使ってクリックします。
数秒待って、ページを確認してみましょう。

login = "xxxxxxxxx"
password = "xxxxxxxxx"

# ユーザー名入力
driver.find_element(By.XPATH,"//*[@id='contentForm']/form/table/tbody/tr[1]/td/input").send_keys(login)

# パスワード入力
driver.find_element(By.XPATH,"//*[@id='contentForm']/form/table/tbody/tr[2]/td/input").send_keys(password)

#ログインボタンクリック
btn = driver.find_element(By.XPATH,"//*[@id='contentFormBtn']")
btn.click()

time.sleep(5)
html = driver.page_source
BeautifulSoup(html,"lxml")

find_elementでの要素の取得について

find_elementでHTML要素を取得することができます。
引数に、By.** と指定することで、そのHTML要素を取得することができます。
id属性はページに一つしかないのでいいのですが、classやname属性で指定する場合は、うまくとってこれない可能性があるので注意が必要です。

引数 内容
By.ID id属性で要素を取得
By.XPATH XPathで要素を取得
By.NAME name属性で要素を取得
By.CLASS_NAME class属性で要素を取得
By.TAG_NAME タグ名で要素を取得
By.CSS_SELECTOR CSSセレクタで要素を取得

XPATHの取得方法について

XPAHTとは、XMLやHTML文書から要素や属性を指定するクエリ言語です。
Webページから要素をタグ名や属性を利用して簡単に指定できます。
取得方法は以下の通りです

  1. デベロッパーツールで、取得した要素のHTMLタグ(1行)を右クリックする
  2. コピー→Xpathをコピーを選択する

さいごに

いかがでしたでしょうか。
requestsライブラリーに比べると、動きがモッサリしていてスマートでないところもありますが、ログインが必要なサイトをスクレイピングするには、requestライブラリーより圧倒的に便利です。
利用規約に注意しながら、スクレイピングを楽しんでいきましょう。

Discussion

HAMACHIHAMACHI

はじめまして。
colabを触り始めて何から勉強したら良いかと、
色々と探し回っていたところ、
こちらの記事にたどり着き勉強させていただいております。
ありがとうございます。

早速、記事に従って、
スクレイピングのテストを行おうとしましたところ、
『ウェブドライバーで指定したURLを開く』の部分で、

『WebDriverException: Message: Service chromedriver unexpectedly exited. Status code was: -6』
というエラーでしょうか?が表示され、
サイトのタイトルが取得出来ない状況になってしまい、

更に他の記事なども読み漁っているのですが、
全く解決することができず、手詰まりの状態です。

大変恐縮ではございますが、
もし、解決する方法をご存知でしたら、
ご教授いただけますと幸いです。

何卒、宜しくお願い申し上げます。

osn_Lofiosn_Lofi

HAMACHI さん
コメントありがとうございます。
私も確認しました。
確かにエラーが出ますね。
私の場合は、Status code was:1 でした。

ちょっと調べてみますが、なにぶん、勉強中の身ですので、ご期待に添えない可能性が高いと思われます。
申し訳ございません。

どうぞ、よろしくお願いします。

HAMACHIHAMACHI

ご丁寧にありがとございます。
いまだ調査中なのですが、原因がわかっていない状況です。

もし、私が解決出来た場合には共有させていただきますので、
どうぞ宜しくお願いいたします。