疑念は探究の動機であり、探究の唯一の目的は信念の確定である。

数学・論理学・哲学・語学のことを書きたいと思います。どんなことでも何かコメントいただけるとうれしいです。特に、勉学のことで間違いなどあったらご指摘いただけると幸いです。 よろしくお願いします。くりぃむのラジオを聴くこととパワポケ2と日向坂46が人生の唯一の楽しみです。

PythonのSeleniumでWebスクレイピングをする(Mac): 基本編

概要
PythonSeleniumはウェブ上のサイトを自動で探索する。それを利用して必要なデータを自動的に取得するプログラムをつくる。
今回はSeleniumの使用する環境構築を主として述べる。
Seleniumのテスト試験として次のようなプログラムを作成する。つまり、Googleのホームページに入って、検索欄に「ゼロからはじめるPython」を入力して、検索ボタンを押すというものである。

さらに、よく使う機能をまとめる。


ソースコード

# test.py

import time 
from selenium import webdriver

# 1) Initialize Chrome
# DRIVER_PATH is dependent on your environment.

DRIVER_PATH = '/Users/USERNAME/opt/anaconda3/lib/python3.7/site-packages/chromedriver_binary/chromedriver'
driver = webdriver.Chrome(DRIVER_PATH)

# 2) Open the Google page
driver.get('https://www.google.com')

#### Fig.1

# 3) Wait until the page
time.sleep(3) 

# 4) Get an object of the search box
q = driver.find_element_by_name('q')

# 5) Send the key to the search box
q.send_keys('ゼロからはじめるPython')

#### Fig.2

# 6) submit the form
q.submit()

# 7) Wait in 10 seconds
time.sleep(10)

#### Fig.3

# 8) Finalize the driver
driver.quit()


実行結果
(1) Googleのホームページが自動的に立ち上がる
f:id:yoheiwatanabe0606:20200930200413p:plain
Fig.1


(2) 検索欄に「ゼロからはじめるPython」が自動的に入る
f:id:yoheiwatanabe0606:20200930200418p:plain
Fig.2


(3) 自動的にクリックされて検索結果が表示される
f:id:yoheiwatanabe0606:20200930200424p:plain
Fig.3


(4) 10秒待って、終わるページが消える

はじめに

動機:
カード残高をWeb上から確認しようとするとき、いちいちログインとパスワードを入力しなければなりません。それがとてもめんどくさいので「ターミナルからコマンドをワンクリックすれば、自動でログインとパスワードを入力してWeb上に入って、カード残高のデータを引っ張っていくことはできないのだろうか」と思って調べました。

そのようなWeb上のデータを取得することをスクレイピングというそうです。そのスクレイピングをおこなうためのツールがSeleniumというものです。

注意点

スクレイピングを禁止しているサイトとかがあります(例えばツイッター)。禁止しているにもかかわらず、スクレイピングをおこなうと違法行為となりますので、注意が必要です。


環境構築の方法

Seleniumを使うための準備の仕方です。参考にしてみてください。

STEP 1: Google Chromeをインストール

まずは、Google Chromeをインストールしてください。
Google Chrome をダウンロードしてインストールする - パソコン - Google Chrome ヘルプ

SeleniumChromeだけでなくSafariでもFirefoxでも対応していますので、Chromeをインストールしなくても他のブラウザからおこなうことは可能です。私は最初「Chromeなんかでするものか! Safariでやってやる!」と思って始めてみたのですが、ネット上にあるSeleniumの記事の多くはChromeですので、ここは断腸の思いでChromeをインストールしました。

STEP 2: pipでseleniumおよびchromedriver-binaryをインストール

次にseleniumモジュールとchromedriver-binaryモジュールをインポートします。

それにはいくつかの方法がありますが、pipコマンドで次のようにすると簡単です(ただしpipコマンドがあることが前提ですが。なければpipコマンドのインストールにまで戻ることになります)。

$ pip install selenium
$ pip install chromedriver-binary

chromedriver-binarypip install chromedriver-binary==NumberOfChromeVersion>でバージョン指定もできますが、そのままとりあえずはやってみて、うまくいかなったときにバージョンを指定してみてください。

STEP 3: chromedriverの場所を見つける。

Seleniumを使うときはchromedriverというものを使います。これはインストールしたchromedriver_binaryモジュール(インストールするときはハイフン(-)ですが、モジュール名ではアンダーバー(_)です)の中にあります。そこでchromedriverを使うためには、これのありか(パス)を指定しなければなりませんので、chromedriverのパスを特定します。

次のようにしておこなうとchromedriverのパスを特定することができると思います。

3.1: Finderからcommand + Fを押す(Find)

Finderからcommand + Fを押す(Find)またはFinder -> File -> Find
f:id:yoheiwatanabe0606:20200930203650p:plain
f:id:yoheiwatanabe0606:20200930203646p:plain

3.2: Searchボックスに「chromedriver」と検索する

Searchボックスに「chromedriver」と入力すると、chromedriverが表示される。
f:id:yoheiwatanabe0606:20200930203655p:plain

3.3: chromedriverをクリックして、パスを右クリックする

chromedriverをクリックすると下の方にそれのありかが示されます。
f:id:yoheiwatanabe0606:20200930203701p:plain



下のほうにあるchromedriverを右クリックすると表示されます。
f:id:yoheiwatanabe0606:20200930203705p:plain

3.4: 「Copy "chromedriver" as Pathname」をクリック

Copy "chromedriver" as Pathnameをクリックすると chromedriverのパスが得られます。


これで欲しかったパスが得られます。どこかのメモ帳にペーストして保存しておきましょう。

STEP 4: テストソースを書く

インストールが無事にできたのかどうかを確認するために、次のテストプログラムを書いて実行してみてください。ただし、DRIVER_PATHはSTEP3で取得したパスです。

# test.py

import time 
from selenium import webdriver

# 1) Initialize Chrome
# DRIVER_PATH is dependent on your environment.

DRIVER_PATH = '/Users/USERNAME/opt/anaconda3/lib/python3.7/site-packages/chromedriver_binary/chromedriver'
driver = webdriver.Chrome(DRIVER_PATH)

# 2) Open the Google page
driver.get('https://www.google.com')

#### Fig.1

# 3) Wait until the page
time.sleep(3) 

# 4) Get an object of the search box
q = driver.find_element_by_name('q')

# 5) Send the key to the search box
q.send_keys('ゼロからはじめるPython')

#### Fig.2

# 6) submit the form
q.submit()

# 7) Wait in 10 seconds
time.sleep(10)

#### Fig.3

# 8) Finalize the driver
driver.quit()

このテストプログラムは次のようなものです。つまり、まずChromeが自動的に動作して、Googleのホームページにアクセスして、検索欄に「ゼロからはじめるPython」を入力して、そのあとクリックされて検索結果のページに移ります。それでしばらくしてChromeは終了してページは消えます。

インストールがうまくいけばそのような動作をします。それは冒頭の実行結果のようになります。
これでSeleniumの環境構築ができました。

うまくいかなかった場合の対処法

テストプログラムがうまくいかなかった場合、その原因は次のようなものが考えられます。

(1) chromedriverのパスが異なる
(2) 次のように変更する。
Before: webdriver.Chrome(DRIVER_PATH)
After: webdriver.Chrome(executable_path=DRIVER_PATH)
(3) パスをDRIVER_PATH = r'/Users/USERNAME/opt/anaconda3/lib/python3.7/site-packages/chromedriver_binary/chromedriver'と書いて試してみる
(4) chromedriverのバージョンとGoogle Chromeのバージョンが異なる
バージョンが異なっている場合、次のようなエラーが生じます。

.....
.....
selenium.common.exceptions.SessionNotCreatedException: Message: session not created: This version of ChromeDriver only supports Chrome version 83

よく使うテクニック

いつかまとめる。

最後に

Seleniumができる環境ができたということで、今度はより複雑なプログラムを紹介します。



僕から以上