Note of Pediatric Surgery

腸内細菌、R、ときどき小児外科

SeleniumとPythonでスクレイピングをやるために必要な準備

はじめに

Twitterで少し前に「業務ハックしてクビにならないために」というエントリが話題になったと思います。

note.com

昔からスクレイピングというものをやってみたいとずっと思っていたのですが、このエントリでSeleniumというもの存在を知り、劇的に業務効率を改善させられる (自分がクビになるくらいのインパクトだったとのこと) と知ったので興味を持ちました。Seleniumというのは一言で言ってしまえば、自動でブラウザを操作する為のライブラリということです。Pythonからも動かせるみたいなので、Pythonの復習がてら、またこの技術を使ってやりたいことがあったので導入してみました。

Macのデフォルトをpython2系からpython3系に変更する

まずこれを一番最初にやらなきゃいけないですね。Seleniumはpipでインストールすることになるのですが、デフォルトをpython3系にしておかないと、python2系にSeleniumがインストールされてしまいます。こちらの記事を参考にしました。

qiita.com

まず自分のpythonのデフォルトがどうなっているのかを確認するにはターミナルで

python --version

を実行すれば、僕の場合はPython 2.7.10と返ってくるのでデフォルトがpython2.7になっていることがわかります。

既に上記のどれかの方法でpython3が入っている場合は、環境変数のパス、~/.bash_profile

alias python="python3"

と書き込んであげれば、pythonと打てば、python3が走ります。

とあるのですが、僕の場合、ちょっと前にクリーンインストールをした関係で~/.bash_profileがまだ作られていませんでした。

vi ~/.bash_profile

を実行するとターミナル上でVimが開くので、

alias python="python3"

と書き込んであげます。僕はVimユーザーではないのでいつも困惑してしまうのだけど、Vimで保存して終了する場合は:wqとタイプすればいいらしい。write and quitの略でwqなのだろうと思う。一応、ちゃんと書き込めているか確認する。

open ~/.bash_profile

すると別ウィンドウでopen ~/.bash_profileが開くはず、きちんと書き込めていた。Terminal上でpythonと打つと

Python 3.7.4 (default, Jul  9 2019, 18:13:23) 
[Clang 10.0.1 (clang-1001.0.46.4)] on darwin
Type "help", "copyright", "credits" or "license" for more information.

と返ってくるので、これでpython3がデフォルトになったようです。

SeleniumとChromeDriverをインストールする

Seleniumをインストールするには、

pip install selenium

でいいのだけど、実際に走らせると

Requirement already satisfied: selenium in /Library/Python/2.7/site-packages (3.141.0)

とpython2.7にインストールしました!と返ってきてしまう。この記事を参考にすると

qiita.com

macには、デフォルトでpython2がインストールされています。pip installのコマンドを実行すると、勝手にpython2の方のinstallと判断されてしまって、3の方には新しいライブラリが入りません。正しくは、バージョンを指定してインストール必要があります。

とのこと。なんてめんどくさい。デフォルトでpython3にしてくれればいいのに。pip installの前にpython3 -mをつけてあげると、python3にインストールされる様子。なので

python3 -m pip install selenium
python3 -m  pip install chromedriver-binary

こうしてあげると上手くインストールされるのではないかと思います。

Sample testを実行してみる

公式ページにsample testが載っています。

import time
from selenium import webdriver

driver = webdriver.Chrome('/path/to/chromedriver')  # Optional argument, if not specified will search path.
driver.get('http://www.google.com/');
time.sleep(5) # Let the user actually see something!
search_box = driver.find_element_by_name('q')
search_box.send_keys('ChromeDriver')
search_box.submit()
time.sleep(5) # Let the user actually see something!
driver.quit()

こんなコードになっていますが、これをこのまま実行すると、PATHが通っていないと怒られると思います。こちらの記事を参考にして

watlab-blog.com

import chromedriver_binary

の一文を加えてあげると上手く走ります。pipでChromeDriverをインストールしていない場合は、自分でPATHを通す必要があるみたいなので、検索してみてください。

import time
from selenium import webdriver
import chromedriver_binary # PATHを通す

driver = webdriver.Chrome()
driver.get('https://www.google.com/') # ページを立ち上げる
time.sleep(5) # 読み込み時間を考慮して5秒待つ
search_box = driver.find_element_by_name("q") # “q”という名前で検索ボックスがどれか認識する
search_box.send_keys('ChromeDriver') # 検索ボックスに'ChromeDriver’と打ち込む
search_box.submit() # 検索する
time.sleep(5) # 読み込み時間を考慮して5秒待つ
driver.quit() # 

これを実行するとChromeが起動され、Googleが開き、検索ボックスにChromeDriverと打ち込まれ、検索結果が表示された後にChromeが閉じます。ちょっと感動しました。