🍄

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

2022/10/23に公開約3,800字

はじめに

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・パスワードを入力し、ログインボタンをクリックして、会員の専用サイトにページ遷移するまでを行います。

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

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

!apt-get update
!apt install chromium-chromedriver
!cp /usr/lib/chromium-browser/chromedriver /usr/bin
!pip install 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

ログインするとコメントできます