目的
ログインページ等POSTが必要なWebスクレイピングのコードを書くのは面倒です。その煩わしさを解消するために、seleniumを使いました。seleniumを通じてブラウザを自動実行し、POSTが必要な操作も自動化し、Webスクレイピングを行います。
環境
OS: Ubuntu16.04(さくらVPS)
Step1) Chromeをコマンドラインでインストールする
mkdir download
cd download
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
sudo dpkg -i google-chrome-stable_current_amd64.deb
rm google-chrome-stable_amd64.deb
(参考URL) http://bit.ly/2bBK3Ku
Step2) Google Chromeの起動準備
コマンドラインではgoogle-chromeとコマンドを打つことで、起動できますが、この状態で起動をすると2つの問題が発生しました。
その2つは、
1)依存関係が壊れていること。
2)(当然ですが)画面が無いこと。
です。対処した内容を以下に示します。
CLIではgoogle-chromeとコマンドを打つことで、起動できますが、この状態で起動をすると2つの問題が発生しました。
その2つは、
1)依存関係が壊れていること。
2)(当然ですが)画面が無いこと。
です。対処した内容を以下に示します。
問題1) 依存関係の修復
以下のコマンドで対応しました。
sudo apt-get update
sudo apt-get -f install
問題2)画面がない
((案1)) GUIデスクトップ
以下のコマンドでGUIデスクトップをインストールすることができますが、時間が長くかかりそうなので途中で止めました。
sudo apt-get -y install ubuntu-desktop
((案2))仮想ディスプレイをインストール
仮想ディスプレイをインストールして、仮想ディスプレイ上でChromeを動かします。
手順としては、
ーーーーーー
①仮想ディスプレイのxvfbをインストールする
②pythonからChromeを操作するために、seleniumとpyvirtualdisplayをインストールする
③pythonでChromeの起動プログラムを書く
ーーーーーー
です。
具体的な作業手順は、Step3に記載します。
Step3) Google Chromeの起動
##手順①)xvfbのインストール
以下のコマンドで仮想ディスプレイのxvfbをインストールしました。
sudo apt-get install xvfb
sudo apt-get install unzip
wget -N http://chromedriver.storage.googleapis.com/2.20/chromedriver_linux64.zip
unzip chromedriver_linux64.zip
chmod +x chromedriver
sudo mv -f chromedriver/usr/local/share/chromedriver
sudo ln -s /usr/local/share/chromedriver /usr/local/bin/chromedriver
sudo ln -s /usr/local/share/chromedriver /usr/bin/chromedriver
##手順②)selenium等のインストール
python経由でChromeを操作するために、Chromeを操作するためのseleniumパッケージと仮想ディスプレイxvfbを操作するためのpyvirtualdisplayをインストールします。
Seleniumとは、WEBアプリケーションのテストツールの1つです。人がブラウザを操作する代わりにSeleniumがブラウザを操作をしてくれます。pyvirtualdisplayはpythonで仮想ディスプレイxvfbを操作するためのパッケージです。
以下のコードで両者をインストールしています。
(pip3をインストールしていなかったので事前にpip3をインストールしています。)
sudo apt-get install python3-setuptools
sudo easy_install3 pip
pip3 install pyvirtualdisplay selenium
##手順③)xvfbのインストール
以下のコードを実行しました。
from pyvirtualdisplay import Display
from selenium import webdriver
display = Display(visible=0, size=(800, 600))
display.start()
browser = webdriver.Chrome()
browser.get('http://www.google.co.jp')
print(browser.title)
browser.quit()
display.stop()
上記のコードで戸惑うところはあまりないと思います。
1,2行目は仮想ディスプレイとseleniumを呼び出しています。
4行目は仮想ディスプレイを定義し、5行目で起動。
6行目の webdriver.Chrome()で、仮想ディスプレイ上でChromeを起動します。
7行目で google.co.jp のソースデータを取得し、
8行目で取得したページのtitleタグ要素を出力します。
これで一通り、ChromeをCLIのみで起動させる環境が整いました。
実際にスクレイピングをするには?
実際にスクレイピングをする時は、ChromeではなくPhantomJSを利用しています。
PhantomJSはヘッドレスブラウザであるため、仮想ディスプレイも不要ですし、Javascriptで書かれているコードもスクレイピングしているので重宝しています。
PhantomJSで作業をしたい場合はこちらをご確認ください。
とはいえ、Chromeの場合は、実際にブラウザがどのような挙動をするか見ながらテストをすることができるので、Chromeを使いたいこともあるでしょう。Chromeでスクレイピングをする場合は、こちらのページにて、
browser = webdriver.PhantomJS(executable_path='')
の部分を
browser= webdriver.Chrome()
に置き換えて頂ければ動きます^^
(繰り返しですがJavascriptのコードはスクレイピングできないのでご注意ください。)