GUIありのWebスクレイピングというのは、バックグラウンドではなく実際にGUIでブラウザが立ち上がって、まるでゴーストが勝手にボタンを押しているかのように自動でWeb画面が遷移していくという手法のことを指します。
オンプレミスLinuxサーバーであれば環境の構築はそこまで大変ではないかもしれませんが、AWS EC2のようなクラウド上のLinuxで同じことをやろうとすると少し手間がかかりますので手順を残しておきたいと思います。
環境
以下のような構成でEC2を立ち上げて、EC2上でWebスクレイピングを行います。Workspacesは仕事上の都合で開発環境として使っていますが、実はこれがEC2のGUIアプリを起動する際の肝となりますので後ほど説明します。
自分のMac book pro -> Amazon Workspaces -> EC2
- Ubuntu Server 18.04 LTS(EC2のOS)
- Python 3.6
EC2インスタンスの作成
最新のUbuntu Server 18のAMIからインスタンスを作成します。ストレージは20GBあればとりあえずは足ります。
EC2にSSH
Mac book proのWorkspacesアプリで開発環境にログイン後、ターミナルを開いて上記EC2インスタンスに接続します。以降、このSSHしたUbuntu Serverに必要なパッケージ等をインストールします。
ssh -A ubuntu@10.125.XX.XX
Python3のインストール
存在しない場合はインストールします。
sudo apt install python3 # インストール済みなら不要
python3 -V
pipのインストール
存在しない場合はインストールします。
sudo apt-get install libpython3.6-stdlib
sudo apt-get install python3-distutils
curl -kL https://bootstrap.pypa.io/get-pip.py | sudo python3
パッケージのインストール
スクレイピングに必要なパッケージをインストールします。スクレイピング構成に応じて必要なパッケージは変わると思いますので、不足しているパッケージがある場合は各自で追加する必要があります。
sudo pip install boto3
sudo pip install beautifulSoup4
sudo pip install selenium
xrdpのインストール
Ubuntu ServerにGUIでログインできるようにするため、リモートデスクトップを可能にするxrdpをインストールします。
sudo apt-get install libnss3-dev
sudo apt install libgconf2-4
sudo apt-get install -y libappindicator1 fonts-liberation libasound2 libnspr4 libnss3 libxss1 lsb-release xdg-utils
sudo apt-get update
sudo apt-get install lxde-core
sudo apt-get install xrdp
ログインの設定
リモートデスクトップするためにパスワードとx-session-managerの設定をします。
sudo passwd ubuntu
sudo update-alternatives --config x-session-manager
# 4 /usr/bin/startlxde 50 を選択
dockerのIPアドレスを変更
今の時点でこの設定をする必要はないですが、スクレイピングを動かしてIPアドレスがかぶった場合は変更する必要がありますので、一応載せておきます。
sudo systemctl stop docker
sudo ip link set dev docker0 down
sudo brctl delbr docker0
sudo vi /etc/docker/daemon.json
sudo systemctl start docker
daemon.jsonは以下ようになっているので、IPを被らないものに変更します。
{
"bip": "172.18.0.1/24"
}
Pythonのコードをデプロイ
sample01.pyの中身は以下の記事が参考になります。今回やろうとしていることは以下の記事でスクレイピングできなかったサイトを定期実行するということになります。
/home/ubuntu/
├ start_scraping.sh
├ start_scraping_total.sh
└ sample-project/
├ sample01/
├ sample01.py
└ bin/
└ chromedriver
start_scraping.shの中身はこんな感じです。sample01.pyを実行するだけのスクリプトです。
#!/bin/sh
echo "start"
cd sample-scraping
cd sample01
date
selected_stage=pro scraping_mode=normal user_password=???????? python3 sample01.py
date
echo "end"
freerdpのインストール、実行
Workspacesにリモートデスクトップのクライアントとして機能するfreerdpをインストールします。インストール後接続を行い、GUI画面が表示され、以下のようにWindowが3層構造になります。
sudo yum install freerdp
xfreerdp -u ubuntu -p ???????? 10.125.XXX.XXX
GUIありのchromeをインストール
firefoxをインストール後に以下をfirefoxでダウンロードするか、wgetコマンドで直接ダウンロードしても良いです。
- chrome Version 75.0.3770.100 (Official Build) (64-bit)
- chromedriver 2.37.544315
sudo apt-get install firefox
chrome、chromedriverをインストールします。chromedriverは上記のデプロイ先のbinディレクトリに配置します。
sudo dpkg -i ~/Downloads/google-chrome-stable_current_amd64.deb
unzip chromedriver_linux64.zip
cronに起動スクリプトを登録
Ubuntu Serverにはデスクトップ環境(GUI)に関連するパッケージをインストールしていないため、Workspacesのディスプレイ番号を使ってcronからGUIアプリ(chrome)を起動します。
freerdpでリモートデスクトップした状態で以下のコマンドを実行して、ディスプレイIDを取得します。Workspacesのディスプレイ番号は10.0のようです。
xdpyinfo |grep display
start_scraping.shがディスプレイ番号10.0で起動するようにcrontabコマンドで登録します。
crontab -e
登録内容は以下のような感じです。
0 15 * * * DISPLAY=:10 /home/ubuntu/start_scraping.sh 1> /home/ubuntu/start_scraping.log 2> /home/ubuntu/start_scraping.log
0 9 1,2 * * DISPLAY=:10 /home/ubuntu/start_scrapin_totalg.sh 1> /home/ubuntu/start_scraping_total.log 2> /home/ubuntu/start_scraping_total.log
Ubuntu Serverにデスクトップ環境(GUI)関連のパッケージをインストールすることでも実現可能だとは思いますが、今回はWorkspacesを使用することで少し簡素化して実装しました。
まとめ
AWS LambdaでWebスクレイピングできなかったサイトの自動化を無事達成することができました。AWS LambdaもしくはEC2を用いたこの手法で大体のスクレイピングは自動化できると思いますので、ぜひ試してみてください。