ろきメモ【ROKI MEMO】- ろきsanの備忘録 -

ろきさんの備忘録。プログラミング学習記録や開発記録、および学んだ知識等のアウトプットとシェアを目的に書いています。たまに普通のことも書きます。

【Python seleniumを使ったWebスクレイピング】モジュールとドライバのインストール方法。JavaScript部分のソースはこれで取得する

スポンサーリンク

Pythonを使ったWebスクレイピングの話。


requestsとBeautifulSoupというモジュールを使ったスクレイピングでは、こんな感じでサクッとHTMLを取得する。

import requests
from bs4 import BeautifulSoup

url = "https://www.hogehoge/" # URL
r = requests.get(url)
soup = BeautifulSoup(r.text, "html.parser")
elements = soup.find_all('div', class_='area')


しかし、HTMLのソースが以下のように、JavaScriptなどを実行した結果が埋め込まれるようにしていると、うまく取得できない。

<div class="area">{{:text}}</div>  <!-- この{:text}の結果がほしい -->


こういうときは、requestsの代わりに「selenium」を使う。
seleniumなら、ブラウザを使ってアクセスするため、JavaScriptなど実行されたソースが取得できる。
もちろん、その分取得に時間がかかるのだがそれはしょうがない。


この「selenium」は、Anacondaには入っておらず、かつこれをインストールするだけではだめ(ドライバが必要)だったので、その導入と使い方を記録する。


今回の内容はこんな感じ

スポンサーリンク




STEP1 : seleniumが入っていないか確認する

「いや、入っていないんでしょ?」とは言わずに、一応チェックがしてみる。
以下のコマンドでインストール済みのモジュールを確認する。

$ pip list
...
ruamel-yaml                        0.15.35
scikit-image                       0.13.1
scikit-learn                       0.19.1
scipy                              1.1.0
seaborn                            0.8.1
Send2Trash                         1.5.0
setuptools                         39.1.0
simplegeneric                      0.8.1
singledispatch                     3.4.0.3
...

はい、「selenium」ないね。

おとなしく、以下のドキュメントに沿って、導入していく。
kurozumi.github.io



STEP2 : seleniumをインストールする

以下のコマンドでインストール。

$ pip install selenium
...
Successfully installed selenium-3.141.0
You are using pip version 10.0.1, however version 19.0.3 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.

f:id:ahrk-izo:20190325193249p:plain:w500

よし、成功!
(pipのバージョンが古いからアップグレードしろって言われている気がする。。。後でやろう)



STEP3 : とりあえずブラウザ起動するかチェック(失敗します)

まずこの状態で、seleniumを使ったブラウザの起動ができるか確認してみる。
そのためのコードは以下の2行のみ

from selenium import webdriver
browser = webdriver.Chrome()

すると、次のようにエラーになる。
f:id:ahrk-izo:20190325194613p:plain:w500
※Jupyterを使った確認テスト

...
FileNotFoundError: [Errno 2] No such file or directory: 'chromedriver'; 'chromedriver'

During handling of the above exception, another exception occurred:
...

chromedriverがない」「例外発生しているぞ」みたいな感じになっている。

ということで、やっぱりおとなしくドライバを取得する。



STEP4 : Homebrewでchromedriverを取得

chromedriverを取得していく。

ちなみに、上記のコードのこの部分

browser = webdriver.Chrome()

というように、Chromeを使うようにしているので、chromedriverが必要なわけであって、Firefoxなど他のブラウザではそれようのドライバです。あしからず。

他のブラウザを希望の場合はドキュメントを確認してください。
また、Windowsも取得方法や使い方が若干ことなるのでそちらも合わせでご確認ください。
1. インストール — Selenium Python Bindings 2 ドキュメント



さて、MacではこのドライバをHomebrewで取得していく。

まず、Homebrewをアップデートしておく。

$ brew update

※Homebrewのインストールについて記事も書いているので、未取得の方はこちらをどうぞ
blog.rokisan.com


chromedriverは、以下のコマンドで取得する(失敗します)

$ brew install chromedriver
Error: No available formula with the name "chromedriver"
It was migrated from homebrew/core to homebrew/cask.
You can access it again by running:
  brew tap homebrew/cask
And then you can install it by running:
  brew cask install chromedriver

f:id:ahrk-izo:20190326183633p:plain:w400

おっと!エラーになった!

でも慌てない。
エラー文を読んで見ればちゃんとわかる!
英語が苦手なら(ぼくも)、Google翻訳にコピペしてもなんとなくわかる。


どうやら、「homebrew/cask」ってところに移行されたようだ。
で、以下の2つのコマンドを実行すればよさそう

$ brew tap homebrew/cask
(これでアクセスして)
$ brew cask install chromedriver
(これでインストールする)


では改めてやってみる。

f:id:ahrk-izo:20190326184426p:plain:w500
アクセスOK!

f:id:ahrk-izo:20190326184520p:plain:w500
取得OK!
(途中パスワード聞かれるが、これはPCのパスワードを入力してreturnでOK)


よく見ると、/usr/local/bin にリンク(エイリアス)入ったんだなということがわかる。
念の為確認しとく。

$ ls /usr/local/bin

f:id:ahrk-izo:20190326185204p:plain:w500
OK。いた。


STEP5 : 再度ブラウザ起動するかチェックする(今度は成功)

STEP3と同様のコードで起動確認する。

from selenium import webdriver
browser = webdriver.Chrome()

f:id:ahrk-izo:20190326185554p:plain:w400
※Jupyterでは実行するとき、「control + return」または「shift + return」

f:id:ahrk-izo:20190326185820p:plain:w400
よし。成功!
URLは指定していないので、ブラウザの中身は空の状態。


最後に、URLを指定してページにアクセスできるか確認してみる。

スポンサーリンク



STEP6 : URLを指定してアクセスしてみる

Googleさんのページ(https://www.google.co.jp/)にアクセスしてみましょ。

from selenium import webdriver
browser = webdriver.Chrome()
browser.get('https://www.google.co.jp/')
browser.quit()

f:id:ahrk-izo:20190326190758p:plain:w400

実行すると・・・

f:id:ahrk-izo:20190326190720p:plain:w400
はい。OK!


最後に、このコードでブラウザを終了させることを忘れないように!
ゾンビプロセスが残っちゃうので。Jupyterじゃなくても。

browser.quit()

f:id:ahrk-izo:20190326190918p:plain:w400


おまけ : ブラウザ表示しないで使用する(Headless Chrome)

seleniumとドライバを使って、ブラウザ経由でソースを取得するけど、ブラウザは表示させない方法もあるので、その書き方も記述する。
(「Headless Chrome」っていうらしい)

以下のコードでOK

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
options = Options()
options.add_argument('--headless')
browser = webdriver.Chrome(options=options)
browser.get('https://www.google.co.jp/')
# 
# Webスクレイピングの処理
# 
browser.quit()

ブラウザが表示されなかったけど、これでもちゃんとソースが取得できて、Webスクレイピングできた。
便利だね!



実際のスクレイピングのやり方はドキュメントを見たり、いっぱい記事があるので、いろいろやってみましょう!



以上。