SeleniumとPythonでスクレイピングをやるために必要な準備
はじめに
Twitterで少し前に「業務ハックしてクビにならないために」というエントリが話題になったと思います。
昔からスクレイピングというものをやってみたいとずっと思っていたのですが、このエントリでSeleniumというもの存在を知り、劇的に業務効率を改善させられる (自分がクビになるくらいのインパクトだったとのこと) と知ったので興味を持ちました。Seleniumというのは一言で言ってしまえば、自動でブラウザを操作する為のライブラリということです。Pythonからも動かせるみたいなので、Pythonの復習がてら、またこの技術を使ってやりたいことがあったので導入してみました。
Macのデフォルトをpython2系からpython3系に変更する
まずこれを一番最初にやらなきゃいけないですね。Seleniumはpipでインストールすることになるのですが、デフォルトをpython3系にしておかないと、python2系にSeleniumがインストールされてしまいます。こちらの記事を参考にしました。
https://qiita.com/sebeckawamura/items/4bc5945245877f250d2eqiita.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にインストールしました!と返ってきてしまう。この記事を参考にすると
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が通っていないと怒られると思います。こちらの記事を参考にして
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が閉じます。ちょっと感動しました。